@Korsakovlev

Как по компоненту определить GameObject?

Код:

Collider2D[] Player = Physics2D.OverlapCircleAll(attackPos.position, attackRange, player);
        for (int i = 0; i < Player.Length; i++)
            Player[i].GetComponent<Player>().TakeDamage(damage);

Все работает, но постоянные сообщения в консоль с ошибкой меня раздражают:

NullReferenceException: Object reference not set to an instance of an object
Enemy.OnAttack () (at Assets/Scripts/Live_Objects/Enemy.cs:138)

Я понял, что она происходит из-за того, что Player[i] - коллайдер, а GetComponent можно применить только с Gameobject, но каким-то образом у меня все работает.
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
@romazhan
Для того, чтобы получить объект `GameObject`, ассоциированный с коллайдером, вы можете использовать свойство `gameObject` класса `Collider2D`:
Collider2D[] Player = Physics2D.OverlapCircleAll(attackPos.position, attackRange, player);
for (int i = 0; i < Player.Length; i++)
{
  GameObject playerObject = Player[i].gameObject;
  playerObject.GetComponent<SomeComponent>().TakeDamage(damage);
}

В данном случае вы также должны указать тип компонента, который вы хотите получить, так как функция `GetComponent` возвращает объект типа `Component` В данном случае это может быть, например, компонент `SomeComponent`, который содержит функцию `TakeDamage`.

Почему ваш код работает, хотя вы не указываете тип компонента? Вероятно, у вас в проекте есть класс, наследуемый от `MonoBehaviour`, с именем "SomeComponent", который содержит функцию `TakeDamage`. В таком случае функция `GetComponent` вернет экземпляр этого класса, и вы сможете вызвать функцию `TakeDamage`. Однако это не является наиболее рекомендуемым способом написания кода, так как такой подход не обеспечивает типизацию и может привести к ошибкам в рантайме. Лучше явно указывать тип компонента, чтобы избежать подобных ошибок.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы