- PVSM.RU - https://www.pvsm.ru -

Unity3d. Уроки от Unity 3D Student (B04-B08)

Добрый день.

Предыдущие уроки вы можете найти в соответствующем топике. [1]

Теперь в каждом посте в скобках (в конце) будут указываться номера уроков. Буква в начале номера обозначает раздел (B-Beginner, I — Intermediate).

PS: Если вы не проходили предыдущие уроки, очень рекомендую их пройти, т.к. последующие изредка на них ссылаются.

Базовый Урок 04 — Уничтожение объектов


В уроке рассказывается как удалять объекты со сцены, использую команду Destroy (уничтожить).

Создайте пустую сцену и добавьте в нее сферу (GameObject->Create Other->Sphere) и куб (GameObject->Create Other->Cube). Куб назовем “Box”. Расположите объекты как показано на рисунке ниже.
B0400

Добавьте C#-Скрипт (Project View->Create->C# Script) и назовите его Destroyer. Как уже говорилось, при создании C#-скрипта Unity создает некий каркас, состоящий из подключенных библиотек и основного класса (используемого скриптом) с методами Start() и Update(). В Базовом Уроке 02 (основы ввода) [2] использовался метод Update(), который вызывается каждый кадр. В данном случае мы воспользуемся методом Start(), который выполняется сразу после загрузки сцены. Добавим в тело метода Start() функцию Destroy() и передадим в нее gameObject, указав таким образом, что скрипт должен уничтожить объект, компонентом которого он является:

// метод Start() выполняется единожды, сразу после окончания загрузки сцены
Start() {
  // уничтожить объект к которому прикреплен данный скрипт
  Destroy(gameObject);
}

Добавим скрипт к сфере. Сделать это можно несколькими путями. Перетащив скрипт из Project View на сферу в Scene View.
B0401

Или на имя объекта в Hierarchy.
B0402

Так же можно выбрать сферу и добавить скрипт через меню компонентов (Component->Scripts->Destroyer) или просто перетащив скрипт в Inspector View выбранного объекта.
B0404

Снова выберите сферу и убедитесь, что среди компонентов присутствует ваш скрипт.
B0403

Нажмите на Play и вы увидите, что сразу после загрузки сцены сфера исчезает.
B0404_1

Давайте теперь попробуем уничтожить другой объект. Для этого нам понадобится статический метод Find [3] класса GameObject. Заменим код в методе Start() следующим:

// ищем объект с именем Box и если таковой есть – уничтожаем его
Destroy(GameObject.Find(“Box”));

Примечание от автора перевода: Обратите внимание, что во втором случае мы передаем значение, вызывая статическую функцию, поэтому пишем имя класса (GameObject — с большой буквы), в то время как в первом мы передаем объект этого класса (gameObject — с маленькой буквы). В противном случае компилятор выдаст ошибку:

error CS0176: Static member `UnityEngine.GameObject.Find(string)' cannot be accessed with an instance reference, qualify it with a type name instead

что переводится как:
“статический член UnityEngine.GameObject.Find(string) не может быть доступен по ссылки экземпляра (класса), вместо этого определите (вызовите) его с именем типа.”

Сохраним изменения в коде скрипта. Скрипт не требуется убирать со сферы и добавлять к нашему кубу, т.к. назависимо от того, к какому объекту он теперь прикреплен, скрипт будет искать любой объект (на сцене) с именем Box. Нажмем Play и увидим как теперь сфера остается в сцене, а куб пропадает.
B0405

Что делать, если нам требуется уничтожить объект не сразу, а спустя какое-то время? Это можно сделать передав значение во 2ой параметр функции Destroy:


// Теперь уничтожаем Box спустя 3и секудны после загрузки сцены
Destroy(GameObject.Find(“Box”),  3);

Нажмите Play и убедитесь, что куб изчезает через 3и секунды после того, как сцена целиком загрузится.

Ссылка на оригинальный урок [4]

Дополнительные материалы:

Справка по функции Destroy() из официального справочника о скриптах Unity3d [5]

Базовый Урок 05 — Реализация создание объектов


В уроке рассказывается как создавать объекты в сцене в реальном времени (runtime), используя префабы и команду Instantiate (инстанциирование)

Если вы хотите добавлять объекты на сцену, когда сцена уже загружена, то вам требуется использовать скрипты, а точнее команду Instantiate().

Загрузите сцену из Базового урока 03 (Префабы) [6] или создайте такую же новую. В нашей сцене присутствует префаб BouncyBox.
B0500

Нажмите Play и убедитесь, что куб по-прежнему падает и отталкивается от поверхностей.
Теперь удалите со сцены экземпляр BouncyBox.
B0501

После этого добавьте пустой объект (напоминаю, GameObject->Create Empty или Ctrl + Shift + N в Windows, Cmd + Shift + N в MacOS). Расположите его примерно в том месте, где раньше был экземпляр BouncyBox.
B0502_1

Создадим C#-Скрипт и назовем его Creater. Начнем редактирование скрипта. Заведем открытую (public) переменную типа GameObject и назовем ее thePrefab. Модификатор public требуется указывать, если, например, вы хотите передавать значение переменной через Inspector View. После чего в теле функции Start() создадим еще один GameObject (с именем instance) и проинициализируем его значением с помощью статической функции Instantiate().


public GameObject thePrefab; 
  
void Start () {
  GameObject instance = new GameObject();
  instance = Instantiate(thePrefab, 
                         transform.position, 
                         transform.rotation) as GameObject; 
}

Рассмотрим метод Instantiate() подробнее.


Instantiate(GameObject original, Vector3 position, Quaternion rotation)

Метод клонирует объект original с заданными вектором положения (position) и кватернионом поворота (rotation).
Тип Vector3 [7] является обычным 3х компонентым вектором (аналогично вектору из R3).
Тип Quaternion [8]кватернион [9], задающий поворот объекта.

Добавьте скрипт к пустому объекту (c именем GameObject).Напоминаю, поскольку thePrefab объявлен с модификатором public, вы можете задавать его начальное значение прямо в Inspector View (у соответствующего компонента, то есть в нашем случае это Creator у GameObject'а). Перетащите наш префаб в место указания значения (или выберете его из списка, кликнув на кружок справа).
B0503

Нажмем Play и увидим, что на сцене появился наш прыгающий кубик.
B0504

Но наш кубик прыгает просто вверх и вниз, потому что не имеет начального угла поворота. Выберите GameObject и поверните его под небольшим углом.

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

Cсылка на оригинальный урок [10]

Дополнительные материалы:

Описание функции instantiate() из официального справочника о скриптах Unity3d [11]

Описание класса Transform из официального справочника о скриптах Unity3d [12]

Базовый Урок 06 — Простой таймер


В данном уроке рассказывается как в Unit при помощи скриптов
создавать простой таймер, используя Time.deltaTime и переменную типа float.

Воспользуемся сценой из предыдущего урока (с пустым игровым объектом,
генерирующим экземпляры префаба, т.е. BouncyBox).
B0600

Создадим С#-скрипт и назовем его Timer. Добавим переменную myTimer, и напишем следующий код.


public float myTimer = 5.0f;

void Update() {
  //Time.delaTime - время (сек), которое требовалось для отрисовки   последнего кадра (read only)
  myTimer -= Time.deltaTime;  
  if (myTimer <= 0.0f) {
    Debug.Log("GAME OVER");
  }
}

Сохраняем скрипт и переключаемся назад в Unity. Добавим скрипт к объекту GameObject.
B0601

Напомню, т.к. myTimer объявлена открытой (public), то в Inspector View вы можете менять ее начальное значение.

Жмем Play. Как только значение myTimer упадет до нуля, в статус баре вы увидите строку GAME OVER. Значение переменной myTimer будет продолжать опускаться (это можно увидеть в Inspector View).
B0602

Для того, чтобы переменная myTimer не опускалась ниже нуля, добавим еще одно ветвление в функцию Update(), в итоге мы получаем следующий код:


void Update () {
  if(myTimer > 0){
    myTimer -= Time.deltaTime;
  }else if(myTimer <= 0){
    Debug.Log("GAME OVER");
  }
}

Нажмем Play и проследим за поведением переменной myTimer. Когда ее значение будет достаточно близким к нулю, то оно перестанет изменяться.
B0603

Ссылка на оригинальный урок [13]

Дополнительные материалы:

Информация о Time.deltaTime из официального руководства о скриптах Unity3d [14]

Базовый Урок 07 — Основы движения


В уроке рассказывается, как двигать объекты c помощью функции transform.Translate.

Создадим сцену с кубом, камерой и источником света.
B0700

Создадим новый C#-скрипт и назовем его Move.
Поскольку движение должно быть непрерывно во времени, то основной код будет располагаться в методе Update(). Вызовем функцию Translate, объекта transform и передадим ей в качестве параметра Vector3(0, 0, 1). Получим следующий код:


void Update () {
  transform.Translate(new Vector3(0.0f, 0.0f, 1.0f)); // задаем движение объекту вдоль оси Oz
}

Разберемся подробнее в коде. Тут transform — это объект класса Transform [15], привязанный к нашему объекту. Метод Translate() двигает объект вдоль вектора на расстояние равное его длине (параллельный перенос).

Сохраним наш скрипт и добавим его к нашему кубу. Нажмите Play и увидите как куб стремительно улетает вдоль оси Oz.

B0701

Давайте уменьшим скорость движения, например, умножив наш вектор на Time.deltaTime, то есть:


transform.Translate(new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime);

Нажмите Play и убедитесь, что куб начинает двигаться заметно медленнее.

Можно сделать наш скрипт более удобным в использовании, если скорость задать не фиксированным вектором, а через переменную. Заведем public переменную типа float и назовем ее speed. С помощью этой переменной можно будет задавать начальную скорость через Inspector View (по умолчанию она будет равна 5.0f):


public float speed = 5.0f;
void Update () {
  transform.Translate(new Vector3(0.0f, 0.0f, speed) * Time.deltaTime);
}

Сохраним скрипт и убедимся, что в Inspector View у компонента Move появилась переменная Speed.
B0702

Посмотрите, как будет меняться скорость движения нашего объекта в соответствии с заданным начальным значением этой переменной. Например, при Speed = 3 скорость объекта не очень быстрая, но и не медленная.

Примечение: Для выражения Vector3(0.0f, 0.0f, 1.0f) существует короткая (но видимо чуть более медленная, если не прав, прошу поправить) запись Vector3.forward.

Кусок кода из обертки:


public static Vector3 forward
  {
    get
    {
      return new Vector3(0.0f, 0.0f, 1.0f);
    }
  }

Ссылка на оригинальный урок [16]

Дополнительные материалы:

Информация о методе transform.Translate из официального справочника о скриптах Unity3d [17]

Информация Time.deltaTime из официального справочника о скриптах Unity3d [14]

Базовый Урок 08 — Основы движения с помощью силы.


В уроке рассказывается как c помощью приложения силы двигать физическое тело (Rigidbody).

Если у вас на сцене есть объект с компонентом Rigidbody, то нужно задавать ему движение с помощью приложения силы (передав таким образом все расчеты движения физическому движку игры [18]). В противном случае вы можете начать конфликтовать с физикой объекта. Мы по-прежнему используем сцену из Базового урока 03 [6].

B0800

Создадим C#-скрипт и назовем его Force. В методе Start() вызовем метод AddForce() компонента rigidbody (cвязанного с нашим объектом) и передадим ему вектор приложенной силы Vector3(0.0f, 0.0f, power). В классе заведем переменную типа float с именем power и значением, по умолчанию равным 500.0f:


public float power = 500.0f;
void Start () {
  rigidbody.AddForce(new Vector3(0.0f, 0.0f, power));
}

Сохраним скрипт и добавим его к нашему объекту (или префабу). Теперь, если нажать Play, вы увидите как куб падает не вниз а под углом, из-за воздействия силы приложенной вдоль оси Oz.
B0801

Ссылка на оригинальный урок [19]

Дополнительные материалы:

Информация о классе Rigidbody из официального справочника по скриптам Unity3d [20]

Информация о методе AddForce из официального справочника по скриптам Unity3d [21]

PS: Всем хороших и плодотворных выходных

Автор: DisaDisa


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/perevod/6545

Ссылки в тексте:

[1] соответствующем топике.: http://habrahabr.ru/post/141362/

[2] Базовом Уроке 02 (основы ввода): http://habrahabr.ru/post/141362/#b02

[3] Find: http://unity3d.com/support/documentation/ScriptReference/GameObject.Find.html

[4] Ссылка на оригинальный урок: http://www.unity3dstudent.com/2010/07/beginner-b04-destroying-objects/

[5] Справка по функции Destroy() из официального справочника о скриптах Unity3d: http://unity3d.com/support/documentation/ScriptReference/Object.Destroy.html

[6] Базового урока 03 (Префабы): http://habrahabr.ru/post/141362/#b03

[7] Vector3: http://unity3d.com/support/documentation/ScriptReference/Vector3

[8] Quaternion: http://unity3d.com/support/documentation/ScriptReference/Quaternion

[9] кватернион: http://wat.gamedev.ru/articles/quaternions

[10] Cсылка на оригинальный урок: http://www.unity3dstudent.com/2010/07/beginner-b05-instantiate-to-create-objects/

[11] Описание функции instantiate() из официального справочника о скриптах Unity3d: http://unity3d.com/support/documentation/ScriptReference/Object.Instantiate.html

[12] Описание класса Transform из официального справочника о скриптах Unity3d: http://unity3d.com/support/documentation/ScriptReference/Transform.html

[13] Ссылка на оригинальный урок: http://www.unity3dstudent.com/2010/07/beginner-b06-simple-timer/

[14] Информация о Time.deltaTime из официального руководства о скриптах Unity3d: http://unity3d.com/support/documentation/ScriptReference/Time-deltaTime.html

[15] Transform: http://Transform(http://unity3d.com/support/documentation/ScriptReference/Transform.html

[16] Ссылка на оригинальный урок : http://www.unity3dstudent.com/2010/07/beginner-b07-basic-translate-movement/

[17] Информация о методе transform.Translate из официального справочника о скриптах Unity3d: http://unity3d.com/support/documentation/ScriptReference/Transform.Translate.html

[18] физическому движку игры: http://www.nvidia.ru/object/physx_new_ru.html

[19] Ссылка на оригинальный урок: http://www.unity3dstudent.com/2010/07/beginner-b08-basic-force-movement/

[20] Информация о классе Rigidbody из официального справочника по скриптам Unity3d: http://unity3d.com/support/documentation/ScriptReference/Rigidbody.html

[21] Информация о методе AddForce из официального справочника по скриптам Unity3d: http://unity3d.com/support/documentation/ScriptReference/Rigidbody.AddForce.html