Как работает функция OnCollisionEnter «Фундаментально»?

Я очень новичок в С# и Unity, и у меня есть вопрос. Я не могу понять, как работает OnCollisionEnter в принципе.

Например, если у меня есть местность и парящая над ней сфера, которая имеет компонент твердого тела, и я пишу: -

void OnCollisionEnter(Collision other)
{
    Debug.Log(other.gameObject.name);
}

а потом запустить код у нас на экране консоли получится "Сфера", а не "Местность". Почему Sphere передается «другому», а не Terrain?

Во-вторых, я считаю, что OnCollisionEnter является частью класса MonoBehavior и наш класс уже наследует его от MonoBehavior.

Тогда зачем нам снова определять OnCollisionEnter()?

Эти вопросы действительно съедают мою голову. Буду очень признателен, если кто-нибудь сможет мне помочь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
307
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как это работает: "OnCollisionEnter вызывается, когда этот коллайдер/твердое тело начинает касаться другого твердого тела/коллайдера" - https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html OnCollisionEnter входит в число других функций (обновление, фиксированное обновление, запуск, пробуждение и т. д.), если они определены в теле производного класса MonoBehavior, вызываемого самим движком, т. е. это функции событий движка.

Почему срабатывает на Сфере: Поскольку у вас есть метод в классе, прикрепленном к объекту сферы, см. выше, как работает OnCollisionEnter.

Ответ принят как подходящий

Why is Sphere being passed to "other" and not Terrain?

то, что передается в other, зависит от того, к какому объекту вы прикрепили этот компонент ... если вы прикрепите его к Terrain, то в other вы должны получить Sphere и наоборот. Итак, вы видите, что имя other на самом деле имеет смысл, верно?

Then, why do we have to define OnCollisionEnter() again?

в MonoBehaviour вы можете найти OnCollisionEnter среди всех других, таких как Awake, Update, Start и т. д., в разделе "Сообщения", а не в разделе «частный/общедоступный/какой-либо Методы».

Вкратце: сообщения внутри вызываются только процессом Unity если имеется в компоненте и вообще не вызываются, если отсутствуют.

Я думаю, что они используют что-то похожее на Component.SendMessage в фоновом режиме, но не уверен.

Calls the method named methodName on every MonoBehaviour in this game object.

Не могли бы вы объяснить мне немного больше о том, что на самом деле является «сообщением» в С#? Извините, что беспокою вас.

Rohan 12.06.2019 07:42

И в чем разница между сообщением и функцией в С#?

Rohan 12.06.2019 07:50

@Rohan на самом деле это не специфичная для C# вещь, а скорее нечто, «изобретенное» Unity. В С# не существует чего-то, что называется Message... только методы (кстати, тоже не функция). Как только вы реализуете один из них, они становятся методами. Различие заключается в том, как они вызываются как. Я, честно говоря, не знаю точных деталей, но на самом деле Unity использует Отражение, чтобы определить, какие из «сообщений» MonoBehaviour реализует ваш класс, и вызывает их, если они есть.

derHugo 12.06.2019 12:43

Другие вопросы по теме