Единство - путаница в типах и экземплярах компонентов - PullRequest
1 голос
/ 17 июня 2020

У меня здесь конкретный c вопрос, но за ним я не понимаю типы данных и то, что на самом деле представляют собой имена, теги и типы компонентов Unity.

Особый c вопрос таков: I хотите ( во время выполнения, НЕ через редактор ), чтобы иметь возможность создавать компоненты, которые могут обнаруживать коллизии и передавать информацию об обнаружении другим компонентам. Компоненты довольно простые - (невидимые) кубики разных размеров с прикрепленными Colliders и isTrigger установленными в каждом случае. Затем при обнаружении столкновения (OnTriggerEntry(), OnTriggerExit()) для передачи информации о столкновении другим компонентам, например: «Привет, X только что столкнулся с номером 6».

Изначально я хотел иметь возможность перехватить эти вызывает предположение, что это были события - но кажется, что это не события (я полагаю, MonoBehaviour отменяет). Читая в другом месте, кажется, что единственный способ сделать это - динамически прикрепить скрипт (класс C#) после создания компонента.

Поскольку этих компонентов будет несколько, все с тем же прикрепленным скриптом (классом) мне затем нужно установить некоторые внутренние переменные класса, чтобы сообщить ему, что делать / с кем связываться при столкновении. Вот здесь и начинается путаница.

Мне кажется, что дизайнеры / разработчики Unity, пытаясь не обременять людей слишком большим количеством кода, склонны замалчивать такие детали или, по крайней мере, пытаться их объяснить. непрограммным способом. Понятно, но очень сбивает с толку кого-то вроде меня, мыслящего терминами программного обеспечения.

Класс в скрипте, который я прикрепляю, будет иметь имя (например, 'MyCollisionHandler'), но это не экземпляр класса, это просто определение класса - или тип, если вы предпочитаете, например, 'class MyCollisionHandler { ...'. Однако это должен быть случай (если он не содержит только статические c переменные и функции), который когда-то был прикреплен к компоненту, что существует его экземпляр.

Итак, проще говоря - как сделать Я получаю ссылку на указанный c экземпляр общего типа класса, который прикреплен к указанному c объекту обнаружения столкновений? Как только я получу это, я могу использовать методы, чтобы настроить его так, как мне нравится. Если я использую FindObjectOfType<MyCollisionHandler>(), это не поможет, потому что их может быть множество, и он вернет только первый найденный. Хорошо, я могу использовать вместо этого FindObjectsOfType<MyCollisionHandler>() и получить их массив - но какой именно?

Итак, это возвращается к моему общему непониманию структуры Unity - разнице между именами компонентов, тегами и т. Д. c - и как они соотносятся с определениями классов и экземплярами. В общем - как добраться до отдельных экземпляров объектов класса, прикрепленных к игровым объектам?

1 Ответ

2 голосов
/ 17 июня 2020

Класс в скрипте, который я прикрепляю, будет иметь имя (например, «MyCollisionHandler»), но это не экземпляр класса.

Это так, и экземпляр возвращается с помощью GameObject.AddComponent.

MyCollisionHandler handler = gameObject.AddComponent<MyCollisionHandler>();
handler.someValue = 42;

Позже вы можете получить экземпляр с помощью GameObject.GetComponent, как и для любого другого компонента. Вы могли бы использовать FindObjectOfType и FindObjectsOfType, если у вас нет ссылки на игровой объект, к которому прикреплен скрипт / компонент, или вам все равно, к какому игровому объекту прикреплен этот скрипт / компонент, и вам просто нужен один / все из них.

...