среда, 26 декабря 2012 г.

Как сделать 2.5D игру с помощью Unity (Часть 1)


2.5D – это в целом 3D игра, но геймплей происходит в 2D плоскости. Как хорошие примеры можно отметить  Super Mario Brothers WiiLittle Big PlanetPaper Monsters. Отличный способ создать 2.5D игру (и 3D тоже) это использовать популярный, простой и доступный инструмент для разработки игр под названием Unity.
В этой серии уроков я собираюсь показать вам, как можно использовать Unity для создания простой 2.5D под названием «Shark Bomber!». Если вы новичек в Unity, то урок будет для вас особенно полезен.
Вы узнаете как сделать простую игру с нуля и уясните много нового. В этой игре вам предстоит взять под контроль небольшой (но хорошо вооружённый) самолет, который будет бомбить акул, защищая прекрасных рыб-клоунов. Unity не использует язык Objective-C, так что опыт работы с этим языком вам не потребуется. Однако общее понимание OO (Объектно-ориентировынных) языков станет несомненным плюсом – в идеале это C #, Java или ActionScript. Имейте ввиду, что этот урок для пользователей Mac, пользователи Windows могут столкнуться с некоторыми проблемами.
Кроме того, помните, что тестировать приложение мы будем на устройстве с iOS (не на симуляторе), так что убедитесь, что оно готово к работе. Итак, давайте перейдем к Unity.


Установка Unity.

Прежде всего, необходимо установить редактор Unity. Если у вас все уже установлено, то просто пропустите этот шаг. Скачайте Unity с этой странички. Теперь у вас есть файл с расширением DMG, смонтируйте его и начните установку. После установке у вас появится дирректория ‘/Applications/Unity’ где будут находиться файлы. Запустите Unity и нажмите кнопку ‘Register’ (не переживайте, есть бесплатный период). Выбирите ‘Internet activation’, нажмите ‘Next’ и заполните предложенную форму.
Важно: Для этого урока вам необходимо выбрать вариант ‘Start Pro / iOS Trial’, таким образом вы сможете использовать iPhone. После того как регистрация будет завершена, Unity запустится и вы увидите примерно следующее:
Закройте окно ‘Welcome to Unity’, перейдите в меню File\New Project, выбирите папку где-нибудь у сеья на диске, назовите проект SharkBomber. Убедитесь, что все пакеты выбраны и нажмите кнопку Create Project. Теперь перед вами чистая страница. Достаточно много кнопок, не так ли? Не волнуйтесь, далее мы все подробно рассмотрим.

Обзор Unity Editor

Давайте произведем некоторую дополнительную настройку, что бы добиться нужной конфигурации. В правом верхнем углу программы найдите менюшку - выбирите “Tall”. Это позволит изменить окно (по умолчанию было “Wide”). Теперь найдите вкладку в верхнем левом углу (чуть ниже панели инструментов) под названием “Game”, перетащите ее в нижнюю часть окна, дождитесь индикации о том, что вкладка привязана и бросьте ее там.
Теперь вы должны увидеть, то что изображено на картинке ниже:

Давайте быстренько все это рассмотрим:
  1. Scene (Сцена): Здесь вы можете передвигать ваши 3D модели и исследовать 3D мир.
  2. Game (Игра): Здесь показано то, что видит выбранная камера (в данном случае основная камера) в режиме реального времени, пока вы находитесь в редакторе. В этом же окне ваша игра запускается, когда вы нажмете кнопку “Run”.
  3. Hierarchy (Иерархия): Древо ваших объектов (так же как HTML DOM, например). В настоящее время у вас там только камера, но позже мы добавим объекты. Объекты из этого списка представлены на сцене.
  4. Project (Проект): Это содержимое вашего проекта, ваши предметы, аудио-файлы и все что вы будете использовать сейчас или в дальнейшем.
  5. Inspector (Инспектор): Здесь вы видите все свойства выделенных объектов в вашей сцене и вы можете изменять их. Особенность Unity в том, что “Inspector” активен даже когда сцена запущена, так что это еще и ваш отладчик/дебаггер.
  6. Toolbar (Панель инструментов/Тулбар): Здесь мы наблюдаем все имеющиеся инструменты для взаимодействия с объектами в вашей сцене. Так же, тут вы найдете кнопки “Run” и “Pause” для тестирования сцены.
В вашем проекте в Unity3D вы можете иметь много разнообразных сцен и переключаться между ними. На данный момент у нас одна пустая сцена открытая в редакторе. Давайте сохраним ее.
  1. Кликните правой кнопкой мыши внутри панели “Project” и выбирите “Create/Folder” – новая папка готова.
  2. Дайте папке имя “Scenes” – это можно сделать двумя способами. Клик левой кнопкой на имени папки или выделите папку и нажмите “Enter”.
  3. Теперь из главного меню перейдите в “File/Save scene – идите в [директория вашего проекта]/Assets/Scenes и сохраните сцену как “LevelScene”.
Ок – готово. Проверим. В панели Project откройте папку Scenes, здесь должна быть ваша сцена с именем LevelScenes. Теперь мы готовы запустить игру – нажмите кнопку Play. Пока ничего интересного, но ваша игра работает в панеле Game. Не забудьте остановить игру снова нажав кнопку Play (это важно).

Настройка проекта Unity3D для iPhone

Одна из особенностей Unity состоит в том, что движок можно использовать для создания игр для iPhone, Mac, Wii и других платформ. В этом уроке мы будем создавать игру для iPhone, поэтому необходимо кое что настроить. Из меню перейдите в “File/Build Settings” и кликните “Add current”, чтобы добавить сцену в проект. Вы увидите, что сцена получит индекс “0”. Это значит, что это будет первая сцена когда игра будет запущена. Это как раз то, что нам нужно. Из списка Platform выбирите iOS и нажмите кнопку “Switch platform”. Теперь логотип Unity появится в строке iOS. Пока это все настройки, что нам нужны. Кликните кнопку “Player settings”. Вы заметите, что “Player settings” откроются в Инспекторе. Здесь нам так же нужно внести пару изменений. Убедитесь, что в “Pre platform” выбран iPhone.

Вы увидите, что настроек достаточно много и многие перекочевали с Xcode, поэтому в дальнейшем вы сможете экспериментировать. Перейдем к настройке:
  1. В “Resolution and Presentation” в строке “Default orientation” установите “Landscape Left”.
  2. В “Other settings” в строке “Bundle Identifier” установите то что захотите или оставьте значение по умолчанию.
  3. Там же в “Other settings” в стрке “Target device” установите “iPhone only”.
И последнее: Слева под вкладкой “Game” теперь имеются варианты ориентации экрана и разрешения. Выбирите “iPhone Wide(480?320)”
Поздравляю. Теперь у вас есть базовый проект “Hello World”, который можно запустить на iPhone.

Запуск игры на iPhone

Чтобы проверить все, что мы сделали мы протестируем проект в Xcode и на iPhone.
Запустите свою любимую версию Xcode, закройте экран приветствия, если он вылез и вернитесь в Unity. Так мы покажем Unity какая версия Xcode у вас установлена. В Unity в меню выбирите “File\Build&Run”, это вызовет Build Settings, кликните кнопку “Build and Run”.
У вас спросят где бы вы хотели сохранить ваш проект Xcode. Внутри дирректории вашего проекта создайте папку с именем “SharkBomberXcode” (это то, где будут находиться файлы Xcode) и дайте файлу имя “SharkBomber”.
Через несколько минут проект будет создан и Xcode выдаст вам всплывающее окно Unity-iPhone с открытым проектом. Вот что произошло – Unity сгенерировала исходный код проекта для Xcode и теперь вы можете запускать его там.
У вас может появиться желание взглянуть на код, но это на самом деле шаблон (boilerplate), который загружает “моно фреймворк” (mono framework), включая несколько коротких dll файлов и некоторые другие элементы/ресурсы, так что изучать особо нечего. Убедитесь, что iOS устройство подключено и перейдите в “Unity-iPhone”.
Момент истины – нажмите кнопку “Run” и ваш проект Unity должен запуститься на iPhone.
Отличная работа. Вы увидите дефолтный экран Unity, а затем голубой экран и надпись trial version в углу. Остановите приложение, вернитесь в Unity и сохраните проект.

Настройка сцены

Во-первых, давайте настоим основную камеру сцены. Выберите “Main Camera” в “Hierarchy”, в инспекторе найдите “Projection” и установите на “Orthographic”, “Size” установите на 10, в “Clipping Planes” установите “Near” на 0.5 и “Far” на 22. Теперь около камеры внутри сцены вы увидите поле – это границы вашего мира видимые на экране.
Обратите внимание, мы установили “Projection” на значение “Orthographic” – это значит, что координаты глубины не будут влиять на то как предметы выглядят на экране – это самый подходящий вариант для создания 2D игры. Пока вы не привыкните к Unity давайте работать в таком режиме, затем мы переключимся в 3D проекцию.
Установите положение камеры (в инспекторе) X, Y и Z на [0,0,0].
Щелкните правой кнопкой мыши в панели “Project” и снова создайте папку (Create/Folder), новую папку назовите “Textures”. Затем скачайте фоновое изображение, которое я приготовил, и сохраните где-нибудь на диске. Перетащите скачанное изображение из Finder’а в только что созданную папку Textures.
Это займет около 20 секунд, а когда процесс импорта завершится, откройте папку, выберите фоновую текстуру и посмотрите в инспекторе на ее свойства. В самом низу в панели Preview теперь написано “RGB Compressed PVRTC 4bits”.

Из меню перейдите в “GameObject\Create other\Plane”. Вы увидите синий прямоугольник рядом с камерой. Это плоскость, которую мы только что добавили к сцене. Для нее у нас есть подходящая текстура.
Выбирите “Plane” в панели “Hierarchy”, в инспекторе в верхнем текстовом поле где сказано “Plane” введите “Background”. Перетащите текстуру фона из панели Project и бросьте на объект “Background” в “Hierarchy”. Установите позицию плоскости в инспекторе на [4, 0, 20], Rotation (поворот) на [90, 180, 0] и Scale (Масштаб) на [10, 1, 5]. Это, как вы видите, поворачивает и масштабирует плоскость в панели “Scene” перед камерой. Таким образом, камера рассматривает плоскость как фон игры.
Теперь, чтобы видеть, что происходит на сцене нам понадобится свет (прямо как в жизни). Идем в “GameObject\Create other\Directional Light” – это обеспечит сцену некоторым светом. Выбирите Directional Light в панели “Hierarchy” и установите координаты позиции на значение [0, 0, 0].
Теперь у нас есть все настройки и фон сцены, самое время добавить некоторые объекты и привести их в движение.

Добавление в сцену 3D объектов

Из меню перейдите в “GameObject\Create other\Cube” – этим мы добавим куб в сцену. Это будет игрок, так что переименуйте объект в “Player”.
Установите позицию на [-15, 5.3, 8]. Вы увидите как куб появится с левой стороны экрана в панели “Game” – это то место, откуда наш самолет начнет движение по поверхности моря в другую сторону экрана.
Теперь давайте импортируем модель самолета! Воспользуемся бесплатными 3D моделями от Reiner “Tiles” Prokein, которые он выкладывает бесплатно на своем сайте. Скачайте модель и разархивируйте содержимое.
Правой кнопкой кликните в панели “Project” и выберите “Create/Folder”, переименуйте папку в “Models”. Разархивированную модель самолета (airplane_linnen_mesh.obj) бросьте в папку “Models” в панель “Project”.
Затем кликните правой кнопкой в папке “Models” и создайте там новую папку с именем “Textures”. В ней мы сохраним текстуру самолета. Перетащите файл airplane_linnen_tex.bmp в эту папку.
Далее выбирите объект “Player” в “Hierarchy”, взгляните в инспектор – “Mesh Filter” – фильтр, который устанавливает геометрию вашего объекта (сейчас установлено на значение cube). В строке этого фильтра найдите (справа) маленький круг с точкой в середине и нажмите на него. Появится «попап» окно, где нужно кликнуть на модель самолета и это изменит геометрию объекта на самолет.

Теперь одна немаловажная деталь – самолет выглядит немного неверно. Я не эксперт в 3D, но я нашел как в Unity это можно поправить. Выберите файл “airplane_linen_mesh” в панели “Project”, затем в инспекторе найдите “Normals” и выбирите “Calculate”, затем прокрутите вниз и нажмите кнопку применить.
Отлично, теперь самолет выглядит куда более гладко. Давайте наложим текстуру: возьмите файл “airplane_linnen_tex” из панели “Project” и перетащите на “Player” в панели “Hierarchy”. Unity автоматически применит текстуру к самолету. Последние штрихи к самолету.
Для объекта “Player” установите Rotation на [0, 90, 350] и Scale на [0.7, 0.7, 0.7]. Это повернет и отмасштабирует самолет и все будет выглядеть так будто он летит чуть выше поверхности моря.
Наша игра может и не тянет на лавры Call of Duty, но не уходите далеко, потому что дальше мы будем учить наш самолет летать.

Программируем в Unity3D на С#

Как мы отмечали ранее, с помощью Unity можно разрабатывать игры для Wii, iPhone, Mac и т.д. Так как Unity это универсальный инструмент, он нуждается в некоем промежуточном слое, который позволит программировать игру лишь однажды, то есть каждая новая сборка под другую платформу приводит код в нужный вид.
Как ни странно, программировать мы будем на C#, а не на Objective-C и, когда Unity сгенерирует проект для Xcode, код из C# будет переведен в нужный код автоматически.
Теперь правый клик в панели “Project”, создайте новую папку и дайте ей имя “Class”. Правый клик на новой папке, перейдите в “Create/C Sharp Script” и переименуйте созданный файл в “PlayerClass”. Снова правый клик в панели “Project” и выберите “Sync MonoDevelop Project”, откроется MonoDevelop IDE – это IDE (Integrated Development Environment) в котором мы будем программировать на C#.
Внимание: MonoDevelop это порт программы с Linux, так что не волнуйтесь если программа будет падать, особенно когда вам захочется изменить размер окна. Если это произошло, просто запустите ее снова, кликнув на “Sync MonoDevelop Project”.

Давайте немного разберемся в интерфейсе MonoDevelop GUI. Есть 3 основные панели:
  1. Браузер проекта – в Assets/Class вы найдете наш файл PlayerClass.cs
  2. Отображается схема открытого в настоящее время класса
  3. Эдитор – здесь есть подсветка синтаксиса и другие фишки, которые вам помогут
Найдите файл PlayerClass.cs в браузере и дважды на нем кликните. Содержание класса появится в эдиторе. Убедитесь, что класс выглядит как показано ниже:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using System.Collections;

public class PlayerClass : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}
Строка “using” включает в себя библиотеки и фреймворки. UnityEngine – это библиотека, которая дает вам доступ к таким штукам как акселерометр iPhone, ввод с клавиатуры и т.д. Вы определяете ваш новый класс и наследуете его от MonoBehaviour – это дает вас много примочек бесплатно: вы можете переопределить длинный список методов, которые вызываются, когда события обрабатываются.
Несколькими строками ниже вы увидите пустые методы Start и Update – это два важных события.
Start вызывается, когда объект появляется на сцене, т.е. вы можете инициализировать его сами (так же, как viewDidAppear: в UIController).
Update вызывается при каждом рендеринге кадра (т.е. может быть 30, 60 или 100 раз в секунду, вы никогда не знаете как часто). Здесь закладываются движения, логика игры и т.д.
Теперь ненадолго давайте вернемся в Unity. Мы хотим заставить самолет лететь над морем в правую сторону экрана и снова вылетать слева. Давайте определим с какой позиции самолет будет двигаться с левой стороны. В панели “Scene” в верхнем правом углу вы увидите инструмент для ориентации. Кликните на ручку с буквой X (это своего рода конус, но я назвал его ручкой):

Это будет вращать сцену и ориентировать ее горизонтально по отношению к вам. Еще рас кликните ручку – это будет вращать сцену вокруг. Добейтесь результата показанного на картинке ниже:

Теперь с помощью колеса прокрутки мыши вы сможете изменять масштаб сцены и подогнать ее под размер панели “Scene”. Убедитесь что инструмент для перемещения выбран в тулбаре и выберите “Player” в “Hierarchy”.

Теперь вы увидите на самолете навигационные стрелки зеленого и красного цвета. Теперь вы можете двигать самолет по осям стрелочек:
Сейчас нужно схватить красную стрелку (горизонтальная ось) и тащить самолет вправо до тех пор, пока он не выйдет из поля “Game”, которое расположено внизу. Начинайте перетаскивание и поглядывайте в панель “Game”.
Остановитесь, когда самолет покинет видимую зону и посмотрите на его позицию в инспекторе. Ось X должна быть примерно со значением 17.25 – это правая граница экрана. Вы можете переместить самолет в левую часть сцены и вы увидите, что ее граница около -17.25, поэтому мы будем использовать значения 18 и -18, чтобы самолет летал вокруг. Верните самолет на прежнее место.
Вернитесь в MonoDevelop и внесите следующие изменения в PlayerClass.cs:
1
2
3
4
5
6
7
8
9
10
//just after class declaration line
public float speed;

//inside the Update method
if (transform.position.x > 18) {
//get new speed
speed = Random.Range(8f,12f);
transform.position = new Vector3( -18f, transform.position.y, transform.position.z );
}
transform.Translate(0, 0, speed * Time.deltaTime);
Как вы уже догадались вы только что задекларировали public property для класса под названием “speed”, но уникальность Unity состоит в том, что все public свойства класса так же доступны в панели “Inspector”.
Таким образом, вы можете устанавливать значения в свойствах классов из IDE и при этом контролировать значения свойств в то время, когда игра запущена.
Переменная “transform” это свойство каждого игрового объекта, которая обрабатывает положение объекта в пространстве: вращение, позиция, масштаб и т.д. Поэтому каждый вызов Update переводит позицию объекта так, что он движется в правую сторону экрана.
Мы не можем просто переместить самолет установив количество вызовов к Update, т.к. никто не знает сколько вызовов будет в секунду. Вместо этого мы определяем скорость в секунду и делим ее на количество времени прошедшего с момента последнего вызова метода Update (Time.deltaTime). Таким образом, объект всегда перемещаяется с одинаковой скоростью независимо от текущей частоты кадров. Вызов “Translate” дает три значения – трансформацию, которую он должен сделать на каждой оси. Вы, вероятно, заметили, что мы перемещаем самолет по оси Z (3-й параметр) – мы должны так сделать, потому что мы поворачиваем самолет на сцене, так что изменение оси Z перемещает его вправо от перспективы игрока
Посмотрите на оператор “if” – мы проверяем, больше ли transform.position.x чем 18 (помните почему?) и если так, мы устанавливаем позицию самолета в те же самые координаты, но “-18” на оси X. Мы используем новый Vector3 (x, y, z), чтобы установить позицию. Мы будем использовать много этих векторов для всего позиционирования. Так же вы заметили, что мы установили случайное значение скорости от 8 до 12 – это должно сделать перемещение самолета более беспорядочным. Теперь мы готовы увидеть перемещение самолета.
Переключитесь обратно в Unity. Берите “PlayerClass” из панели “Project” и тащите в “Player” в панели “Hierarchy”. Таким образом мы прикрепили класс к объекту игры. Посмотрите в инспектор. Вы увидите новую вкладку под названием «Player Class (Script)”, установите там значение 12. Ну что, готовы? Нажимайте кнопку “Run”. Ура! Вы увидите как в обеих панелях “Scene” и “Game” начал лететь самолет залетая в правую сторону, а затем выходя с левой. Так же обратите внимание, что в инспекторе значение X меняется – там показано, где самолет находится в каждый конкретный момент. Кроме того, скорость самолета меняется, всякий раз, когда он делает круг.
Как только закончите наслаждаться полетом не забудьте остановить игру. Теперь, сделаем самолету грозного противника – акулу. Вы уже знакомы с основами, поэтому все пойдет быстрее, так как пока мы не будем делать ничего нового. Нужен перерыв? Мы прошли достаточно много материала. Так что если вы устали, сделайте перерыв. Просто сохраните проект и вернитесь к нему позже. Помните, что при новом открытии Unity открывается пустая сцена. Чтобы загрузить сцену, дважды кликните на “LevelScene” в панели “Project”.

Прыгающая акула

Идем дальше и скачиваем/разархивируем модель акулы. Как и раньше, перемещаем файл “shark.obj” в панель “Project” в папку “Models”, а файл “sharktexture.bmp кладем в “Models/Textures”. В меню выберите “GameObject/Create other/Capsule” и переименуйте объект “Capsule” в “Shark”. В инспекторе в строке “Mesh Filter” нажмите на круг с точкой внутри и в открывшемся окне дважды нажмите на модель акулы. Теперь вы должны увидеть модель акулы в панелях “Scene” и “Game”.
Перетащите файл “sharktexture” из панели “Project” (она лежит в Models/Textures) на “Shark” а “Hierarchy” – это даст нашей акуле рот и устрашающие глаза.
Убедитесь, что объект “Shark” выбран и установите следующие свойства в инспекторе: Position (Позиция) – [20, -3, 8], Scale (Масштаб) – [1.2, 1.2, 1.2] – это установит акулу сразу за камерой. С этой позиции она будет двигаться к левой части экрана.

Теперь нам нужно, чтобы акула взаимодействовала с бомбами. Нужно чтобы Collider (коллайдер) акулы более или менее подходил к геометрии акулы. Как видите внутри сцены к акуле прикреплена зеленая капсула (capsule). Это коллайдер акулы. Давайте приведем его в нужный вид. В инспекторе найдите “Capsule Collider” и установите следующие значения: Radius – 1, Height – 5, Direction – “X-Axis”, Center - [0, 0, 0]. Теперь вы видите что capsule collider повернулся и более или менее подходит к телу акулы.
Последнее – выберите модель “Shark” в панеле “Project” в папке “Models”, затем в инспекторе найдите “Normals” и выберите “Calculate”, прокрутите вниз и нажмите кнопку “Apply”.
Правый клик в панели “Project” в папке “Class” и выберите “Create/C Sharp Script”, переименуйте новый файл в FishClass. Опять правый клик и выбираем “Sync MonoDevelop Project”. MonoDevelop откроется.
Откройте FishClass.cs и добавьте следующий код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using System.Collections;

public class FishClass : MonoBehaviour {

public float speed = 6f;

// Update is called once per frame
void Update () {
if (transform.position.x < -30 || transform.position.x > 30) {
//turn around
transform.Rotate(new Vector3(0,180,0));
transform.Translate( new Vector3(-10, -transform.position.y + Random.Range(-4,-1),0) );

//get new speed
speed = Random.Range(6f,10f);
}
transform.Translate( new Vector3(-speed*Time.deltaTime,0,0) );
}
}
Все очень похоже на ситуацию с самолетом. У нас есть свойства (property) скорости (в секунду) и в событии Update мы используем transform (трансформацию). Воспользуемся translate (перемещение), что бы акула двигалась.
Обратите внимание, что я использую на этот раз:
1
transform.Translate( new Vector3(x,y,z) );
Это только для демонстрации того, что некоторые из этих методов могут использовать различные параметры, однако проходящие отдельно 3 значения или 1 вектор это почти то же самое.
Теперь давайте посмотрим, что делает акула, когда достигает границы экрана (на этот раз -30 и 30, таким образом, есть момент, когда акула находится вне экрана, поэтому вы не сможете легко подловить акулу при ее возврате назад).
Когда акула достигает левой или правой границы она поворачивается, немного двигается в направлении границы и меняет скорость. Таким образом она плывет вперед-назад, вперед-назад непрерывно.
Вызов к Rotate(new Vector3(x,y,z)) вращает объект вокруг по заданным значениям (value), а transform.Translate(new Vector3(x,y,z)) вы уже хорошо знаете. Очень просто! Переключитесь обратно в Unity и перетащите “FishClass” на объект “Shark” в панели “Hierarchy”. Теперь нажимайте Play. Вы увидите как огромная акула движется взад и вперед ожидая бомбардировки.

Добавляем рыбу-клоуна

Давайте сделаем все то же самое для рыбы клоуна. Ниже список шагов, который вам поможет:
  1. Скачайте и разархивируйте модель.
  2. Перетащите файл “mesh_clownfish.obj” в панель “Project” в папку “Models”, а файл “clownfish.bmp” в папку “Models/Textures”.
  3. Выбирите “GameObject/Create other/Capsule” и переименуйте объект “Capsule” в “ClownFish”.
  4. Кликните на круглой кнопке с точкой в строке“Mesh Filter” и из меню выбирите геометрию рыбы-клоуна.
  5. Перетащите текстуру модели “clownfish” на объект “ClownFish” в “Hierarchy”
  6. Пока объект “ClownFish” выбран измените следующие свойства в инспекторе:
    • Position (Позиция) на [-20, -1, 7]
    • Rotation (Поворот) на [0, 180, 0]
    • Scale (Масштаб) на [0.4, 0.3, 0.3]
  7. Далее для этого же объекта измените свойства в строке Capsule Collider:
    • Radius на “4”
    • Height на “4”
    • Direction на “Z-axis”
    • Center на [0, 0, 0]
  8. Перетащите “FishClass” из панели “Project” на объект “ClownFish” в “Hierarchy”. Это позволит присвоить универсальный класс рыбы нашей рыбе-клоуну.
  9. Выберите модель “mesh_clownfish” в папке “Models” в панели “Project”, затем в инспекторе найдите “Normals” и выделите “Calculate”, прокрутите вниз и нажмите “Apply”.
Нажмите Play и посмотрите, что получилось. Теперь у нас две движущиеся рыбы без какого-либо дополнительно кода.

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

Прикручиваем бомбы

Скачиваем и разархивируем модель бочки. Как обычно переносим файл “colourcan.obj” в панель “Project” в папку “Models”, а “cantex.bmp” п папку “Models/Textures”. Из меню выберите “GameObject/Create Other/Capsule”, переименуйте объект в “Bomb”.
В Mesh Filter из попапа выбирите геометрию бочки. Перетащите текстуру “cantex” на объект “Bomb” в “Hierarchy”. В инспекторе в “Capsule Collider” нажмите показанную на изображении кнопку, чтобы открыть попап:

Когда попап откроется, выберите “Reset” – таким образом коллайдер автоматически примет размер назначенной геометрии – круто!
Далее выберите модель “colourcan” в папке “Models” в панели “Project”, затем в инспекторе найдите “Normals” и выберите “Calculate”, промотайте вниз, нажмите “Apply”.
Теперь давайте рассмотрим кое что новое. Выделите снова объект бомбы, и в разделе “Capsule Collider” нажмите чекбокс “Is Trigger”. Это делается для того, чтобы объект бомбы при столкновении с другим объектом инициировал событие. Но для этого нам нужно сделать тело бомбы твердым (Rigid Body). По крайней мере один из сталкиваемых объектов должен быть твердым. Из меню переходим в “Component/Physics/Rigidbody” (Бомба должна быть выбрана в “Hierarchy”).
Как только это будет сделано, в ревизоре должен появиться раздел под названием “Rigidbody”. Снимите флажок с “Use gravity” (мы не будем использовать гравитацию) и установите на “Is Kinematic”, чтобы иметь возможность контролировать тело программно. Это все, что нужно сделать чтобы столкновение (collision) работало.

Скачайте и сохраните у себя на компьютере звук сбрасывания бомбы (который я сделал сам). Нам нужно, чтобы этот звук срабатывал когда самолет сбрасывает бомбу, то есть, когда бомба впервые появляется на экране. Давайте сделаем это!
Правый клик в панели “Project”, выберите “Create/Folder”, переименуйте новую папку в “Audio”. Перетащите туда файл “bahh1.aif”. Затем перетащите “bahh1” из панели “Project” на объект “Bomb” в “Hierarchy”.
Верите или нет, но это все, что нужно сделать. Звук прикреплен к бомбе и будет играть, когда бомба появится на экране. Заметьте, как просто реализовать некоторые вещи в Unity.
Выберите объект “Bomb” в “Hierarchy”, в инспекторе найдите раздел “Audio Source”. Чекбокс “Play on Awake” должен быть включен, это говорит о том, что звук пойдет, когда объект появится на сцене.


Prefabricating your Game Objects

Помните, что в “Hierarchy” показано то, что на сцене в данный момент, а панель “Project” содержит все эти объекты? Наша цель – иметь в самолете много бомб, и по мере надобности иметь возможность сбрасывать их в море. Что нам нужно сделать, это предварительно изготовить (Prefabricating) объекты игры и для этого мы будем использовать так называемый “префаб” (Prefab) с помощью которого объект бомбы будет клонироваться.
Щелкните правой кнопкой в панели “Project” и создайте папку с именем “Prefabs”. Правый клик в новой папке и “Create/Prefab”. Переименуйте новый префаб в “BombPrefab”. Заметьте, что маленькая иконка в форме кубика белая, это значит, что префаб пустой.
Теперь перетащите “Bomb” из “Hierarchy” на “BombPrefab” в “Project”. Теперь иконка кубика синяя, значит префаб заполнен и готов к клонированию. Одна важная деталь – посмотрите сейчас на панель “Hierarchy”, цвет надписи “Bomb” так же изменился на синий, это значит объект содержится в префабе. Теперь, когда все готово, мы больше не нуждаемся в оригинальном объекте бомбы на сцене. Правый клик на объектн “Bomb” в “Hierarchy” и выбирите “Delete”.
Давайте приступим к программированию.Переключитесь в MonoDevelop, откройте PlayerClass.cs и под декларированием свойства “speed” добавьте:
1
public GameObject bombPrefab;
Вы уже догадались? В этом свойстве мы будем хранить ссылку на BombPrefab и сделаем клоны, как и хотели. Заметьте, что тип свойства – “GameObject”, и как я сказал ранее все в игре это GameObject (совсем как NSObject в Cocoa), так что задать этот тип для всего совершенно безопасно.
Теперь переключитесь в Unity и выберите “Player”. Как вы ожидали в инспекторе под “Script” появилось новое свойство “BombPrefab”. Давайте установим его значение: перетащите “BombPrefab” из панели “Project” на инспектор, где сказано “None(GameObject)”. Теперь, поле показывает, что к нему присоединен префаб BombPrefab.
Нам нужен класс C# так же и для бомбы. Правый клик внутри панели “Project” в папке “Class” и выберите “Create/C Sharp Script”, переименуйте новый класс в “BombClass”. Правый клик и выбор “Sync MonoDevelop Project” – откроется ModoDevelop. Откройте класс “BombClass.cs и замените содержимое класса этим кодом:
using UnityEngine;
using System.Collections;
1
2
3
4
5
6
7
8
9
10
11
public class BombClass : MonoBehaviour {
private float ySpeed = -4f;

// Update is called once per frame
void Update () {
transform.Translate( new Vector3(0f, ySpeed*Time.deltaTime, 0f) );
if (transform.position.y < -11) {
Destroy(this.gameObject);
}
}
}
Это очень похоже на то, что мы делали до сих пор – мы перемещаем объект каждый кадр и когда он выходит за границы экрана мы реагируем соответствующим образом. В случае с бомбой мы просто хотим уничтожить объект, так как мы всегда можем создать новый из нашего префаба.
В коде обратите внимание, что “this” относится к классу бомбы, в то время как свойство GameObject относится к объекту на сцене, поэтому мы уничтожаем объект на сцене и все компоненты предлагающиеся к нему. Во второй части урока мы посмотрим на игровую иерархию объектов, когда вы получите доступ к компонентам присоединенным к объектам программно.

Бомбежка акулы!

Наконец та часть, которую вы так долго ждали – уничтожение акул! O Откройте класс PlayerClass.cs. В конце метода Update добавьте:
1
2
3
4
if (Input.anyKeyDown) {
GameObject bombObject = (GameObject)Instantiate(bombPrefab);
bombObject.transform.position = this.gameObject.transform.position;
}
Давайте разберем каждую строчку кода:
  1. Класс Input дает вам доступ к клавиатуре, мышке, акселерометру и тачскрину. Input.anyKeyDown верно, когда нажата клавиша, это происходит только один раз, то есть, когда кнопка была нажата, а затем Input.anyKeyDown является ложным, пока другая клавиша не нажата. anyKeyDown – верно (true), когда нажата кнопка мыши, клавиатуры или произошло надатие по экрану iPhone (!).
  2. (GameObject)Instantiate(bombPrefab) это волшебная срока, которая создает экземпляр из префаба и добавляет его на сцену.
  3. И наконец мы устанавливаем позицию бомбы как и у самолета.
Класс – у нас создаются бомбы, когда игрок касается экрана, затем она падает вниз и, когда выходит за пределы экрана, самоуничтожается. Давайте попробуем! Вернитесь в Unity и на нажмите Play – теперь, если вы кликните в панели “Game” вы увидите как создастся бомба в том месте, где сейчас находится самолет. Нажмите несколько раз – появится много бомб. Вы должны так же слышать звук, который мы добавили ранее. Но бомбы не падают вниз! Почему? Можете сами выяснить в чем проблема? Ответ после перерыва.

Я надеюсь вы уже догадались, но если нет, вот в чем проблема: вы еще не прицепили BombClass к Bomb Prefab – вот почему бомбы не падают. Перетащите “BombClass” из папки “Class” в панели “Project” на “BombPrefab” в папке “Prefab” в той же панели. Проверьте инспектор, если вы видите сроку Bomb Class Script, то все верно. Теперь нажмите Play еще раз. Так-то лучше!

Все еще что-то не то – акулы не умирают, когда вы попадаете в них. Так как мы уже настроили коллайдеры и компонент бомбы rigibody, нам нужно только добавить код, что бы была реакция на столкновение (collision). Переключитесь назад в MonoDevelop и добавьте новый метод в BombClass:
1
2
3
4
5
6
7
8
void OnTriggerEnter(Collider obj) {
if (obj.gameObject.name == "Shark") {
//reset shark
obj.gameObject.transform.rotation = Quaternion.identity;
obj.gameObject.transform.position = new Vector3(20f, -3f, 8f);
Destroy(this.gameObject);
}
}
Разберем код:
  1. OnTriggerEnter – это метод, который вызывается, когда тело сталкивается с другим телом и 2-е тело передается в качестве параметра.
  2. В этой строке мы проверяем поразила ли бомба объект “Shark”.
  3. Если акула поражена, то во-первых сбрасывается вращение объекта.
  4. Во-вторых, мы возвращаем объект на исходное положение.
  5. И наконец, мы вызываем уничтожение this.gameObject, что бы заставить бомбу исчезнуть с экрана.
Снова все очень просто, не так ли? Это все, что вам нужно – переключитесь обратно в Unity и запустите игру. Убитая акула исчезает, а новая появляется снова. Вы так же можете в меню “File/Build&Run” и когда Xcode откроется нажмите “Run” в Xcode – теперь игра на вашем iPhone, отлично.

Уроки не мои и переводил не я, но отредактировано и очищено от вирусов мной. Уроки с сайта http://lookapp.ru/, им говорим спасибо за такой прекрасный перевод статей. Оригинал статьи - http://www.raywenderlich.com/.

5 комментариев:

  1. Хм...Почему-то бомбы пролетают сквозь акулы(

    ОтветитьУдалить
    Ответы
    1. Проверку написали? Тег на модель акулы выставили? Тригер поставили? Перепроверьте все, должно работать.

      Удалить
  2. a vot naschet tega popodrobnee mozhno?

    ОтветитьУдалить
    Ответы
    1. Тег это такая штука через которую можно управлять одним или множеством придем тов на сцене, вот скрин де оно находится http://data2.floomby.com/files/share/18_6_2013/ffgBPOXrcECoEKkbYdCsdA.jpg. Выбираете тег, и дальше по GameObject.FindWithTag можно найти нужный объект, ну или множество объектов через запрос массива объектов так же GameObject.FindWithTag[]. Думаю по этому поводу можно погуглить информации полно.

      https://www.google.com/webhp?sourceid=chrome-instant&ion=1&ie=UTF-8#newwindow=1&q=GameObject+FindWithTag+unity&spell=1&sa=X&ei=iR7AUdb3NYT0sgbz-oDQAQ&ved=0CCgQvwUoAA&bav=on.2,or.r_cp.r_qf.&bvm=bv.47883778,d.Yms&fp=648f377c2b6df497&ion=1&biw=1920&bih=989

      Удалить
  3. Спасибо. Сделал всё, как в статье - получилось один в один ))
    Вы только не указали ссылку на модель рыбы-клоуна (легко находится на сайте)

    ОтветитьУдалить