Проект разработки мобильного приложения
Создание игрового приложения для мобильных платформ iOs и Android. Использование в приложении средств, позволяющих имитировать поведение тел под действием различных физических сил и законов. Написание скриптов для объектов, использующих физику.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 25.06.2017 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Список используемых определений и сокращений
Введение
1. Делегирование задач
2. Постановка задачи
3. Обзор необходимых инструментов и технологий
3.1 Blender
3.1.1 Особенности Blender
3.1.2 Создание модели
3.2 Adobe Photoshop
3.3 Unity
3.3.1 Выбор языка программирования
3.3.2 Работа в Unity
3.3.3 Физика в Unity
4. Разработка в Unity на C#
4.1 Настройка объектов редактора
4.2 Написание скриптов управления на C#
4.3 Написание скриптов для объектов, использующих физику
Заключение
Список используемых источников
Приложение. Исходный код
Список используемых определений и сокращений
Сцена (scene) - файл отвечающий за все объекты, используемые в один момент времени, в одном проекте, можно иметь много сцен, идущих в любом порядке.
Холст (canvas) - специальный объект, задающий правила отображения интерфейса на экране, холстов может быть несколько.
Скрипт - файл, соединяющий в себе информацию о переменных, работе функций и необходимых библиотеках.
Тачпад (touchpad) - сенсорная панель, ввод с которой осуществляется одним или несколькими пальцами.
Джойстик (joystick) - устройство ввода, может быть виртуальным, назначение может переназначаться.
Компоненты - правила поведения объекта в определенных условиях (в том числе правила отображения и положения)
Введение
С середины ХХ века, когда появились первые компьютеры и началась история Интернета, количество информации, получаемой людьми ежедневно, очень сильно возросло. В то же время, с того моменты мы обрели множество различных инструментов и методов, применимых для того, чтобы делиться собственными мыслями и идеями с другими людьми. В отличие от прошлого столетия, сейчас практически каждый человек, которому есть, что сказать, может поделиться этим с тысячами незнакомцев. Важно отметить, что эта цель может быть достигнута разными путями: например, с помощью видеохостингов, социальных сетей, блогов и так далее. При этом, информация зачастую передается не только в официальном тоне, но и в более неформальной форме.
Стоит признать, что в XXI веке многие важные идеи и темы для размышления поднимаются довольно нестандартными способами: если раньше их в основном передавали через фильмы и книги, теперь носителями стали еще и компьютерные игры. Хорошо сделанная компьютерная игра может очень качественно вызывать у игрока определенные эмоциональные реакции, заставляя его сопереживать и еще больше погружая его в смоделированную ситуацию.
В том числе по этой причине гейм-дизайн в современном мире считается довольной перспективной сферой. Мы заинтересовались в том, какие возможности предоставляются разработчику в процессе создания приложения и решили попробовать свои силы в этом.
Целью нашего проекта, в первую очередь, является применение полученных знаний о моделировании и программировании на практике. Мы уделяем большое внимание процессу и качеству разработки игрового приложения, пользуясь своими навыками. Основная идея работы - использование «физики» в игре. То есть, в приложении задействованы средства, позволяющие имитировать поведение тел под действием различных физических сил и законов.
1. Делегирование задач
В процессе работы каждый из участников проектной команды провел обширную работу по поиску и изучению тематических материалов, связанных с моделированием и программированием. Кроме того, командой под руководством научного руководителя было разработано и принято техническое задание. Затем совместно был составлен план работы над проектом, временные рамки этапов. также было проведено распределение обязанностей между участниками.
3D моделированием и работой над интерфейсом занималась Надежда Богаткова. Средствами программного пакета Blender были созданы 3D объекты для дальнейшего использования в приложении. В редакторе движка Unity были созданы и настроены холст (canvas) и его дочерние объекты, написаны скрипты на языке C# для управления персонажем и камерой, нарисован интерфейс при помощи графического редактора Photoshop.
Работой с 3D объектами и их физикой занимался Иван Копылов. Создан и настроен проект игрового приложения на движке Unity для мобильных и стационарных операционных систем. Имплементирован результат работы со сторонним программным обеспечением. Настроены объекты, включая все, использующие физику, и написаны скрипты на C# для них, в том числе для управления объектами и для взаимодействия между ними.
2. Постановка задачи
мобильный платформа приложение физика
Цель данного проекта - создание игрового приложения для мобильных платформ iOs и Android. Чтобы максимально использовать все доступные средства компьютерной физики, было принято решение создать универсальную программу, в которой пользователь сможет разбивать на части самые различные 3D модели. При этом приложение выполнено в несерьезном стиле в виде мобильной игры. Такой подход однозначно выгоден с точки зрения распространения приложения и подходит для того, чтобы заинтересовать потенциального пользователя в том, как работает компьютерная физика. Все вычисления проводятся в реальном времени.
Для того, чтобы достичь поставленной цели, потребовалось организовать работу с разным программным обеспечением с последующим объеденением в общий проект в среде Unity.
По нашему мнению приложение должно соответствовать следующим принципам:
1. Оно должно быть интуитивным, пользователь не должен тратить время на обучение управлению.
2. Дизайн должен быть одинаково удобен для использования с разных устройств.
3. Добавление нового контента через редактор не должно быть слишком долгим и сложным. Код должен быть универсальным.
Было принято совместное решение дать пользователю следующие возможности:
1. Управлять движением персонажа, к которому прикреплена камера.
2. Управлять направлением взгляда персонажа и камеры.
3. Производить движение подручными средствами для инициализации разрушения объектов.
3. Обзор необходимых инструментов и технологий
3.1 Blender
Blender - профессиональное, и при этом бесплатное программное обеспечение, используемое для создания и редактирования трёхмерной компьютерной графики. Пакет включает в себя множество различных средств моделирования, рендеринга, а также анимации. С помощью программы можно создавать интерактивные игры. В последнее время Blender пользуется все большей популярностью среди разработчиков, в силу быстрого и стабильного развития, обусловленного слаженной работой профессиональной команды проекта. Одна из главных особенностей пакета - его небольшой размер (если сравнивать с другими часто используемыми пакетами для 3D-моделирования). Среди основных функций программы есть работа с различными геометрическими примитивами, в том числе полигональными моделями, скульптурное моделирование, универсальные средства анимации и механизмы рендеринга (рис1).
Рис 1 Общий вид программы Blender
Несмотря на свою доступность, Blender обладает достаточно сложным для изучения интерфейсом. Почти каждой функции программы сопоставлено соответствующее сочетание клавиш, и при этом, в силу огромного количества возможностей пакета, каждая клавиша включена более чем в одно сочетание. Поэтому для изучения программы были использованы многочисленные Интернет ресурсы, такие как видео-уроки, статьи, руководства и программная документация. К тому же, как оказалось, русскоязычных материалов по данному пакету намного меньше, чем информации на английском языке.
3.1.1 Особенности Blender
Подробнее говоря о пакете Blender, хочется упомянуть о некоторых его особенностях. Одно из главных отличий от других 3D-редакторов состоит в наличии нескольких различных режимов редактирования, между которыми можно переключаться в процессе работы. Два основных режима - Объектный режим (Object mode) и Режим редактирования (Edit mode). Они отличаются тем, что первый обычно используется для манипуляций с индивидуальными объектами (например, можно перемещать модель, менять ее размер, вращать целиком, редактировать размещение объектов в сцене (scene)), в то время как второй режим дает возможность работать непосредственно с фактическими данными объекта (например, при работе с полигональными моделями, можно редактировать положение вершин (vertex), менять размер рёбер (edge) и граней (face)).
3.1.2 Создание модели
Модель, используемая для создания приложения, является полигональным объектом, созданным при помощи различных функций из базового объекта (mesh) программы Blender. Для начала работы в сцене (scene) был создан куб (cube). Затем в Режиме редатирования (Edit mode), с помощью экструдирования (extrude), масштабирования (size), смещения (grab) и поворота (rotate) различных деталей объекта создавалась форма будущей 3D-модели. Некоторые грани и рёбра были разбиты на меньшие части с помощью инструмента Нож (knife). Для удобства работы и редактирования применялся параметр Visible Selection, позволяющий видеть задние вершины и грани фигуры.
C помощью вышеуказанных манипуляций было создано туловище модели (рис2).
Рис 2 Туловище 3D-модели в Blender
Для создания симметрично расположенных ног (рис3), помимо стандартных средств моделирования, применялся модификатор Зеркало (Mirror), позволяющий «отразить» объект. Модификатор Mirror отражает сетку объекта (mesh) вдоль одной или нескольких из локальных осей (X, Y, Z), которые должны проходить через его центр. Тем не менее, в качестве центра отражения может быть использован и другой объект (mirror object) в сопряжении с его локальными осями. Данный модификатор способен соединять вершины вместе в пределах указанного расстояния (merge limit), а также отслеживать и не допускать пересечения зеркальной части объекта (сlipping). Кроме того, одним из важных и полезных свойств модификатора является возможность отражать группы вершин (Vertex Group) и UV-координаты.
Аналогичным образом создаются руки модели.
Рис 3 Туловище и ноги 3D-модели в Blender
Для создания неровной поверхности, имитации грубого камня использовалась функция Подразделения (subdivide). Данное средство разбивает выбранные грани и поверхности на части, добавляя необходимые вершины и соблюдая выбранные настройки. По умолчанию функция разделяет выбранные объекты пополам, но количество разрезов можно увеличить. Помимо прочего, Subdivide обладает следующими подключаемыми свойствами:
· Fractal - сдвигает вершины в случайных направлениях, после того, как объект разбит (рис4);
Рис 4 Разбиение поверхности с параметром Fractal в Blender
· Along Normal - сдвигает вершины вдоль их нормалей, вместо случайных направлений (рис5);
· Random Seed - заменяет случайный параметр seed в функции Fractal, создавая разный результат для каждого нового значения seed (рис5).
Рис 5 Разбиение поверхности с параметрами Along Normal и Random Seed в Blender
Согласно задумке, в игровом приложении модель должна разбиваться на отдельные объемные части и как бы рассыпаться от удара. Для того, чтобы реализовать эту идею, первоначальную модель нужно было каким-либо образом разбить на детали. На наш взгляд, наиболее подходящим средством для этого оказался аддон Cell Fracture. Он обладает множеством различных настроек, позволяющим применять его для различных целей.
Рис 6 Окно настроек аддона Cell Fracture в Blender
3.2 Adobe Photoshop
Adobe Photoshop - невероятно популярный многофункциональный графический редактор. Изначально программа была разработана для редактирования изображений для полиграфии, но в настоящее время зачастую используется в веб-дизайне и многих других сферах, в том числе и среди CG-художников (Computer Graphic - компьютерная графика). Главными преимуществами Photoshop при рисовании являются возможность работы на разных слоях, с помощью которых можно взаимодействовать с нужными объектами изображения, не задействуя при этом остальные (например, обработка контура и заливки изображения может проводиться по отдельности), а также огромный набор различных кистей, как гладких, так и текстурных.
Средствами среды Adobe Photoshop производилась отрисовка интерактивных кнопок. Возможность регулировать прозрачность слоев (opacity) позволила сделать заливку кнопок полупрозрачной (рис7).
Программное обеспечение использовалось в комплекте с графическим планшетом Wacom, что значительно облегчило работу над формой.
Рис 7 Отрисовка полупрозрачных кнопок в Adobe Photoshop
3.3 Unity
Для данной работы был использован свободный кроссплатформенный игровой движок Unity, разработанный компанией Unity Technologies и зачастую используемый для разработки видеоигр на компьютерах, консолях, мобильных устройствах и веб-сайтах. На данный момент Unity - это одна из самых популярных платформ, даже среди профессиональных гейм-дизайнеров. Множество бесплатных библиотек и обучающих материалов оказываются очень полезны для изучения и работы. На популярном зарубежном Интеренет ресурсе coursera.org, созданном как платформа для онлайн-обучения и вмещающем множество курсов по разным наукам и областям знаний, также существует курс, обучающий основам работы в Unity, доступ к которому можно получить бесплатно.
Если говорить подробнее, то Unity - это многофункциональный инструмент для разработки 2D и 3D приложений и игр, работающий на операционных системах Windows, Linux и OS X. При этом, созданные на Unity приложения работают на Windows, OS X, Windows Phone, Apple iOS, Android, Linux, а также на многочисленных игровых приставках, таких как Wii, PlayStation 3, PlayStation 4, Xbox 360 и т.д. Помимо этого, можно создавать приложения для запуска в браузерах, для этого применяется специальный подключаемый модуль Unity Web Player.
Редактор Unity обладает простым и интуитивным Drag&Drop интерфейсом, программа состоит из отдельных настраиваемых окон. К тому же, отладку игры или приложения можно производить непосредственно в редакторе.
3.3.1 Выбор языка программирования
Игровой движок поддерживает три языка программирования: JavaScript, C# и Boo. Для нашего проекта в качестве языка разработки был выбран С#.
C# (Си шарп) - это гибрид между C и C++, язык программирования Microsoft, изначально предназначавшийся для работы над приложениями для платформы.NET Framework и разработанный как конкурент Java. Это объектно-ориентированный язык, распологающий полиморфизмом, перегрузкой операторов, указателями на функции-члены классов и т.д. Поскольку в течение своего обучения мы неоднократно взаимодействовали с C-подобным синтаксисом, из вариантов доступных движку Unity был сделан выбор именно в пользу этого языка.
3.3.2 Работа в Unity
Проекты в Unity состоят из сцен (уровней), которые представляют из себя файлы, содержащие игровые миры с собственными наборами объектов (моделей), сценариев и настроек. Сами по себе объекты включают в себя наборы компонентов, с которыми взаимодействуют программные скрипты. Также объекты обладают названиями, тегами (метками) и слоями, на которых они должны отображаться. К любому объекту в сцене привязан компонент Transform, который хранит данные о местоположении, повороте и размерах объекта в координатном виде по отношению к трём осям.
Что очень важно для реализации нашей задумки, так это то, что Unity поддерживает физику твёрдых тел, а также ткани и физику типа Ragdoll (тряпичная кукла). В программе есть удобная система наследования, позволяющая связывать объекты необходимыми отношениями. Дочерние объекты автоматически будут повторять любые изменения масштаба, поворота и позиции объекта-родителя. Скрипты же присоединяются к каждому из объектов в виде отдельных компонентов.
3.3.3 Физика в Unity
Для правдоподобной реализации физического поведения тел, игровой объект необходимо правильно ускорить, а также задействовать столкновения, гравитацию и прочие силы. В Unity встроены физические движки, обеспечивающие компоненты для симуляции физики. С помощью настройки различных параметров можно создавать так называемые пассивно реалистичные объекты, которые перемещаются в результате взаимодействия с другими объектами и падений, но при этом не начинают двигаться сами по себе. Управление физикой происходит с помощью скриптов.
В целом, Unity обладает двумя физическими движками - для 3D и для 2D физики. Основные понятия в них идентичны, но реализованы с различными компонентами.
Rigidbody (Твёрдое тело) - это основной компонент, отвечающий за физическое поведение объекта. Прикрепления этого компонента достаточно для того, чтобы объект сразу же начал реагировать на гравитацию. Если подключить один или несколько компонентов Collider (о них подробнее далее), то и при столкновениях объект будет передвигаться. Важно отметить, что Rigidbody управляет перемещениями тела, к которому прикреплен, поэтому разработчики советуют воздержаться от воздействия на объект из кода посредством изменения свойств Transform (трансформирование), Position (положение) или Rotation (поворот). Вместо этого стоит применять силы для воздействия на объект и тем самым позволить движку самостоятельно рассчитать результаты.
Colliders (Коллайдеры) - это компоненты, которые определяют форму объекта с целью физического взаимодействия (коллизий). Коллайдер, который остается невидимым в игре, должен обладать той же формой, что и игровой объект. По сути, коллайдер явлдяется вспомогательным объектом в виде сетки, которая находится вокруг модели или части модели и взаимодействует с другими объектами, если те, в свою очередь, окружены соответствующими коллайдерами. Существуют разные виды коллайдеров. Вот самые основные из них:
· Box collider - физическая модель создает куб, в который попадает вся модель объекта;
· Sphere collider - физическая модель создает сферу, в которую попадает вся модель объекта;
· Mesh collider - физическая модель полностью повторяет реальную геометрию объекта.
4. Разработка в Unity на C#
4.1 Настройка объектов редактора
Параллельно с разработкой анимированных 3D моделей, в программе Unity был создан проект для написания приложения использующего 3D. Первым делом был создан объект (GameObject) Игрок (Player). Для удобства в процессе разработки он имел компонент MeshRenderer, чтобы в любой момент времени быть видимым разработчику. Камера сразу была настроена и перенесена внутрь объекта (рис8), чтобы сделать вид от первого лица.
Рис 8 Камера Main Camera внутри объекта Player
Затем был создан и настроен Холст (Canvas) для адаптивного интерфейса для разных разрешений и экранов. В его компоненте CanvasScaler в значении UI Scale Mode был выбран режим Constant Pixel Size. Объекты интерфейса на этом холсте будут сохранять свой размер в пикселях, таким образом, не становясь слишком маленькими на экранах телефонов. Первым объектом на холсте стала картинка джойстик для управления углом поворота объекта Игрока (RotatingJoystick). В компоненте Image стоит галочка Raycast Target (рис9), отвечающая за возможность перехвата луча, например, идущего вглубь экрана от мышки или пальца на тачпаде устройства.
Рис 9 Объект интерфейса RotatingJoystick
4.2 Написание скриптов управления на C#
Первыми скриптами стали ArrowsJoystick.cs, RoundJoystick.cs и MovePlayer.cs для джойстиков и объекта игрока соответственно. Основными функциями первых двух являются OnPointerDown, OnDrag и OnPointerUp, которые вызываются при пересечении луча идущего от указателя с объектом, использующим скрипт (работают как на мышь, так и на палец на тачпаде).
Когда указатель оказывается нажат (палец коснулся экрана либо на мышке нажали левую кнопку), вызывается функция OnPointerDown, которая в данном случае только вызывает OnDrag. Та в свою очередь вызывается каждый кадр осуществления нажатия указателем. Screen Point To Local Point In Rectangle переводит точку, в которой находится указатель, в локальные координаты области, то есть джойстика. Затем полученная позиция по оси y относительно середины джойстика математически приводится к виду от -1 до 1. OnPointerUp сработает после этого, чтобы вернуть значение джойстика на место.
По аналогии работает левый джойстик, предназначенный для передвижения игрока - MovementJoystick (со скриптом RoundJoystick.cs), но он устроен сложнее, поэтому работать приходится с вектором.
После того как мы получаем Vector2 (pos) мы переводим его в Vector3 (inputVector), оставляя 0 в значении y (потому что игрок не будет передвигаться вертикально). Если длина вектора оказывается больше 1, вектор нормируется. Это сделано для того, чтобы одинаково ограничить скорость передвижения игрока во все стороны. После окончания взаимодействия с джойстиком вектор принимает значение 0 во всех трех направлениях.
Скрипт MovePlayer.cs основной своей функцией имеет стандартную функцию Update, вызывающуюся каждый кадр, пока активен объект, использующий скрипт. С помощью редактора и глобальных переменных, указаны оба джойстика и желаемые максимальные скорости поворота и передвижения. Каждый кадр скрипт проверяет наличие вектора передвижения с большей длиной, чем 10% от джойстика (чтобы пользователь мог держать пальцы на джойстиках и не влиять на позицию своего персонажа). Если вектор такой, персонаж передвигается в этом направлении пропорционально времени, прошедшему с предыдущего кадра, таким образом, движение объекта вместе с камерой максимально гладкое. Если такого вектора нет, проверяются также стандартные методы управления (например, клавиши W, A, S, D для компьютера). Таким образом, приложение можно использовать без тачпада, используя не только мышь, но и клавиатуру.
Следующее, что проверяет код - наличие значения желаемого поворота, большее, чем 10% от картинки джойстика (значение меняется от -1 до 1, следовательно, длина отрезка от 0 до -0.2 равна 10% от всего промежутка). В данном случае поворот осуществляется вокруг вертикальной оси y.
Следующим шагом разработки стало добавление возможности управления предметом, например, нанесения удара. Для этого на холст была добавлена полностью прозрачная «картинка» Screen, которая, тем не менее, является объектом для пересечения с лучами (Raycast Target). Предыдущие джойстики были помещены в список детей объекта Screen, в том числе, чтобы первыми перехватывать луч, не передавая его дальше. Если пользователь будет использовать джойстики, Screen не будет получать сигналов. Если же указатель окажется активным в любой другой точке экрана, будет вызвана знакомая функция OnPointerDown скрипта WeaponScript.cs, прикрепленного к только что созданному объекту Screen.
После того как указатель станет активным код запомнит его положение, но не будет предпринимать ничего до момента, когда тот деактивируется. После этого будет построен вектор от конечного положения к начальному. Длина вектора проверяется, чтобы случайные короткие прикосновения пользователя не являлись сигналом для программы. Также проверяется флаг bool isOn скрипта WeaponHit.cs, сообщающий о том, что сейчас уже осуществляется удар. Если удар, не осуществляется, а вектор достаточно длинный, скрипт WeaponScript.cs вызывает функцию Prepare скрипта WeaponHit.cs, отсылая нормирвоанное значение вектора. Чтобы рассказать о скрипте WeaponHit.cs, опишем объект, к которому он относится.
Для оружия понадобилось два объекта, один из которых не имеет модельки, но является основным - hammerPivot (рис10). Его положение будет влиять на место, вокруг которого крутится молот (рис11) при ударе. Компонента RigidBody этой точки указана в компоненте HingeJoint молота hammer clean. Таким образом физика не даст молоту оторваться от этой точки, которая будет передвигаться вместе с игроком и камерой, благодаря тому, что является дочерним объектом объекта Player.
Рис 10 Точка hammerPivot относительно hammer clean и ее компоненты
Рис 11 Объект hammer clean и его компоненты
В этой же компоненте, отвечающей за притяжение объекта к точке, стоит галочка использовать натяжени Use Spring. Сила будет тянуть молот в исходное положение, когда она установлена.
4.3 Написание скриптов для объектов, использующих физику
Рассмотрим ранее упомянутый скрипт WeaponHit.cs объекта hammerPivot:
Стандартная функция Start срабатывает при включении скрипта (при включении объекта) и находит необходимые компоненты, к которым собирается обращаться скрипт, чтобы не искать их каждый раз. Функция Prepare вызывается из описанного скрипта WeaponScript.cs. Флаг bool isOn становится равен true на время выполнения двух функций. hammerPivot возвращается на исходное место с помощью поворота на угол, обратный последнему использованному (в первый раз 0). Затем из полученного вектора высчитывается необходимый угол поворота, и производится поворот. Вызывается следующая функция Hit, в которой к hammer clean применяется сила по направлению forward. В этот же момент натяжение перестает действовать, давая hammer clean свободно прокрутиться вокруг hammerPivot в течение 1 секунды. После этого еще за пол секунды hammer clean возвращается назад и скрипт можно запустить заново. Таким образом, направление удара выбирается пользователем путем проведения пальцем по любому участку экрана и осуществляется, как только игрок оторвет его от тачпада.
Поскольку у hammer clean целых два коллайдера (на ручку и наконечник) и компонента твердого тела RigidBody, он будет взаимодействовать с коллайдерами других объектов, чтобы описать, что должно произойти в данном случае, был написан код скрипта Gravity.cs, который можно впоследствии прикрепить к каждой части объекта, с которым подразумевается взаимодействие (рис12).
Рис 12 Перечень объектов, составляющих общую модельку, и их общие компоненты
Поскольку у скрипта нет глобальных переменных, в редакторе отображается только название. Функция Start, как и в случае со скриптом WeaponHit.cs, осуществляет поиск необходимых компонент заранее. OnCollisionEnter срабатывает при столкновении двух коллайдеров. Далее, если у объекта, который вступил во взаимодействие с объектом, использующим скрипт, присутствует тэг “real” (а у hammer clean он выбран). У первого включается гравитация и появляется аналогичный тэг, чтобы он мог вызвать цепную реакцию (до этого все объекты находятся в невесомости, чтобы сохранять цельный вид) даже при попадании в объект, который не относится к тому же родителю. При этом считается, что весь родительский объект разрушен, раз часть его была отколота, для этого вызывается функция BecomeAlive скрипта ParentGravity.cs:
Чтобы функция вызывалась только раз для каждого объекта, используется флаг bool alive. Цикл с количеством итераций, равным количеству дочерних объектов, включает всем им гравитацию и устанавливает тэг “real”.
Если какой-то неразрушенный (а также не являющийся декорацией) объект окажется слишком близко к игроку, в скрипте MovePlayer.cs сработает функция OnTriggerEnter, включающая экран поражения:
Итоговый результат был протестирован при управлении с подключенного планшета с оперативной системой iOS (рис13).
Рис 13 Скриншот редактора
Заключение
Цель данной работы заключалась в проектировании и разработке игрового приложения для мобильных платформ на основе движка Unity. Кроме того, вручную создавалась 3D-модель, задействованная в приложении.
В рамках работы над проектом были всесторонне рассмотрены технологии написания программных скриптов на языке C#. А также изучены различные техники 3D-моделирования в программе Blender.
Приложение наглядно демонстрирует применение физики в игровом мире. В процессе создания мы ознакомились с основами гейм-дизайна и попробовали свои силы в этой сфере.
Список используемых источников
[1]P. Barr, Video Game Values: Play as Human-Computer Interaction, 1st ed. Wellington: Victoria University of Wellington, 2008, pp. 67-71.
[2]S. Bura, "Gamasutra - Emotion Engineering: A Scientific Approach For Understanding Game Appeal", Gamasutra.com, 2017. [Online]. Available: http://www.gamasutra.com/view/feature/3738/emotion_engineering_a_scientific_.php?print=1. [Accessed: 13- Feb- 2017].
[3]E. Aarseth, Playing Research: Methodological approaches to game analysis, 1st ed. Bergen: Spilforskning.dk, 2004.
[4]A History of the Unity Game Engine, 1st ed. Worcester: WORCESTER POLYTECHNIC INSTITUTE, 2017.
[5] Официальный сайт Unity, URL: https://unity3d.com/ru (дата обращения 16.04.2017).
[6] Официальный сайт Blender, URL: https://www.blender.org/ (дата обращения 22.04.2017).
Приложение. Исходный код
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class RoundJoystick: MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
private Image bgImg;
public Vector3 inputVector;
private void Start()
{
bgImg = GetComponent<Image> ();
}
public virtual void OnDrag(PointerEventData ped)
{
Vector2 pos;
if(RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
{
pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
inputVector = new Vector3 (pos.x*2 - 1, 0, pos.y*2 - 1);
inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized: inputVector;
}
}
public virtual void OnPointerDown(PointerEventData ped)
{
OnDrag (ped);
}
public virtual void OnPointerUp(PointerEventData ped)
{
inputVector = Vector3.zero;
}
}?
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class ArrowsJoystick: MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
private Image bgImg;
[Range(-1, 1)]public float inputFloat;
private void Start()
{
bgImg = GetComponent<Image> ();
}
public virtual void OnDrag(PointerEventData ped)
{
Vector2 pos;
if(RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
{
pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
inputFloat = pos.x * 2 + 1;
inputFloat = (Mathf.Abs(inputFloat) > 1.0f) ? inputFloat/Mathf.Abs(inputFloat): inputFloat;
}
}
public virtual void OnPointerDown(PointerEventData ped)
{
OnDrag (ped);
}
public virtual void OnPointerUp(PointerEventData ped)
{
inputFloat = 0;
}
}?
using UnityEngine;
using System.Collections;
public class MovePlayer: MonoBehaviour
{
public RoundJoystick movementJoystickDir;
public ArrowsJoystick rotatingJoystickDir;
public float movementSpeed = 3.0f;
public float rotatingSpeed = 90.0f;
public GameObject lost;
void Update()
{
if (movementJoystickDir.inputVector.magnitude>0.2f) {
transform.Translate (movementJoystickDir.inputVector * movementSpeed * Time.deltaTime);
} else {
var x = Input.GetAxis("Horizontal") * Time.deltaTime;
var z = Input.GetAxis("Vertical") * Time.deltaTime;
transform.Translate (x * movementSpeed, 0, z * movementSpeed);
}
if (rotatingJoystickDir.inputFloat < -0.2f || rotatingJoystickDir.inputFloat > 0.2f) {
transform.Rotate (0,(rotatingJoystickDir.inputFloat)*rotatingSpeed*Time.deltaTime,0);
}
}
void OnTriggerEnter(Collider col){
if (col.tag != "real" && col.tag != "ground")
lost.SetActive (true);
}
}?
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class WeaponScript: MonoBehaviour, IPointerUpHandler, IPointerDownHandler
{
private Vector2 hitVector;
public WeaponHit weapon;
public virtual void OnPointerDown(PointerEventData ped)
{
hitVector = ped.position;
}
public virtual void OnPointerUp(PointerEventData ped)
{
hitVector -= ped.position;
if (hitVector.magnitude > 100 && !weapon.isOn)
weapon.Prepare (hitVector.normalized);
}
}?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponHit: MonoBehaviour
{
public float force=500;
private float angle=0;
private Rigidbody hammerRigidBody;
private HingeJoint hammerJoint;
public bool isOn=false;
private void Start()
{
hammerJoint = gameObject.GetComponentInChildren<HingeJoint> ();
hammerRigidBody = hammerJoint.GetComponent<Rigidbody> ();
}
public void Prepare (Vector2 hitVector)
{
isOn = true;
transform.RotateAround ((transform.position+transform.right*0.5f), transform.forward, -angle);
angle = Vector2.Angle (hitVector, new Vector2 (1, 0));
angle = (hitVector.y > 0) ? angle: angle*-1;
transform.RotateAround ((transform.position+transform.right*0.5f), transform.forward, angle);
StartCoroutine (Hit ());
}
public IEnumerator Hit()
{
hammerJoint.useSpring = false;
hammerRigidBody.AddForceAtPosition (transform.forward*force, transform.position);
yield return new WaitForSeconds (1);
hammerJoint.useSpring = true;
yield return new WaitForSeconds (0.5f);
isOn = false;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gravity: MonoBehaviour
{
private Rigidbody rig;
private ParentGravity pargrav;
private void Start()
{
rig=GetComponent<Rigidbody> ();
pargrav=transform.parent.GetComponent<ParentGravity> ();
}
void OnCollisionEnter(Collision col)
{
if (col.collider.tag == "real")
{
rig.useGravity = true;
tag = "real";
pargrav.BecomeAlive ();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParentGravity: MonoBehaviour
{
private float childs;
private bool alive=false;
public void BecomeAlive ()
{
if (!alive)
{
childs = transform.childCount;
for (int i = 0; i < childs; i++)
{
transform.GetChild (i).GetComponent<Rigidbody> ().useGravity = true;
transform.GetChild (i).tag = "real";
}
alive = true;
}
}
}
Размещено на Allbest.ru
Подобные документы
Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.
курсовая работа [987,1 K], добавлен 27.06.2019Разработка клиент-серверного игрового приложения на примере игры в шашки для мобильных устройств на базе операционной системы Android. Обзор мобильных платформ. Экраны приложения и их взаимодействие. Графический интерфейс, руководство пользователя.
курсовая работа [2,6 M], добавлен 15.06.2013Мобильные операционные системы. Основные характеристики систем iOS и Android, их достоинства, недостатки и индивидуальные возможности. Анализ преимуществ лидирующих мобильных платформ для разработки приложения. Основные различия в механизмах безопасности.
дипломная работа [806,5 K], добавлен 01.01.2018Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.
курсовая работа [1,6 M], добавлен 19.04.2017Знакомство с особенностями и этапами разработки приложения для платформы Android. Рассмотрение функций персонажа: бег, прыжок, взаимодействие с объектами. Анализ блок-схемы алгоритма генерации платформ. Способы настройки функционала рабочей области.
дипломная работа [3,4 M], добавлен 19.01.2017Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.
дипломная работа [1,5 M], добавлен 09.11.2016Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.
дипломная работа [1,6 M], добавлен 08.07.2015Анализ популярных игровых приложений. Жанр – аркады с геймплеем Runner. Получение продукта, ориентированного на людей, использующих мобильные устройства на базе Android, и предназначенный для развлечения пользователей. Визуальная составляющая приложения.
дипломная работа [742,7 K], добавлен 10.07.2017Изучение существующих подходов к использованию компьютерных игр в образовательном процессе. Разработка и реализация проекта игрового обучающего приложения на мобильной платформе. Выбор платформы и средств реализации игрового обучающего приложения.
дипломная работа [3,4 M], добавлен 12.08.2017Рассмотрение игр, схожих по жанру и модели распространения с разрабатываемым приложением. Выбор среды разработки и сторонних библиотек. Проектирование интерфейса и подготовка графических материалов приложения. Особенности введения в игру микротрансакций.
дипломная работа [3,1 M], добавлен 18.11.2017