Сохраните ссылку!
Если это действительно «сборная», это означает, что вы используете ее как актив и инстанцируете ее во время выполнения, лучшим способом (в моих глазах и с точки зрения производительности) было бы использовать сериализованное поле:
// Put this component on your obstacle
public class ObjectController : MonoBehaviour
{
// Drag the according object here via the Inspector in the prefab
// => when the prefab is Instantiated this field is already referenced
[SerializeField] private GameObject _scoreZone;
// Read-only access to the reference
public GameObject ScoreZone => _scoreZone;
}
Эта ссылка на поле хранится вместе с вашим сборным активом. Таким образом, каждый экземпляр префаба уже имеет собственные дочерние ссылки.
, а затем
private void OnCollisionEnter2D(Collision2D collision)
{
// Rather use CompareTag which is slightly more efficient
// and adds some security (== silently fails if typo, CompareTag throws an exception instead)
if (collision.gameObject.CompareTag("obstacle"))
{
var controller = collision.gameObject.GetComponent<ObjectController>();
if(controller)
{
Destroy(controller.ScoreZone);
}
}
}
По индексу
В качестве альтернативы, но ошибка prone вы можете просто использовать index. Вы уже знаете, что есть только 2 дочерних элемента, первый из которых - Scorezone с индексом 0
, поэтому вы также можете сделать
if (collision.gameObject.CompareTag("obstacle"))
{
var scoreZone = collision.transform.parent.GetChild(0);
Destroy(scoreZone);
}
По имени
Используя имя, которое вы также можно использовать Find
- я бы не рекомендовал это! Это подвержено ошибкам и медленно
if (collision.gameObject.CompareTag("obstacle"))
{
var scoreZone = collision.transform.parent.Find("ScoreZone");
Destroy(scoreZone);
}