Unity3D: Основы использования скриптов для новичков: Синтаксис точки: взаимодействие компонентов

Взаимодействие за пределами скрипта

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

Синтаксис точки — это адрес

(Нажмите здесь), чтобы ознакомиться с основными понятиями, которые я приводил ранее.

Простота синтаксиса точки

Вы очень привыкли видеть адрес человека, записанный в формате требований почтовой службы. Скрипт Unity также имеет требуемый формат для обращения к переменным и функциям через другие компоненты, будь это скрипты, которые вы создаете, либо компоненты, предоставляемые средой разработки Unity.

Выше показано сравнение двух форматов. Когда вы видите или используете синтаксис точки, вы используете переменную или функцию, расположенную за пределами текущего скрипта.

Синтаксис точки в скрипте

  1. Вот один из трех скриптов, который вращает игровой объект с одним оборотом. Когда вращение завершено, скрипт позволяет другому игровому объекту сделать вращение, изменив значение переменной в скрипте другого игрового объекта.
  2. Вот список трех скриптов для трех различных игровых объектов: для «яйца», для капсулы и для цилиндра. Это всего лишь произвольные формы, которые я использовал просто ради шутки.

Как видите, большая часть этого небольшого скрипта использует «синтаксис точки» для чтения переменных, их изменения и для вызова функций. Три скрипта довольно схожи, но имеются несколько незначительных отличий, которые я хочу вам показать.

Я покажу вам, как использовать справочник по Unity, чтобы вы поняли от куда взят этот материал.

Видео-пример проекта

Это скриншот игровых объектов в действии в игровом окне. «Яйцо» находится в процессе вращения. У каждого игрового объекта наступает ход, затем процесс повторяется. Во время вращения каждый объект окружен ореолом света.

Если вы читаете этот урок через интернет, то нажмите на изображение, чтобы запустить видео. Если просматриваете как файл PDF, то нажмите на изображение, чтобы посмотреть видео в окне сервиса YouTube.

Скрипт «яйца» , строки 1 — 5

Я объясню каждую строку, для чего она используется и как работает.

Строка 1: устанавливаем управляющую переменную

Это скрытая переменная с именем spin. Она имеет тип boolean , который означает, что ее значение может быть true или false.

Переменная spin используется для проверки было ли «яйцу» разрешено вращаться. Когда значение true , то оно будет вращаться, когда значение false не будет.

Переменной spin назначается значение true , потому что «яйцо» будет первым игровым объектом, который вращается при нажатии Play.

Переменная имеет установку private , поэтому не будет отображаться в инспекторе. Вы можете убрать эту установку, если хотите запускать с флажком в инспекторе.

Строка 3: место для хранения следующего игрового объекта

Это скрытая переменная, которую я назвал otherObject. Она имеет тип GameObject, который означает, что ее значение — это имя другого игрового объекта.

Переменная otherObject используется для хранения следующего игрового объекта, который будет вращаться после того, как «яйцо» закончит вращение.

Переменная имеет установку private, поэтому она не будет отображена в инспекторе, так как я не хочу, чтобы ее значение можно было бы изменять там. В других двух скриптах эта переменная не имеет указания на private. Я объясню позже.

Строка 5: определяем следующий игровой объект для вращения

Переменной otherObject назначается игровой объект Capsule.

И вот это наше первое использование «синтаксиса точки»: GameObject.Find()

(Нажмите здесь) чтобы перейти на сайт Unity для просмотра этой функции.

GameObject.Find()

И какая же здесь у нас информация? Прежде всего, глядя на описание, мы видим, что это строка ищет игровой объект и возвращает его. Это именно то, что необходимо в строке 5 нашего скипта «TwirlEgg». Нам нужно определить игровой объект, который начнет вращаться после того, как «яйцо» закончит вращение.

Так почему функция Find() должна быть записана вместе с игровым объектом и точкой впереди?

Функция Find() не объявлена в скрипте «TwirlEgg» , поэтому мы должны обозначить ее с тем, чтобы использовать. Она объявляется автоматически где-то еще в коде Unity. Не забывайте, что «синтаксис точки» — это адресный формат, который оповещает нас о том, где расположена функция Find().

Хорошо, в документации сказано, что функция располагается в классе GameObject. Это то же самое, что сказать, что функция Find() объявляется в скрипте GameObject. А это скрипт? Я не знаю, и мне все равно. Все, что мне нужно знать, это класс (скрипт), в котором находится функция, и данный документ указывает мне эту информацию.

Ну и, конечно, от куда я точно знаю, что нужно начать искать в классе GameObject (скрипт) функцию Find()? А потому что дальше в скрипте TwirlEgg, в строке 23, мне нужно установить переменную в другой скрипт (компонент) другого игрового объекта. А это значит то, что я должен найти необходимую функцию в классе GameObject (скрипт).

Хорошо, тогда, откуда я знал, что нужно использовать функцию Find()? Прочитав список возможностей, доступных в классе GameObject (скрипт).

Переменные и функции класса GameObject, которые я могу использовать

(Нажмите здесь), чтобы перейти на страницу GameObject среды Unity. Примерно в середине вы увидите функции класса. Там находится Функция Find(), которая описывает мне то, что она делает. Все, что я сделал, — это перешел на эту веб-страницу и начал читать пока не нашел то, что мне нужно.

Как использовать функцию GameObject.Find()?

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

Затем идет имя функции Find(). Внутри круглых скобок мы напишем имя игрового объекта, который хотим найти. Игровой объект в данный момент — это Capsule.

Также обратите внимание, что имя имеет строковой тип, поэтому нам необходимо обозначить его двойными кавычками.

И, наконец, имеется двоеточие, следующее за игровым объектом. Вот так среда Unity определяет то, что функция возвратит коду, где была вызвана функция Find(). Вся суть в том, что вызывается функция GameObject.Find(), чтобы найти игровой объект Capsule и поместить его в переменную otherObject.

Дополнительная информация по GameObject.Find() в документации

Предлагается не помещать GameObject.Find() в функцию Update().

Далее показан пример. Вот именно так наш код и написан, кроме имени переменной и имени игрового объекта.

Скрипт «яйцо», строки 7-11, функция Update()

Функция Update(), то место, где происходит действие

Строка 7:

Код, расположенный в функции Update() выполняется автоматически средой Unity() каждый кадр, если для запуска нажата кнопка Play.

Строка 9:

Данный оператор If проверяет, имеет ли переменная spin значение true или false. Переменная была объявлена ранее в строке 1 со значением true, так что это означает то, что выражение If будет выполняться каждый кадр, снова и снова, пока переменная spin не будет равна false, что произойдет позже в строке 19.

Причина, по которой я объявил переменную spin со значением true в строке 1 в том, что один из трех игровых объектов должен повернуться первым. Я установил все три со значением false, поэтому ничего не произойдет при нажатии кнопки Play.

Переменная spin похожа на переключатель. Когда она включена (true), то «яйцо» вращается, когда отключена (false), то «яйцо» останавливается.

Строка 11:

Вот еще один оператор, использующий «синтаксис точки».

Строка 11: включаем компонент Light

(Нажмите здесь), чтобы посмотреть класс Light в среде Unity. Где-то наполовину пути вниз страницы находятся унаследованные переменные (Inherited Variables). Переменная enabled используется просто для того, чтобы разрешить или запретить весь компонент Light в скрипте TwirlEgg.

Флажок Light

Это флажок, который включается строкой 11. Во время проигрывания игр, когда «яйцо» вращается и останавливается, флажок будет то отмечен, то снят.

Скрипт «яйцо», строка 13, вращение

Вращение «яйца» при помощи функции Rotate()

И снова мы используем «синтаксис точки», на этот раз чтобы указать функцию, расположенную в классе Transform.

Нам нужно использовать «синтаксис точки», чтобы вызвать функцию Rotate(), потому что она не объявлена в скрипте TwirlEgg. Эта функция объявляется где-то еще в коде среды Unity.

Компонент Transform игрового объекта «яйцо»

У каждого игрового объекта есть компонент Transform. Он определяет, где находится игровой объект в сцене и как ориентирован. Таким образом, у нас есть доступ к функции Rotate() внутри «яйца». Нам всего лишь нужно вызвать эту функцию в компоненте Transform. Следовательно, функция Rotate() имеет transform и точку впереди этого слова для определения местонахождения функции должным образом.

  1. Показывает параметры для функции Rotate().
  2. Пример, отображающий то, как написать функцию. Этот пример очень приближен к тому, который я хотел использовать в строке 13, когда определял вращение вокруг оси Z на 60 градусов в секунду.

По сути, то, что означает запись Time.deltaTime — это «1 в секунду». Поэтому в строке 13 я умножаю время на 60, следовательно, указываю вращение 60 градусов / секунду. Таким образом, «яйцо» требует 6 секунд для того, чтобы сделать одно полный оборот на 360 градусов.

Скрипт «яйцо», строка 15, наблюдаем за вращением

Строка 15 отслеживает, насколько повернулось «яйцо»

Это оператор if, который проверяет, насколько процентов повернулось «яйцо».

Конечно, информация, которую нужно отслеживать, сохраняется в компоненте Transform. В виде eulerAngles (Углов Эйлера)?

Мне пришлось посмотреть об этом в Wikipedia. Там сказано: «Углы Эйлера — углы, описывающие поворот абсолютно твердого тела в трёхмерном евклидовом пространстве.» Ну, разве не замечательно? Ну да, я посмотрел некоторые примеры в документах Unity и полностью уверен, что, кажется, это то, что я хотел, поэтому я буду это использовать.

Переменная eulerAngles сохраняет углы вращения

  1. Как раз то, что мне нужно знать, градусы вращения вокруг оси z.
  2. Да, вот то, что я хочу сделать, читайте про угол (angle).
  3. Данный пример — не совсем то, что я пытаюсь сделать в операторе if, но, если значение может быть напечатано, тогда я также знаю, что могу проверить равно ли значение или больше 358.5 градусов.

Почему 358.5 , а не 360? Потому что 360 на самом деле является нулем, 359 было бы предпочтительнее проверить. Между тем, я заметил, что вращение не произошло в целых числах. Также есть некоторая дробная часть. Я уверен, что это из-за использования Time.deltaTime. Поэтому я взял число, которое почти равно 359 градусам. Это не критическая наука, поэтому число 358.5 вполне приближено, и этот подход работает.

Как только вращение достигает 358.5 градусов или выше, оператор if приобретает значение true и его код выполняется.

Скрипт «Яйцо», строки 17-23, остановка вращения

Теперь, когда «яйцо» сделало одно вращение, пришло время остановить его и приказать следующему игровому объекту вращаться.

Строки 17 и 19: Остановить вращение и отключить сияние

Строка 17:

Возвратимся к строке 9, когда переменная spin имела значение true. Это позволяло «яйцу» вращаться, а свет ореол был включен. Теперь переменной spin устанавливается значение false.

Строка 19:

Возвратимся к строке 11, когда свет ореола был включен. Теперь ему устанавливается значение false для того, чтобы отключить.

Строка 21:

Здесь мы возвращаемся к eulerAngles снова. Все это делается для того, чтобы удостовериться, что ось z переустановлена на начальную нулевую отметку градусов, перед тем как начнется вращение опять.

Сброс вращения на ноль

  1. Этот тот же документ, который ранее показывался, я обрезал его, чтобы показать только то, что мне нужно. Это пример установки конкретных углов для всех трех осей, x, y и z. Я проверяю, установлены ли они все на нулевую отметку, перед тем как начнется следующее вращение.
  2. Это предупреждение не устанавливается для конкретной оси. На самом деле, это то, что я сделал перед тем, как прочесть данный раздел. Я хорошо поработал, но, в любом случае, я изменил код на предпочтительный метод, сейчас отображаемый в строке 21.

Строка 23: указание следующему игровому объекту начать вращение

Довольно много происходит в этой одной строке кода.

  1. Цель состоит в том, чтобы назначить значение true
  2. переменной spin,
  3. которая находится в скрипте TwirlCapsule,
  4. расположенный в игровом объекте Capsule (см. строку 5).

Здесь снова используется «синтаксис точки» , чтобы указать переменную в другом скрипте другого игрового объекта, затем назначить ей значение.

Переменная spin в скрипте TwirlCapsule

Это переменная spin, которой назначается значение true. Этот скрипт очень похож на скрипт TwirlEgg, который мы изучали, и должен проделать точно то же.

Возвращаемся к скрипту TwirlEgg

  1. Первое, что мы должны были сделать в соответствии с адресом «синтаксиса точки» — это указать игровой объект. Эта переменная, otherObject,
  2. содержится в игровом объекте с именем Capsule.

Это означает то, что где бы переменная otherObject не применялось в данном скрипте, ее сохраненное значение Capsule также используется.

  1. Далее, согласно «синтаксиса точки», адрес — это компонент, который находится в Capsule, который является скриптом TwirlCapsule.

(Нажмите здесь), чтобы просмотреть информацию о GetComponent в среде Unity.

  1. Вот пример, который более приближен к тому, что делает строка 23. В данном примере скрипт просто получается и назначается переменной с именем other.
    Строка 23 не назначает скрипт переменной.
  2. GetComponent (TwirlCapsule) — это функция, которая возвращает компонент, который, в нашем случае, скрипт TwirlCapsule. Это означает то, что вместо назначения его переменной, мы просто используем компонент, возвращенный из функции GetComponent() напрямую в качестве части адреса «синтаксиса точки», используем прямую подстановку вместо того, чтобы проделывать процесс его назначения переменной, и затем использования переменной. Нет никакого смысла в создании дополнтельных шагов.

Источник: https://bim.wikispaces.com/file/view/UnityScript_Basics_for_Noobs.pdf

Смотрите также:

Unity3D: Основы использования скриптов для новичков: Преимущественно для новичков


Unity3D: Основы использования скриптов для новичков: Преимущественно для новичков


Unity3D: Основы использования скриптов для новичков: Подробнее о переменных


Unity3D: Основы использования скриптов для новичков: Подробнее о функциях


Unity3D: Основы использования скриптов для новичков: Решения, решения, всегда приходится принимать решения


Unity3D: Основы использования скриптов для новичков: Назначение при помощи инспектора

Комментировать

Почта не публикуется.Обязательные поля отмечены *