Я очень новичок в С# и Unity, и у меня есть вопрос. Я не могу понять, как работает OnCollisionEnter в принципе.
Например, если у меня есть местность и парящая над ней сфера, которая имеет компонент твердого тела, и я пишу: -
void OnCollisionEnter(Collision other)
{
Debug.Log(other.gameObject.name);
}
а потом запустить код у нас на экране консоли получится "Сфера", а не "Местность". Почему Sphere передается «другому», а не Terrain?
Во-вторых, я считаю, что OnCollisionEnter является частью класса MonoBehavior и наш класс уже наследует его от MonoBehavior.
Тогда зачем нам снова определять OnCollisionEnter()?
Эти вопросы действительно съедают мою голову. Буду очень признателен, если кто-нибудь сможет мне помочь.
Как это работает: "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 everyMonoBehaviour
in this game object.
И в чем разница между сообщением и функцией в С#?
@Rohan на самом деле это не специфичная для C# вещь, а скорее нечто, «изобретенное» Unity. В С# не существует чего-то, что называется Message... только методы (кстати, тоже не функция). Как только вы реализуете один из них, они становятся методами. Различие заключается в том, как они вызываются как. Я, честно говоря, не знаю точных деталей, но на самом деле Unity использует Отражение, чтобы определить, какие из «сообщений» MonoBehaviour реализует ваш класс, и вызывает их, если они есть.
Не могли бы вы объяснить мне немного больше о том, что на самом деле является «сообщением» в С#? Извините, что беспокою вас.