Unity3D
Unity3D это игровой движок 3D-игр в основном стрелялок и аркад, но при большой сноровке можно реализовать и RPG, RTS, квесты, 2D-игры, встраиваемые в браузер, iPhone и с использованием сети. Движок понимает множество разные форматы файлов
- 3д модели и анимация из Maya, Cinema 4D, 3ds Max, Cheetah3D, Modo, Lightwave, Blender. Форматы 3ds, fbx и dae
- практически все растровые изображения для ма ск и текстур
- звуковые mp3, wav форматы для эффектов и фона
Профессиональная версия имеет более расширенные возможности по работе с динамическим освещением, сетевыми возможностями. Но даже без наличия блокбастерных игр о которых все бы слышали, unity успешно продвигается в плане комьюнити и «народного движка» и вполне возможно что с бесплатными плагинами можно будет написать игру ничем не уступающую платным.
IDE
Графическая оболочка разработчика (IDE) состоит из 4 основных панелей
- Графическое поле, переключающееся / вид игры (Game & Scene)
- Иерархия объектов (Hierarchy)
- Инспектор объекта (Inspector)
- Библиотека доступных ресурсов (Assets)
По используемости самое важное место это Инспектор, потому что именно в нём видны внутренности объекта (GameObject)
Создание карты
Карта (Terrain) создаётся очень просто из меню и по умолчанию уже есть. Курсором как в фотошопе можно изменять высоту рельефа (в том числе используя Shift). Более продвинутые господа придумали как импортировать карты из реального мира с помощью google earth, openTDD, делая так называемые heightmaps. Встроенный импорт работает только с raw форматами, надо использовать хак. Недавно вышел генератор карт
Игровой объект Unity
Игровой объект может состоять из скриптов-компонентов, некоторые из них встроенные, некоторые надо писать самому, тоесть:
- Местоположения (Transform)
- Внешнего вида (Mesh)
- Модели столкновения (Collider)
- Твёрдое тело (Rigidbody)
- Управляемый пользователь (CharacterController)
Свои скрипты добавляются очень легко перетаскиванием в инспектор и публичные переменные сразу переводятся в названия с пробелами и значением по умолчанию. Для игрового объекта добавленные компоненты и с точки зрения ООП являются инкапсулированными объектами, хотя и играют в большинстве своём роль свойств (т.е. прилагательных - движущийся, крутящийся, выбираемый и тп.). По синтаксису скрипты пишутся на Javascript, C# или Boo скриптах со своими прибамбасами - глобальными объектами Unity, некоторыми своими ключевыми словами..
Взаимодействие объектов
Теперь когда понятно что игровое пространство состоит из кучи моделей у которых есть свои свойства и своё поведение встаёт вопрос а как же сама игра должна писаться. В отличие от desktop- и web- приложений, игры и сетевые приложения более асинхронны и поточны, тут как правило нет монолитных глобальных классов - объекты общаются между собой и в этом сила масштабирования - надо просто объекту написать события которые он поддерживает согласно игровой механике.
Поскольку объекты можно вкладывать друг в друга как dom-блоки, то искать по иерархии объекты можно несколькими путями. Жалко что ребята изобретали велосипед, вместо того что-бы взять существующие аналоги из html/js
-
Сразу писать название компонента скажем myWorkerGuy.someColorParam
-
Поиск по иерархии - transform.Find("MyWorkerGuy") - аналог html'ного getElementById
-
По тєгам, через GameObject.FindWithTag ("Worker")
Компонент объекта доступен через - GetComponent("Moveable").
Ещё одно мощное решение - вместо поиска объекта с проверкой наличия метода и затем вызова его, можно просто послать сообщение - gameObject.SendMessage("BegForFood",true), причём метод вызывается у всех компонентов.
Каждый компонент наследует класс Monobehaviour (в Javascript синтаксисе объявлять не нужно) и именно с ним приходится работать описывая логику и расширяя наследуемые методы которые сами вызываются когда движок решит это нужным, например:
-
Invoke - вызов третьего метода, в том числе периодический, аналог call_user_method в php + cron
-
Awake - своего рода конструктор, вызывающийся когда все объекты уже существуют.
-
Start - конструктор второго рода, вызывается после Awake
-
Update - вызывается каждый фрейм. Сюда идёт основная логика.
-
FixedUpdate - вызывается каждый n-фрейм, полезен для вычислений твёрдых тел
-
LateUpdate - вызов после всех Update вызовов, полезен для камеры
-
OnGui - сюда идёт показ кнопок, цифр для управления