Предыдущие уроки вы можете найти по следующим ссылкам:
Уроки B01-B03
Уроки B04-B08
Уроки B09-B12
PS: Так же исправленны некоторые ошибки в предыдущих уроках, большое спасибо хабравчанинам ufomesh и MikhailS.
В уроке рассказывается, как определить столкновения между невидимыми для игрока объектами, используя неосязаемые «триггер коллайдеры» (trigger colliders).
Если вы хотите определить столкновения, но не ходите, чтоб столкнувшийся объект остановился, вам требуется использовать триггер (trigger)
Триггеры позволяют вам определить, где именно расположен объект на сцене (во время запуска приложения).
На нашей сцене имеется куб («box» с rigidbody), который падает на синюю платформу («platform»).
![b1300](https://habrastorage.org/r/w780q1/storage2/9fd/432/513/9fd4325132f9ffbc02ea7b1ee9820cd0.jpg)
![b1301](https://habrastorage.org/r/w780q1/storage2/465/936/e82/465936e821b794095774157816a9dbd7.jpg)
Естественно платформа останавливает куб, поскольку среди ее компонентов присутствует box collider.
![b1302](https://habrastorage.org/r/w780q1/storage2/557/092/081/557092081607f50c10ad5f5c47e7d027.jpg)
У компонента box collider есть чекбокc Is Trigger. Если включить
его и запустить сцену снова, то куб провалиться через платформу.
![b1303](https://habrastorage.org/r/w780q1/storage2/b57/449/b21/b57449b21580171c3dc535c9024977bb.jpg)
Таким образом мы можем создавать столкновения, которые не должны быть видны пользователю. Например, отключим компонент Mesh Renderer у нашей платформы. Мы по прежнему видем зеленый контур объекта, если выделим его в Hierarchy View.
![b1304](https://habrastorage.org/r/w780q1/storage2/51a/50a/844/51a50a8444b96d705dc1446d9f72e959.jpg)
Если мы нажмем play, то куб провалиться через нивидимую платформу, но пока мы не можем ничего узнать о произошедшем.
![b1305](https://habrastorage.org/r/w780q1/storage2/577/4d4/ac9/5774d4ac9bc3c110630c924965878d81.jpg)
Создадим скрипт, назовем его Trigger и добавим в тело класса следующий код
Добавим скрипт к платформе. Теперь, как тольку куб пройдет сквозь платформу, вы увидете сообщение «Box went through!» в консоли.
Ссылка на оригинальный урок
В уроке рассказывается, как отобразить информацию о счетчике на экран используя компонент GUI Text
Чтобы отображать текстовую информацию на экран воспользуемся элементом GUI Text.
Добавим его на сцену — Game Object->Create Other->GUI Text.
![b1400](https://habrastorage.org/r/w780q1/storage2/2ec/5bc/f1f/2ec5bcf1f98a121a35fe2feaad7f9915.jpg)
Так же, обратите внимание, чтоб у камеры был включен компонент GUILayer.
![b1401](https://habrastorage.org/r/w780q1/storage2/a68/27d/09a/a6827d09ac066779efb230f7802da4d7.jpg)
Текст можно редактировать напрямую через редактор (поле Text).
![b1402](https://habrastorage.org/r/w780q1/storage2/142/5aa/697/1425aa697e6bf7b2bc509df2bed977ca.jpg)
Но мы воспользуемся скриптом для этого. Добавим скрипт (GUITextExample). Код будем писать в метод Update():
Если зайти в стравку о параметре guiText.text, то увидите следующие:
var text: String
Description
The text to display.
То есть, при передачи параметра мы должны быть уверены что передаем string.
Теперь если запустить игру, то текст поменяется.
![b1403](https://habrastorage.org/r/w780q1/storage2/26f/913/d80/26f913d80abec5278bb8af77a0ae225d.jpg)
Попробуем отобразить счетчик. В класс добавим переменную-счетчик (Counter) и немного подправим код в методе Update().
В итоге Unity выдаст ошибку:
Нам требуется привести переменную типа int к типу string.
Это можно сделать многими способами. Вот некоторые из них:
Воспользуемся последним способом, только вместо пустой строки напишем текст:
Жмем play и наблюдаем как увеличивается значения переменной-счетчика.
![b1404](https://habrastorage.org/r/w780q1/storage2/d17/981/18d/d1798118d76d2139ab9e7651a516cc5a.jpg)
Мы так же можем изменить шрифт текста, если у вас в проекте есть дополнительный шрифт (font).
Чтоб поменять шрифт, достаточно перетащить его в соответствующие поле компонента GUIText (Font).
![b1405](https://habrastorage.org/r/w780q1/storage2/2ac/d45/87b/2acd4587b212443a639ef3539dfb061f.jpg)
Тут же можно поменять другие параметры, такие как размер (font size), выравнивание (alignment) и некоторые другие.
Ссылка на оригинальный урок
В уроке рассказывается, как добавить компонент к объекту используя скрипты и быть увереным, что мы их добавили только однажды.
Для того, чтобы добавить компонент в run-time воспользуемся скриптами.
В нашем примере у нас снова есть платформа («platform») и ящик(«box» с rigidbody) который на нее падает.
![](https://habrastorage.org/r/w780q1/storage2/239/1b6/761/2391b67616881eca9592e6ef3cae0c5e.jpg)
Попробуем добивать компонент к платформе, как только ящик упадёт на неё.
Добавим скрипт addComp В класс добивим следующий код:
Скрипт добавим к ящику. Жмем play и видим — как только ящик падает на платформа, она тоже начнёт падать.
![](https://habrastorage.org/r/w780q1/storage2/225/9bd/8cd/2259bd8cd27137d6c4bb047c8bdd9cd4.jpg)
Но в консоле вы увидите предупреждение:
Мы получили это сообщение, поскольку пытаемся добавить компонент Rigidbody каждый раз, когда ящик сталкивается с платформой, то есть — мы добавляем его более одного раза. Чтоб этого не происходило, нам нужно добавить проверку и добавлять компонент, только в случае его отсутствия. Добавим в OnCollisionEnter() еще одно условие:
Теперь запустим приложение и убедимся, что в консоли отсутствует предупреждение.
Ссылка на оригинальный урок
В уроке рассказывается, как написать скрипт, для переключения между сценами в проекте Unity.
Для полноценной работы с Unity нужно уметь переключаться между различными сценами, для загрузки разных уровней, меню и другого контента. Для этого воспользуемся методом LoadLevel() класса Application.
В нашем примере есть 2е сцены. Первая («Level») — с кубом и плоскостью («floor»), на которую куб падает.Вторая («gameover») — с зеленым фотон и GUI Text'ом — «YOU WIN!»
![b1600](https://habrastorage.org/r/w780q1/storage2/8e1/c50/f4b/8e1c50f4b5e2b14a493f7db34a047703.jpg)
![b1601](https://habrastorage.org/r/w780q1/storage2/be7/f7b/43d/be7f7b43dd0cb7fe6519b09fe25e58dc.jpg)
Добавим скрипт (LoadLevel) со следующим кодом:
Жмем play. В итоге в консоли появилась ошибка:
Дело в том, что когда мы работаем с классом Application, мы должны указывать в настройках сборки (Build Settings) все сцены, которые хотим загружать в итоговом приложении. Перейдем в настройки сборки File->Build Settings и перетащим сцены Level и gameover из Project View в верхнее поле Buil Settings
![b1602](https://habrastorage.org/r/w780q1/storage2/2e7/686/dd3/2e7686dd30f0dc041ee8b7900efc6db8.jpg)
Немного подредактируем наш скрипт так, чтоб мы могли указывать имя уровня из окна редактора, таким образом мы делаем наш скрипт более «гибким».
В окне редактора, на против соответствующего поля компонента, напишем название сцены, которую хотим загрузить.
Ссылка на оригинальный урок
Уроки B01-B03
Уроки B04-B08
Уроки B09-B12
PS: Так же исправленны некоторые ошибки в предыдущих уроках, большое спасибо хабравчанинам ufomesh и MikhailS.
Базовый Урок 13 — Определение столкновений с триггером
В уроке рассказывается, как определить столкновения между невидимыми для игрока объектами, используя неосязаемые «триггер коллайдеры» (trigger colliders).
Если вы хотите определить столкновения, но не ходите, чтоб столкнувшийся объект остановился, вам требуется использовать триггер (trigger)
Триггеры позволяют вам определить, где именно расположен объект на сцене (во время запуска приложения).
На нашей сцене имеется куб («box» с rigidbody), который падает на синюю платформу («platform»).
![b1300](https://habrastorage.org/storage2/9fd/432/513/9fd4325132f9ffbc02ea7b1ee9820cd0.jpg)
![b1301](https://habrastorage.org/storage2/465/936/e82/465936e821b794095774157816a9dbd7.jpg)
Естественно платформа останавливает куб, поскольку среди ее компонентов присутствует box collider.
![b1302](https://habrastorage.org/storage2/557/092/081/557092081607f50c10ad5f5c47e7d027.jpg)
У компонента box collider есть чекбокc Is Trigger. Если включить
его и запустить сцену снова, то куб провалиться через платформу.
![b1303](https://habrastorage.org/storage2/b57/449/b21/b57449b21580171c3dc535c9024977bb.jpg)
Таким образом мы можем создавать столкновения, которые не должны быть видны пользователю. Например, отключим компонент Mesh Renderer у нашей платформы. Мы по прежнему видем зеленый контур объекта, если выделим его в Hierarchy View.
![b1304](https://habrastorage.org/storage2/51a/50a/844/51a50a8444b96d705dc1446d9f72e959.jpg)
Если мы нажмем play, то куб провалиться через нивидимую платформу, но пока мы не можем ничего узнать о произошедшем.
![b1305](https://habrastorage.org/storage2/577/4d4/ac9/5774d4ac9bc3c110630c924965878d81.jpg)
Создадим скрипт, назовем его 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](https://habrastorage.org/storage2/2ec/5bc/f1f/2ec5bcf1f98a121a35fe2feaad7f9915.jpg)
Так же, обратите внимание, чтоб у камеры был включен компонент GUILayer.
![b1401](https://habrastorage.org/storage2/a68/27d/09a/a6827d09ac066779efb230f7802da4d7.jpg)
Текст можно редактировать напрямую через редактор (поле Text).
![b1402](https://habrastorage.org/storage2/142/5aa/697/1425aa697e6bf7b2bc509df2bed977ca.jpg)
Но мы воспользуемся скриптом для этого. Добавим скрипт (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](https://habrastorage.org/storage2/26f/913/d80/26f913d80abec5278bb8af77a0ae225d.jpg)
Попробуем отобразить счетчик. В класс добавим переменную-счетчик (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](https://habrastorage.org/storage2/d17/981/18d/d1798118d76d2139ab9e7651a516cc5a.jpg)
Мы так же можем изменить шрифт текста, если у вас в проекте есть дополнительный шрифт (font).
Чтоб поменять шрифт, достаточно перетащить его в соответствующие поле компонента GUIText (Font).
![b1405](https://habrastorage.org/storage2/2ac/d45/87b/2acd4587b212443a639ef3539dfb061f.jpg)
Тут же можно поменять другие параметры, такие как размер (font size), выравнивание (alignment) и некоторые другие.
Ссылка на оригинальный урок
Дополнительные материалы
Базовый Урок 15 — Добавление компонентов с помощью скриптов
В уроке рассказывается, как добавить компонент к объекту используя скрипты и быть увереным, что мы их добавили только однажды.
Для того, чтобы добавить компонент в run-time воспользуемся скриптами.
В нашем примере у нас снова есть платформа («platform») и ящик(«box» с rigidbody) который на нее падает.
![](https://habrastorage.org/storage2/239/1b6/761/2391b67616881eca9592e6ef3cae0c5e.jpg)
Попробуем добивать компонент к платформе, как только ящик упадёт на неё.
Добавим скрипт addComp В класс добивим следующий код:
void OnCollisionEnter(Collision myCollision)
{
if (myCollision.gameObject.name == "Platform")
{
myCollision.gameObject.AddComponent(Rigidbody);
}
}
Скрипт добавим к ящику. Жмем play и видим — как только ящик падает на платформа, она тоже начнёт падать.
![](https://habrastorage.org/storage2/225/9bd/8cd/2259bd8cd27137d6c4bb047c8bdd9cd4.jpg)
Но в консоле вы увидите предупреждение:
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](https://habrastorage.org/storage2/8e1/c50/f4b/8e1c50f4b5e2b14a493f7db34a047703.jpg)
![b1601](https://habrastorage.org/storage2/be7/f7b/43d/be7f7b43dd0cb7fe6519b09fe25e58dc.jpg)
Добавим скрипт (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](https://habrastorage.org/storage2/2e7/686/dd3/2e7686dd30f0dc041ee8b7900efc6db8.jpg)
Немного подредактируем наш скрипт так, чтоб мы могли указывать имя уровня из окна редактора, таким образом мы делаем наш скрипт более «гибким».
public string myLevel;
void OnCollisionEnter (Collision myCollision)
{
if (myCollision.gameObject.name == "floor")
{
Application.LoadLevel(myLevel);
}
}
В окне редактора, на против соответствующего поля компонента, напишем название сцены, которую хотим загрузить.
![b1603](https://habrastorage.org/storage2/bb9/e81/045/bb9e810453ac3e5b53ef0c77ae1e616d.jpg)
Ссылка на оригинальный урок