Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 10.12.2011, 05:04   #1
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Осваиваем Unity3d. Урок #2

Данный урок рассчитан на тех, кто ознакомился с первым уроком (ссылка) от pax и
уже имеет начальные представления о Unity и его редакторе. Так же предполагается,
что читающие умеют программировать на любом из языков программирования, немного
знают об объектно-ориентированном программировании и английском языке.

Урок пишется с использованием Unity 3.4.2, Visual Studio 2010 и C#. В первом уроке
сказано, как интегрировать Unity и Visual Studio. Не откладывайте это на потом,
тем более что с сайта Microsoft доступна бесплатная версия Express.

1. Создание проекта
Запускаем Unity и видим последний сохраненный проект, загружаемый по умолчанию.
Отмечу, что если при загрузке Unity держать Alt, то откроется диалоговое окно,
где можно будет выбрать проект из ранее сохраняемых. Создадим новый проект.
При создании проекта будет выведен диалог, где спросят, какие стандартные пакеты
(packages) мы хотим использовать. Для данного урока потребуется только Character
Controller. Необходимые пакеты можно будет добавить после.

2. Создание и позиционирование объектов
Добавим на сцену, к уже имеющейся камере Main Camera, плоскость и куб.
Главное меню -> GameObject -> Create Other -> Cube и затем Plane.
После создания в окне Hierarchy (Иерархии объектов) добавятся два объекта.
Теперь надо спозиционировать камеру, плоскость и куб, так чтобы при нажатии на
"Play" на экране была плоскость и стоящий на ней куб.
Для этого выбираем камеру и в окне Inspector(Свойства), задаем параметры
X, Y, Z равными (0, 1, -5), для куба - (0, 1, 0) и для плоскости - (0, 0, 0).
Так же можно добавить точечный источник света
Главное меню -> GameObject -> Create Other -> Point Light
задав ему положение (0, 2, 0). Обратите внимание, что X - это положение объекта
по красной оси, Y (вертикаль) - по желтой, а Z - по синей.
Для плоскости Plane рекомендую задать параметр Scale (3, 3, 3).
Нажимаем "Play" и проверяем, что виден куб, подсвеченный сверху.
Отмечу, что для переключения между режимами игры и редактирования можно
использовать сочетание клавиш Ctrl + P.

3. Свойства (Components) объектов и их добавление
Выберем куб и посмотрим на его свойства. По мимо координат, у куба есть
следующие свойства, которые в Unity называются компонентами (Component)
  • Transform - информация о положении и ориентации объекта в пространстве
  • Mesh Filter - геометрическая модель, связанная с объектом
  • Box Collider - физическая модель, используемая для обработки физики
  • Mesh Renderer - компонент, используемый для вывода на экран
Можно убирать и ставить галочки напротив компонент, тем самым включая или
отключая их. Отключив Box Collider или Mesh Renderer получим объект, который
не будет просчитываться при столкновениях или же отображаться на экране,
соответственно. Можно добавить новый компонент для объекта. Например,
сделаем объект со звуком. Выберем куб и
Главное меню -> Component -> Audio - > Audio Source
После этого у куба добавился новый параметр Audio Source, который имеет
множество настроек. Самая главная - это аудио файл, который будет
использоваться для проигрывания, т.е. параметр Audio Clip.
Отмечу, что некоторые объекты, создаваемые через меню GameObject -> Other
- это Empty (пустой) с добавленными к нему компонентами.

4. Добавление ресурсов
В окне редактора Project (Проект) создаем новую папку
Меню -> Create -> Folder
Заходим в папку и добавляем новый звук
Меню -> Import New Asset -> ... (в открывшемся окне выбираем файл)
Далее выбираем на сцене Куб и из окна Project в параметр Audio Clip
перетаскиваем полученный файл.
Как понятно, данное окно отвечает за добавление новых ресурсов, таких как
текстуры, модели, аудио-файлы, скрипты, текстовые файлы и т.д. Которые
можно хранить по папкам, так как вам необходимо. Отмечу, что все созданные
папки и добавленные ресурсы будут находиться в директории проекта в папке
Assets (Ресурсы).
Нажимаем "Play", слушаем.

5. Добавление стандартных пакетов (packages)
При создании проекта выводится окно, где можно выбрать необходимые пакеты.
В основном это наиболее востребованные скрипты, реализующие ту или иную
функциональность, как например генерация ландшафтов, skybox и другие.
Для следующего шага потребуется наличие пакета Character Controller. Переходим
в окно Project и в папке Standard Assets находим Character Controller. Если
его нет, т.е. при создании проекта он не был выбран, то вызываем меню
Меню -> Import Package -> Character Controller.
Обратите внимание, что некоторые пакеты имеют приставку (Pro Only), означающую,
что пакет будет работать только в Pro-версии Unity.

6. Вид от первого лица или как двигать камеру
Выбираем камеру Main Camera на сцене и добавляем ей новый компоненты
Главное меню -> Component -> Character -> FPS Input Controller
Главное меню -> Component -> Camera Control -> Mouse Look
Первый компонент добавил камере перемещение клавиатурой, второй - обработку
мышки. Обратите внимание, что добавление первого скрипта привело к добавлению
еще двух компонент. Первая - Character Controller, описывающая капсулу, которая
будет считаться игроком для обработки столкновений с другими телами (в частности
куба и плоскости). Вторая - скрипт Character Motor, содержащий общий код, для
реализации ходьбы.
Нажимаем "Play" и проверяем.

7. Создаем новый компонент
Переходим в окно редактора Projects, создаем папку Scripts и создаем новый скрипт
Меню -> Create -> C# Script
Задаем имя Enemy (Враг) и открываем его в редакторе.
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    void Start () { ... }
    void Update () { ... }
}
Обратите внимание на конструкцию третьей строки, которая расшифровывается так
Общедоступный класс Health наследует все свойства и методы от класса MonoBehaviour,
т.е. класс Enemy расширяет базовый класс MonoBehaviour.
Как видим нам предлагается задать две функции - Start и Update. Первая из них, вызывается
когда объект класса MonoBehaviour, а значит и Enemy, создается на сцене, а вторая
вызывается каждый кадр.
Добавим классу открытую (public) переменную Health (Здоровье), отметку в консоль,
что объект создан, а так же функцию, которая будет вращать объект вокруг вертикали.
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    public int Health = 100;

    void Start () {
        Debug.Log("Enemy created"); 
    }
    
    void Update()
    {
        this.transform.Rotate(Vector3.up);
    }
}
Сохраняем код и переходим в редактор Unity. Выбираем куб на сцене и добавляем компонент
Главное меню -> Component -> Scripts -> Enemy
Смотрим на свойства куба и видим, что у его компонента Enemy есть одно поле Health, которое
можно задать прямо в редакторе.
Добавляем в редакторе отображение консоли
Главное меню -> Window -> Console
Нажимаем "Play", контролируем, что в консоль вывелось "Enemy created" и куб вращается.

8. Поиск объектов и статические члены
Изменим компонент Enemy так, чтобы здоровье уменьшалось прямо пропорционально расстоянию
от объекта с этим компонентом до игрока. Игрок - это фактически объект "Main Camera", поэтому
чтобы найти его в коде используем следующую конструкцию
GameObject Player = GameObject.Find("Main Camera").gameObject;
if (Player == null)
    Debug.Log("Player not found");
Обратите внимание, что имя объекта зависит от регистра символов, будьте аккуратны.
Расстояние между объектом (кубом) и игроком, тогда можем посчитать так
Health = (int)(this.transform.position - Player.transform.position).magnitude;
Т.е. взяли вектор, начинающийся у куба и заканчивающийся у игрока, нашли координаты конца
и начала, используя свойства position, а потом посчитали его длину, вызвав magnitude.
Казалось бы все уже готово, чтобы поправить код, но поиск Player каждый кадр в Update весьма
нежелателен, поэтому вводим приватную (private) переменную Player, которую заполним при старте.
Более того, объявим ее статичной (static), т.е. общей для всех объектов класса Enemy.
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    public int Health = 100;
    private static GameObject Player;
    void Start () {
        Debug.Log("Enemy created");
        if (Player == null)
        {
            Player = GameObject.Find("Main Camera").gameObject;
            if (Player == null)
                Debug.Log("Player not found");
        }
    }
    
    void Update()
    {
        this.transform.Rotate(Vector3.up);
        Health = (int)(this.transform.position - Player.transform.position).magnitude;
        Debug.Log(Health);
    }
}
9. Программный доступ к компонентам объекта
Теперь сделаем так, чтобы если Health < 2, то объект становился невидимым, но игрок
в него упирался, т.е. отключался компонент Mesh Renderer.
Доступ к компоненте получаем следующим образом
MeshRenderer Mesh = this.GetComponent<MeshRenderer>();
а включение или отключение проводим через свойство enabled.
Код класса перепишется вот так
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    public int Health = 100;

    private static GameObject Player;
    private MeshRenderer Mesh = null;

    void Start () {
        Debug.Log("Enemy created");
        if (Player == null)
        {
            Player = GameObject.Find("Main Camera").gameObject;
            if (Player == null)
                Debug.Log("Player not found");
        }
        Mesh = this.GetComponent<MeshRenderer>();
    }
    
    void Update()
    {
        this.transform.Rotate(Vector3.up);
        Health = (int)(this.transform.position - Player.transform.position).magnitude;
        if (Health < 2 && Mesh.enabled)
            Mesh.enabled = false;
        if (Health > 2 && !Mesh.enabled)
            Mesh.enabled = true;
    }
}
Примечание: можно хранить не ссылку на компоненту, а непосредственно позицию куба,
поскольку она неизменна (куб не двигается) и ее не требуется пересчитывать каждый кадр.

10. Главный цикл Unity и обработка ввода
Многие, кто программирует, уже привыкли, что у программы должен быть главный цикл, в
котором вызываются функции отрисовки и обработки клавиатуры с мышкой. В Unity главный
цикл изолирован от программиста. Фактически, главный цикл последовательно проходит по
всем объектам и компонентам и вызывает у них функции Update() и FixedUpdate (). Первая
используется, если компоненту требуется синхронизация с выводом графики, вторая -
с расчетом физики.
Отмечу, что в Update() желательно использовать переменную Time.deltaTime,
содержащую сколько секунд прошло с предыдущего кадра.

И немного о обработке ввода. Чтобы узнать нажата ли клавиша, надо использовать проверку
if (Input.GetKey (KeyCode))
{
        ...
}
Если в качестве KeyCode указать Mouse0 или Mouse1, то можно получить состояние кнопок
мышки.
Чтобы распознать клик мышкой надо использовать следующий код
if (Input.GetMouseButtonDown(ButtonNo))
{
        ...
}
Отмечу, что такие обработчики можно добавлять в классе того объекта, где вам это
необходимо. Подробнее о вводе можно прочитать в разделе Reference для класса Input.

11. Шаблоны объектов (Prefabs)
Зачастую на сцене может быть много однотипных объектов. Можно вручную создавать Empty
объекты и добавлять им необходимые компоненты, но Unity предлагает лучший способ -
использование шаблонов. Выглядит это так: создаем на сцене объект, задаем ему нужные
компоненты, а затем перетаскиваем объект из окна Hierarchy в окно Project. В результате
будет создан шаблон. Теперь, чтобы добавить сходные объекты, надо на сцену вытаскивать
шаблон из окна Project. При этом, создаваемые объекты в окне Hierarchy будут выделены
синим цветом, указывающим на то, что используется шаблон. Мы может в отдельности изменить
каждый из объектов, например добавив компоненты, однако в этом случае Unity предупредит,
что шаблон будет потерян, т.е. изменения внесенные в шаблон, не будут автоматически
применены к этому объекту.
Для изменения шаблона нужно выбрать его в окне Project, после чего можно будет удалять
или добавлять компоненты.

12. Немного о справочной системе Unity
Справочная система Unity доступна в следующих местахТак же документация открывается в одной из вкладок в Visual Studio, когда начинают редактировать
скрипт. Как видно документация состоит из трех разделов.
Manual.
Раздел посвящен использованию редактора и более подробно описывает то, что приводилось тут в
разделах 1-5. А так же другие аспекты редактора.
Reference
Этот раздел целиком посвящен стандартным компонентам и их описаниям. Если что-то не понятно,
в настройке компоненты, то стоит обратиться в этот раздел. Замечу, что в редакторе, справа от имени
компоненты есть иконка "Книжки с вопросом", которая ведет на описание компоненты в этом разделе.
Scripting
Самый нужный раздел, если всерьез планируете заниматься программированием скриптов.
Содержит описание всех базовых классов, таких как MonoBehaviour, GameObject и классов, реализующих
компоненты. Обратите внимание, примеры содержат код на всех доступных языках, используемых в Unity.

13. Где тени и полноэкранные эффекты? Или о Unity Pro
Плохая новость состоит в том, что бесплатная Unity имеет несколько ограничений, в частности не
поддерживает тени, полноэкранные эффекты, компиляцию под различные платформы и кое-что еще.
Со список отличий можно ознакомиться на сайте Unity. Хорошая новость в том, что keygen существует,
а так же лицензия на Unity стоит всего 45000руб, что для коммерческой разработки не так уж и много.

14. Пишем простой FPS
Для начала переименуем Cube в Enemy в окне Hierarchy, а затем перетащим из этого окна в окно
Project в созданную заранее папку Prefabs. Таким образом мы изготовили шаблон для врагов.
Теперь добавим на сцену сферу
Главное меню -> GameObject -> Create Other -> Sphere
Выставим ей значения Scale по всем осям 0.2 и переименовав в Bullet (снаряд), так же перенесем в окно
Projects в папку Prefabs.

Изменим поведение врагов, отредактировав скрипт Enemy.cs. Теперь при приближении персонажа, они будут
убегать от него. Для этого я беру вектор от игрока до врага и если его длина меньше задаваемого числа,
то передвигаю вдоль него в сторону от игрока. Обратите внимание, что предварительно я обнуляю вертикальную
компоненту вектора, поскольку данный вектор не параллелен горизонтальной плоскости и сдвиг вдоль него
изменял бы высоту врага. Обнулив y-компоненту, я обеспечил себе параллельность вектора.
Так же добавлена обработка события OnCollisionEnter, которое происходит если сталкиваются два тела с физикой.
Чтобы понять, что было столкновение с пулей, а не с чем то другим, я ищу у объекта компоненту, Bullet.


Игроку же добавим компонент, позволяющий ему стрелять шарами.

15. Немного о импорте ресурсов

Продолжение следует

Последний раз редактировалось Aikon, 12.12.2011 в 03:13.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Aikon за это полезное сообщение:
H@NON (10.12.2011), Lestar (10.12.2011), pax (10.12.2011), RegIon (10.12.2011), Skript47 (18.02.2013)
Старый 10.12.2011, 09:48   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Осваиваем Unity3d. Урок #2

"л" забыл
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 10.12.2011, 11:12   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Осваиваем Unity3d. Урок #2

Продолжать стоит конечно. Только это не на урок похоже, а на FAQ.

Есть одно замечание пока:
В разделе "Вид от первого лица или как двигать камеру" не сказано откуда взялись эти ассеты. Надо бы добавить, что они находятся в специальном пакадже, поставляемом вместе с Unity.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 10.12.2011, 14:56   #4
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Осваиваем Unity3d. Урок #2

стоит !! Давай про синхронизацию проекта со студией и как дебажить скрипты !!
(Offline)
 
Ответить с цитированием
Старый 10.12.2011, 19:50   #5
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Ответ: Осваиваем Unity3d. Урок #2

pax, точно забыл. В самом начале (Создание проекта) написал, а там забыл. Поправлю.
Все-таки это именно урок, т.е. перехожу от простого к вещам посложнее, последовательно. FAQ - это сборник готовых решений, желательно с делением по тематикам.

IGR, синхронизация автоматическая. Насколько я понимаю Unity Editor просто вешает хук на папку с ресурсами и мониторит ее на изменения. Изменили файл в Studio/Paint/notepad и редактор автоматически применяет изменения.
Про отладку ничего пока не могу сказать - до сих пор пользуюсь Debug.Log
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (10.12.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 08:15.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com