Вопрос по поводу инициализации игрового объекта в Unity - PullRequest
1 голос
/ 27 марта 2020

Я сейчас изучаю unity3d и c# со знанием c ++ и c. Тем не менее, я запутался с этой строкой кода.

private Gameobject cubePrelab;

Это простая строка кода, которая «определяет объект, который мы хотим порождать» в соответствии с лектором. Затем он немедленно делает такие вещи, как:

Instantiate(cubePreLab, ...,...)

, который клонирует объект в соответствии с документацией онлайн. Я запутался в первой строке кода, которая выглядит так, как будто мы просто определяем объект, фактически не инициализируя его. Однако в результате использования этих двух строк кода мы можем создать окно на экране, но я запутался, почему это поле, а не, может быть, переход.

1 Ответ

2 голосов
/ 27 марта 2020

Предлагаю вам прочитать о Сборные Unity

Поскольку вы новичок в Unity, я предполагаю, что вы начали с того, что поставили несколько объектов - например, куб - в вашу сцену правильно? Редактор Unity позволяет легко помещать объекты на сцену во время разработки игры, но что, если вы хотите динамически добавлять объекты на сцену во время игры?

Например, представьте, что вы создали сцену с пушкой, и каждый раз, когда игрок нажимает клавишу пробела, вы хотите запустить пушечное ядро. Когда вы создаете свою сцену в редакторе Unity, вы помещаете свою пушку в свою сцену, но как вы добавляете пушечные ядра во время игры?

У вас может быть набор кода, который создает пушечное ядро ​​из царапайте каждый раз, когда вы запускаете один, но это очень трудоемкий и подверженный ошибкам способ сделать это. Это то место, где появляются префабы. Сборные - это как план объекта, который вы собираетесь добавить в свою сцену позже. Таким образом, префаб пушечного ядра будет объектом, который вы создаете в редакторе Unity, точно так же, как любой другой объект Unity, который вы добавляете в свою сцену. Вы можете назначить его размер, материал, цвет, силу атаки и т. Д. С помощью редактора Unity (код не требуется).

Сначала вы должны создать префаб в редакторе Unity для своего пушечного ядра.

После создания префаба для пушечного ядра вы добавите свойство в свой класс Cannon, например public GameObject cannonballPrefab, и перетащите свой префаб для пушечного ядра из редактора Unity в свойство «Сборный пушечный ядр» компонент Cannonball на объекте пушки в Unity Inspector. Так что, если вы посмотрите только на код C#, похоже, что поле cannonballPrefab никогда не инициализируется. Однако вы инициализируете его, перетаскивая в него префаб в редакторе Unity. Чтобы сослаться на ваш первоначальный вопрос, это также, как Unity знает, как создать прямоугольник, а не треугольник в вашем примере. Unity создаст экземпляр любого вашего префаба.

Затем в вашем коде Cannon вы можете создать экземпляр экземпляра вашего cannonballPrefab, пока вы играете игра каждый раз, когда вы хотите добавить пушечное ядро ​​в вашу сцену.

Теперь, когда вы звоните Instantiate(cannonballPrefab... Unity добавляет экземпляр вашей пушечного ядра в вашу сцену. Тогда вы, вероятно, сделаете некоторую дополнительную инициализацию, назначив ей начальную позицию, начальную скорость, начальное направление и т. Д.

Также, как сказал Pac0, учебник, вероятно, имеет public GameObject cubePrefab (не private), чтобы вы могли перетащить ссылку в нее из редактора Unity. В качестве альтернативы вы можете оставить его закрытым и добавить к нему атрибут [SerializeField], как показано ниже. Unity не позволит вам присвоить поле private из редактора, если в нем нет атрибута [SerializeField].

[SerializeField]
private GameObject cubePrefab;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...