Unity3d. Уроки от Unity 3D Student (B13-B16)

в 17:18, , рубрики: 3d graphics, game development, game engine, Gamedev, unity3d, unity3dstudent, Анимация и 3D графика, перевод, переводы, уроки, метки: , , , , , , ,

Предыдущие уроки вы можете найти по следующим ссылкам:
Уроки B01-B03
Уроки B04-B08
Уроки B09-B12

PS: Так же исправленны некоторые ошибки в предыдущих уроках, большое спасибо хабравчанинам ufomesh и MikhailS.

Базовый Урок 13 — Определение столкновений с триггером


В уроке рассказывается, как определить столкновения между невидимыми для игрока объектами, используя неосязаемые «триггер коллайдеры» (trigger colliders).

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

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

На нашей сцене имеется куб («box» с rigidbody), который падает на синюю платформу («platform»).
b1300
b1301

Естественно платформа останавливает куб, поскольку среди ее компонентов присутствует box collider.
b1302

У компонента box collider есть чекбокc Is Trigger. Если включить
его и запустить сцену снова, то куб провалиться через платформу.
b1303

Таким образом мы можем создавать столкновения, которые не должны быть видны пользователю. Например, отключим компонент Mesh Renderer у нашей платформы. Мы по прежнему видем зеленый контур объекта, если выделим его в Hierarchy View.
b1304

Если мы нажмем play, то куб провалиться через нивидимую платформу, но пока мы не можем ничего узнать о произошедшем.
b1305

Создадим скрипт, назовем его Trigger и добавим в тело класса следующий код

// Обнаруживаем столновение с триггером 
// myTrigger - коллайдер, который столкнулся
void OnTriggerEnter(Collider myTrigger) 
{
  if (myTrigger.gameObject.name == "box")
  {
    Debug.Log("Box went through!");
  }
}

Добавим скрипт к платформе. Теперь, как тольку куб пройдет сквозь платформу, вы увидете сообщение «Box went through!» в консоли.

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

Базовый Урок 14 — GUI текст и счетчики


В уроке рассказывается, как отобразить информацию о счетчике на экран используя компонент GUI Text

Чтобы отображать текстовую информацию на экран воспользуемся элементом GUI Text.
Добавим его на сцену — Game Object->Create Other->GUI Text.
b1400

Так же, обратите внимание, чтоб у камеры был включен компонент GUILayer.
b1401

Текст можно редактировать напрямую через редактор (поле Text).
b1402

Но мы воспользуемся скриптом для этого. Добавим скрипт (GUITextExample). Код будем писать в метод Update():

Немного о GUI Text

GUI Text это компонент gameObject'а, поэтому с самим объектом вы можете обращаться как с обычным gameObject'ом.Компонент расположен в Component->Rendering->GUIText. Т.е. создавая GameObject->Create Other->GUI Text, вы создаете Empty GameObject с соответствующим компонентом.
  guiText.text = "Hey What's Up?";

Если зайти в стравку о параметре guiText.text, то увидите следующие:
var text: String
Description
The text to display.

То есть, при передачи параметра мы должны быть уверены что передаем string.

Теперь если запустить игру, то текст поменяется.
b1403

Попробуем отобразить счетчик. В класс добавим переменную-счетчик (Counter) и немного подправим код в методе Update().

private int Counter = 0;
  
  void Update () 
  { 
    ++Counter;
    guiText.text = Counter;
  }

В итоге Unity выдаст ошибку:

Cannot implicitly convert type `int' to `string'

Нам требуется привести переменную типа int к типу string.
Это можно сделать многими способами. Вот некоторые из них:

...
// ToString() - Возвращает строку, которая представляет текущий объект
guiText.text = Counter.ToString();
...
// Convert.ToString(value) - Строковое представление параметра value или String.Empty, если параметр value имеет значение null.
guiText.text = Convert.ToString(Counter)
...
// Оператор '+' служит для объединения строк. 
guiText.text = "" + Counter;
...
//etc
Примечание с MSDN

Строки являются неизменяемыми: содержимое строкового объекта невозможно изменить после создания объекта, хотя из-за синтаксиса изменения кажутся возможными. Например, при написании этого кода (имеется ввиду оператор '+') компилятор на самом деле создает новый строковый объект для новой последовательности знаков.

Воспользуемся последним способом, только вместо пустой строки напишем текст:

guiText.text = "Counter is:" + Counter;

Жмем play и наблюдаем как увеличивается значения переменной-счетчика.
b1404

Мы так же можем изменить шрифт текста, если у вас в проекте есть дополнительный шрифт (font).

Чтоб поменять шрифт, достаточно перетащить его в соответствующие поле компонента GUIText (Font).
b1405

Тут же можно поменять другие параметры, такие как размер (font size), выравнивание (alignment) и некоторые другие.

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

Базовый Урок 15 — Добавление компонентов с помощью скриптов


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

Для того, чтобы добавить компонент в run-time воспользуемся скриптами.
В нашем примере у нас снова есть платформа («platform») и ящик(«box» с rigidbody) который на нее падает.
Unity3d. Уроки от Unity 3D Student (B13 B16)

Попробуем добивать компонент к платформе, как только ящик упадёт на неё.
Добавим скрипт addComp В класс добивим следующий код:

void OnCollisionEnter(Collision myCollision) 
{
  if (myCollision.gameObject.name == "Platform")
  { 
    myCollision.gameObject.AddComponent(Rigidbody);
  }
}

Скрипт добавим к ящику. Жмем play и видим — как только ящик падает на платформа, она тоже начнёт падать.
Unity3d. Уроки от Unity 3D Student (B13 B16)

Но в консоле вы увидите предупреждение:

Can't add component 'Rigidbody' to Platform because such a component is already added to the game object!

Мы получили это сообщение, поскольку пытаемся добавить компонент Rigidbody каждый раз, когда ящик сталкивается с платформой, то есть — мы добавляем его более одного раза. Чтоб этого не происходило, нам нужно добавить проверку и добавлять компонент, только в случае его отсутствия. Добавим в OnCollisionEnter() еще одно условие:

void OnCollisionEnter(Collision myCollision) 
{
  if (myCollision.gameObject.name == "Platform")
  { 
    if(!myCollision.gameObject.rigidbody)
    {
      myCollision.gameObject.AddComponent("Rigidbody");
    }
  }
}

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

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

Базовый Урок 16 — Переключение между сцен


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

Для полноценной работы с Unity нужно уметь переключаться между различными сценами, для загрузки разных уровней, меню и другого контента. Для этого воспользуемся методом LoadLevel() класса Application.

В нашем примере есть 2е сцены. Первая («Level») — с кубом и плоскостью («floor»), на которую куб падает.Вторая («gameover») — с зеленым фотон и GUI Text'ом — «YOU WIN!»
b1600
b1601

Добавим скрипт (LoadLevel) со следующим кодом:

void OnCollisionEnter (Collision myCollision)
{
  if (myCollision.gameObject.name == "floor")
  {
    Application.LoadLevel("gameover");
  } 
}

Жмем play. В итоге в консоли появилась ошибка:

Level 'gameover' (-1) couldn't be loaded because it has not been added to the build settings.
To add a level to the build settings use the menu File->Build Settings...

Дело в том, что когда мы работаем с классом Application, мы должны указывать в настройках сборки (Build Settings) все сцены, которые хотим загружать в итоговом приложении. Перейдем в настройки сборки File->Build Settings и перетащим сцены Level и gameover из Project View в верхнее поле Buil Settings
b1602

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

public string myLevel;

void OnCollisionEnter (Collision myCollision)
{
  if (myCollision.gameObject.name == "floor")
  {
    Application.LoadLevel(myLevel);
  } 
}

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

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

Автор: DisaDisa

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js