Геймдев для iPhone: как чужой движок помогает сделать свою игру
Герои 3D Max, Maya, Cinema и прочих графический 3D-студий в конце концов перестают удовлетворяться создавая и оживляя созданных персонажей анимацией.
🕛 17.12.2009, 11:54
Хочется с ними что-то сделать - красивое демо, базовую игру, что угодно, только бы вытащить свои творения за пределы 3D-редактора. Без уверенных навыков кодинга эти амбиции, скорее всего, так и остались бы амбициями или, прямо по Фрейду, превратились бы в комплексный невроз, но умные дядьки сели и создали игровые движки для Indie-девелоперов.Один очень хочет, но еще не может, другой может, но уже не хочет. Разговор идет о геймдеве, а точнее, о геймдеве для телефона, который случайно оказался чрезвычайно удачным игровым устройством.
Философия
Убрав сарказм и лирику, приходится признать, что кодить ресурсоемкие реал-тайм приложения не легко в принципе, и мобильная аппаратная платформа с жестоко лимитированными ресурсами только усложняет задачу. Тут и опытные программеры найдут над чем подумать и с чем побороться, не говоря уже про хобби, инди, студентов и прочих подвидов программистов. Но, тем не менее, присказка про Мастера Коду демонстрирует типового пользователя геймэнжина - очень хочет создать игру, но еще не имеет достаточно опыта и мастерства, чтобы справиться самостоятельно.
Впрочем, причин для использования чужого движка может быть предостаточно. Для небольших, кажуал игр, при минимальных сроках разработки проекта и по сотне других причин, использование готового движка со стороны может быть целесообразно и выгодно. В любом случае, мы сейчас не о целях, мы сейчас о следствиях. И именно поэтому никаких сравнительных списков и таблиц с характеристиками не будет. Я расскажу про движок Unity для Apple iPhone. Это не самое лучшее решение, не самое дешевое, не самое оптимальное, но оно подходит мне и еще паре тысяч пользователей по всему миру. В самом деле, чем не повод для статьи?
Про Unity
Как и большинство игровых движков, Unity получился из попытки создать игру. Но это было давно и под Мас. Сейчас с определенной долей старания и усердия одну и ту же игру можно выпустить под Mac, PC, iPhone, Wii или для игры через браузер. Естественно, там много оговорок: для каждой аппаратной платформы игру надо оптимизировать, переписывать управление, иногда логику и дальше по списку. Но сама возможность выглядит привлекательно.
Конкретно Unity iPhone - это достаточно удобная программа со здравой долей интеллекта и солидным списком возможностей. Она переваривает созданные в тех же тридэмаксах и майях модели, фотошоповские картинки и прочие популярные форматы аудио-видео-фото-3D. Кодить придется на C# или JavaScript. Там свои библиотеки, собственный API, а от языков взяли только синтаксис, для удобства кодеров.
За полным списком фишек и фишечек иди к ним на сайт (линк внизу), за ценами - туда же, но на другую страницу - тоже смотри внизу. Вопросов денег и лицензий я не касаюсь, равно, как не собираюсь агитировать в пользу этого конкретного движка и использования игровых движков вообще (согласитесь, это все же вопросы личных стратегий и предпочтений). Зато я покажу и расскажу, как легко и быстро создать простое игровое приложение для iPhone. Взглянули на врезку про инструментарий. Вдохнули. Выдохнули. К станку!
Инструментарий
Чем и как кодить для iPhone ][ писал не раз и не два. Если твоя эволюция в этом вопросе все еще остается на стадии чайника - читай:
Конь в яблоках: пишем троян для Apple iPhone
Куда податься телефонному кодеру: полный гид по мобильным платформам для программиста
Поднимаем бабло с iPhone: ведение в коммерческий кодинг с помощью официального SDK
XCoding под iPhone
Для всех остальных - извольте чеклист:
1. Компьютер типа Mac, с ОС не ранее Leopard и процессором Intel; 2. iPhone SDK, лучше поновее, но не бета; 3. Платный статус Apple iPhone Developer; 4. Дискретная видеокарта, чтобы использовать Occlusion Culling; 5. Собственно Unity iPhone.
Создаем игру
Что-то максимально простое, вроде плавающей по экрану головы Стива Джобса, создается буквально за полчаса. При этом, голова будет подвластна законам физики, показаниям акселерометра и пальцем тыкаться тоже будет.
Открываем редактор. Он предлагает создать новый проект и импортировать в него набор стандартных компонентов. Убираем галку с компонентов, делаем голый проект. Получаем вот такую картину.
Интерфейс Unity iPhone я настроил соответственно своим причудам и привычкам, поэтому скриншоты несколько отличаются от того, что увидишь ты. Здесь и далее речь идет про Unity iPhone 1.1 с лицензией Advanced.
Кнопочки, меню и элементы интерфейса интуитивно понятны и толково размусолены в мануале (Help->Unity Manual). На страницах место ограничено, лучше займем его рассмотрением более сложных вещей.
В окне Hierarchy выбираем Main Camera. В меню (GameObject->Create Other->Sphere) создаем сферу, увеличиваем ее размеры (Local Scale) в инспекторе до 100.
В Hierarchy выбираем Sphere, идем в меню и создаем свет (GameObject->Create Other->Directional Light). В Inspector можно настроить его параметры. У меня получилась вот такая безвкусица.
Открываем Finder, ищем фото препода по физике (только у меня препод по физике был такой му№к?), перетаскиваем его в окно Project. В меню правой кнопки есть Import Settings, где настраивается итоговый формат картинки. У меня картинка черно-белая, ширина большей стороны - 600 пикселей, поэтому в поле Max Texture Size я поставил 512, а Texture Format поменял на PRVTC 4 bits. Оптимальные настройки подбираются исходя из богатого опыта или методом научного тыка.
На скриншоте голова Стива (в конце концов, я решил не трогать физика) уже натянута на сферу. Ее просто надо перетянуть из окна Project на Sphere в Hierarchy. Еще я в два раза сплющил сферу по оси Z, потратил две минуты на настройки шейдера. При необходимости можно настроить тайлинг, покрутить другие кнопочки или использовать другой шейдер. Про тонкости работы с графикой надо писать отдельные книги, здесь и сейчас эту тему раскрыть не получится.
Теперь жмем магический Ctrl+S и сохраняем сцену. Если этого не сделать, а сохранить только проект, то все большинство произведенных действий потеряется.
Сохранились. Нажимаем кнопку Play - сфера с фото висят. Если нажать Play и крутить параметры (любого компонента), то после выхода из режима проигрывания, все проведенные настройки испортятся. Это не баг, это фича. И очень удобная.
В меню (GameObject->Create Other->Plane) создаем плоскость, кладем ее под сферу лицом вверх, настраиваем цвета, кидаем на нее текстуру, красим будку. Жмем Play - все равно все висит. И правильно висит, мы пока не включали физику. NVIDIA Physics заработает, если на плоскость и сферу добавить по Rigidbody. Сие колдунство лежит в Component->Physics->Rigidbody. Добавили. Кликаем Play. Завелось! Падает.
Только падает все, включая пол, который в моем случае покрыт текстурой травы. Отключаем Play и пытаемся крутить параметры Rigidbody, что бы падало как-то красивее, чтобы не падал пол и вообще, добавляем соли по вкусу.
Описание всех настроек и параметров есть в хелпе. Намекну, что траву и стены надо делать Is Kinematic. Стены - точно такие же плоскости, как и пол. Их можно клонировать прямо в Hierarchy, а можно каждую делать отдельно. Перед экраном стену тоже нужно сделать, добавить на нее Rigidbody, но убрать Mesh Renderer и повернуть ее "лицом вовнутрь". Эта стена нужна, чтобы сфера не вылетала за границы коробки.
Для пущего безобразия я добавил Spotlight и использовал самосветящийся LightmapOnly шейдер для стен, потолка и пола. На самом деле, можно обойтись и без текстур, материалов и прочего, но мы же эстеты. Ну хоть немного? Ладно, забудь. Лучше сохранись, подключи свой iPhone и нажми Ctrl+B.
Надеюсь, это не первая программа, которую ты пытаешься установить на свой iDevice, что с Xcode ты давно знаком и вообще уже не мальчик. В противном случае придется отложить Unity и даже ][, открыть много мануалов и читать, читать, читать… Возня с яблочными сертификатами - это то, что приходится пережить каждому айДевелоперу. Зато всего лишь один раз. Для каждого тестового устройства.
Unity iPhone производит шаманские движения, ты следишь за прогрессбаром и ждешь появления окна Xcode. После чего надо выбрать Device - 2.0 в качестве целевого устройства и нажать на Build and Go. Все. Программа запускается на iPhone, Джобс падает и покачивается. Для начала сойдет, учитывая, что ни строчки кода еще не писали. Так вот, пора исправлять - будем кодить.
Чтобы не закидывать наше приложение каждый раз на девайс, будем пользоваться Unity Remote (опять же, подробнее в справке). Эта штука здорово сокращает время и помогает помочь понять, что и где творится с переменными и объектами в реальном времени.
Кодинг
В окне Project есть кнопка Create, которая открывает меню с пунктом JavaScript. Вот ей и пользуемся. Новообразовавшемуся скрипту меняем имя на что-то вменяемое, жмем на него два раза и удивляемся старому доброму Simultron. Именно он используется для кодинга в Unity.
С ходу кодить не выйдет, говорил уже, что тут API собственный, только синтаксис родной (более-менее). В меню хелп есть пункт Script Reference - там подробно и почти хорошо рассказано про все. Бывалым перцам хватит минут 20 на ознакомление.
Да и на самом деле, все просто.
Скрипт надо перетянуть на объект, которым надо управлять, после чего, из скрипта становятся доступны все компоненты (окно Inspector) и много всего прочего. Скажем, сейчас охота заставить голову-сферу повиноваться данным акселерометра. Есть два пути - менять координаты сферы или влиять на физику, т.е. придавать сфере импульсы силы. Вспоминаем о компоненте Rigidbody и наводим о нем справку в Script Reference. К примеру, функция AddForce выглядит подходящей.
Физику надо обрабатывать в функции FixedUpdate, чтобы не зависеть от фреймрейта. На вход AddForce надо подать трехкомпонентный вектор, представляющий собой три оси координат. По умолчанию, оси X и Y настроены на портретную горизонтальную ориентацию устройства в пространстве, но нам милее пейзажный режим. То есть в этом самом векторе оси X и Y надо поменять местами. Простейший код выглядел бы примерно так:
var dir : Vector3; function FixedUpdate () { dir.x = iPhoneInput.acceleration.y; dir.y = iPhoneInput.acceleration.x; dir.z = iPhoneInput.acceleration.z; rigidbody.AddForce (dir * 1000); }
Цифра 1000 подобрана опытным путем, она зависит от размеров мира, массы тела и прочих физических деталей. Все остальное выглядит понятным. На самом деле впечатляет, что, фактически, одной строкой можно заставить фигуру двигаться по велению акселерометра.
Вращение через поглаживание экрана пальцем тоже реализуется одной строкой: rigidbody.AddTorque (touchPositionDelta.y, touchPositionDelta.x, 0);
Подготовим данные для этой самой строки. Пускай сфера реагирует только на два пальца и только если они двигаются, а не просто касаются. В зависимости от дистанции, которую пальцы проехали по экрану, будет зависеть сила вращения.
if (iPhoneInput.touchCount > 1 && iPhoneInput.GetTouch(0).phase == iPhoneTouchPhase.Moved) { var touchPositionDelta : Vector2 = iPhoneInput.GetTouch(0).deltaPosition; touchPositionDelta *= 10000;
Получившийся код вставляем ниже в функцию FixedUpdate. Сохраняем, строим, запускаем на iPhone.
Задачу выполнили - Джобс слушается пальцев и акселереметра. Другое дело, как.
Управление вышло корявенькое, стоило бы его подстроить, заставить определять положение устройства во время старта игры и считать эти данные за начало координат. Можно использовать встроенный GUI для вывода данных (скорость, ускорение, направление и т.д.) на экран устройства. Тут есть над чем поработать, но мы же демо писали, пытались просто разобраться, чем и как пользоваться. Режим песочницы и все такое.
Ну а если говорить о нормальных играх, то с Unity iPhone можно создать сложные и красивые игры. Глянь в сотню лучших в AppStore - там много всего с Unity сделано: Zombieville USA, Touch KO, GiJoyride, VansSK8 и много всего. Вот только действительно толковые игры делать далеко не так просто. Тут никакой геймэнжин не спасет. Но, опять же, это уже совершенно другая история, совсем другая статья. Тут же я говорю о том, что этот продукт жизнедеятельности датчан способен сократить время разработки опытным девелоперам или вообще открыть начинающим путь в геймдев.
Почему iPhone?
Потому что больше реально ничего нет. Есть специальные игровые устройства от Sony и Nintendo, но писать для них игры без вкладывания "много-много денег" не получится.
Своего N-Gage даже финское игровое подразделение стесняется. Реально, для Nokia кроме паззлов и пасьянсов ничего не напишешь - в подавляющем большинстве финских девайсов нет и намека на 3D-ускоритель.
Телефоны-андроиды изначально метили в бизнес-сектор, там и живут. Да и какие игры, если они спрятали почти весь доступ к Open GL. Вычеркиваем.
В будущем в качестве сколько-нибудь перспективной игровой платформы можно рассмотреть Zune HD. Если, конечно, ребята из Редмонда вернутся на нашу планету и откроют миру SDK.
Sony Ericsson и Samsung пытались двигаться в игровом направлении, и все еще даже пытаются, но… Но подождем, пока nVidia допилит свою Tegra до состояния, удовлетворяющего габаритам и батарейке мобильного телефона. А там посмотрим.
Ну а пока, тем не менее, только iDevice. Тем паче, что кроме аппаратной стороны вопроса, есть еще сугубо маркетинговая:
1. По миру продан 21 миллион телефоно-плееров Apple; 2. Основная часть владельцев iDevice’ов хочет и любит покупать игры; 3. Игры покупать легко, удобно, быстро и не очень дорого;
WWW
http://unity3d.com/unity/features - список всех фишек и фишечек
http://unity3d.com/unity/licenses - денежные вопросы
INFO
По каким-то датским причинам разработчики не дают простому юзеру скачать даже демку, но обычно делятся, если попросить у sales@unity3d.com. Желательно не признаваться, что русский…