КУРСОВАЯ РАБОТА
РУКОВОДИТЕЛЬ:
КУЗНЕЦОВА В.Э.
ДАТА ЗАЩИТЫ:
______________________
ОЦЕНКА: _____________
ПОДПИСЬ___________
ТУЙМАЗЫ 2021
1
Содержание
Введение..........................................................................................................3
Глава 1. Теоретическая часть.....................................................................5
1.1. История игрового движка Unity...........................................................5
1.2. Особенности Unity в создании виртуальной рабочей среды..........11
1.3. Жанры игр............................................................................................16
Глава 2. Практическая часть....................................................................23
2.1. Среда Unity как инструмент разработки...........................................23
2.2. Функционал проекта...........................................................................25
2.2. Взаимодействие с игрой и её возможные доработки......................25
Заключение...................................................................................................37
2
Введение
4
Глава 1. Теоретическая часть
1.1 История игрового движка Unity
Unity (рис. 1) первая версия которого была создана в июне 2005 года
тремя людьми: Дэвидом Хелгасоном, Джошимом Анте и Николасом
Френсисом. Их целью было создание доступного любительского движка с
удобным графическим интерфейсом, и первая версия движка имела схожий с
Final Cut пользовательский интерфейс, работающий по принципу drag-and-
drop (то есть перетягивание элементов между подменю программы).
Изначально Unity работал только под macOS, однако разработчики отлично
понимали, что доля яблочной ОС на рынке невелика, а уж создателей игр на
ней вообще мало. Поэтому первое глобальное добавление, появившееся в
августе 2005 в версии 1.1 — это возможность сборки игр под Windows и
поддержка плагинов C/C++. Однако на тот момент полноценным игровым
движком Unity назвать было трудно — он не поддерживал множество
графических эффектов и подходил разве что для создания качественных
анимаций. Разработчики исправили это недоразумение в версии 1.2 от
декабря 2005 года — добавили эффекты постобработки, рэгдолл, тени,
встроенный скрипт управления персонажем, расширили возможности
редактора скриптов. После этого движком стали интересоваться инди-
разработчики — поэтому выросло количество ошибок со старыми
видеокартами и системных проблем с драйверами, которые создатели движка
фиксили еще год. Последняя версия — 1.6.2 — вышла в мае 2007: да, до
CryEngine 2 того же года она не дотягивала, однако создавать простые игры
на Unity уже тогда было удобно, да и основные ошибки уже были
исправлены.
5
Рис. 1 Логотип Unity
8
Отслеживание загрузки процессора, видеокарты и памяти на
временной шкале в режиме реального времени.
Добавление полноценного 64х-битного редактора.
Интеграция Terrain Speedtree.
Добавление новых API для 2D физики и редактора анимации в
Box2D, обновление 3D физики до nVidia PhysX3.
Просмотр сцен в HDR-режиме.
Настройки для рендера сцены с помощью заполняющего (Ambient)
света.
Улучшена работа LOD (теперь нет падения производительности для
непропорционально скейлированной геометрии).
Новые формы для препятствий Nav Mesh и сжатые текстуры для
Cubemaps.
Поддержка джойстика для Windows Store.
Внутриигровая реклама без сторонних плагинов (к сожалению —
трудновырезаемая, так как зашита в саму игру в виде текстур и
показывается даже без наличия интернета).
Повторяющаяся анимация может передвигать персонажа.
В Unity 5.1 в июне 2015 в основном исправили ошибки и сделали
поддержку VR (виртуальной реальности) — на первых порах только Oculus
Rift. В сентябре того же года вышло минорное обновление 5.2 — добавлены
новые возможности для разработчиков приложений под Android, для работы
со звуком добавлена поддержка Spatialization API для модулей расширений
аудио. В версии 5.3 (декабрь 2015) изменений уже больше:
Новые инструменты: обновленный MonoDevelop, одновременное
редактирование нескольких сцен, инструменты для 2D,
автоматическое тестирование.
9
Оптимизация графики, включая новое ядро OpenGL,
экспериментальная поддержка Metal в OS X и обновленная система
частиц.
Улучшенная поддержка WebGL и iOS 9.
Поддержка интегрированных внутриигровых покупок.
Добавлена экспериментальная поддержка DirectX 12.
В 5.4 (август 2016) улучшили графический рендер, повысивший
качество визуальной составной (например, теперь нет шумов в затененных
областях). Значительно доработана и улучшена поддержка VR-платформ.
Добавлены настраиваемые частицы, новые зеркальные эффекты, улучшен
импорт графики. Самым крупным нововведением в последней на данный
момент Unity 5.5 (ноябрь 2016) стала поддержка Microsoft HoloLens (очков
дополненной реальности от Microsoft).
Для разработчика игровых приложений движки представляют собой
программную среду, в которой он ведет разработку проекта. Ее
использование позволяет не заниматься такими рутинными вещами, как
описание работы с графикой, звуком и физической моделью. Но это не
значит, что программировать не придется ничего. Разработчику все равно
потребуется писать скрипты для внутриигровых действий. На Unity,
например, потребуется работа с C#, да и на Unreal Engine знание языков
программирования не помешает.
Необходимо отметить, что важной особенностью Unreal Engine
является технология Blueprints, позволяющая описывать игровую логику и
события с помощью графических схем, без использования языков
программирования. Это, конечно, приведет к тому, что созданная игра будет
занимать больше места и требовать более быстрой платформы, но зато
процесс разработки значительно упрощается.
Использование игровых движков позволяет избавиться от написания
кода для очень многих рутинных моментов, так как, кроме самих движков,
для них существует огромное количество библиотек и расширений. С их
10
помощью первые простейшие игры на Unity можно создать уже через
несколько часов изучения платформы. Специально для начинающих в Unity
существует масса проектов вроде Creator Kit и Microgame, предлагающих
большое количество исходных материалов для написания простых
приложений в 2D и 3D. На Unreal Engine также есть множество библиотек и
уроков, позволяющих быстро освоить программную среду и начать писать
простые игровые приложения.
15
расширение их функциональности с помощью добавления различных
компонентов позволяет бесконечно совершенствовать и усложнять проект.
Action.
Сущность экшенов отражает их название – в переводе с английского
оно означает «действие», и здесь игрок находится в самом центре действия и
управляет им. Главным образом оно связано с физическими испытаниями,
которые нужно преодолеть. К этому жанру относились самые первые
видеоигры, например, Galaga и Donkey Kong.
Обычно в экшенах очень легко приступить к игре, поэтому они до сих
пор остаются самыми популярными видеоиграми.
А теперь рассмотрим поджанры этой категории.
Платформеры.
Платформеры получили свое название благодаря тому, что в процессе
игры ее главный персонаж взаимодействует с платформами – обычно бегает,
прыгает или падает. Разнообразных платформеров очень много, самым
известным из них, пожалуй, можно назвать серию Super Mario Bros., а
Donkey Kong был одним из самых первых.
Интересный факт: первым трехмерным консольным платформером
была Jumping Flash! на первой Sony PlayStation. До этого момента все
платформеры были плоскими, «с видом сбоку», а персонажи обычно бежали
слева направо.
Шутеры .
Шутеры позволяют игрокам использовать в своих действиях оружие,
обычно с целью уничтожить врагов или противоборствующих игроков.
Шутеры делятся по ракурсу обзора игрока. В шутерах от первого
лица (FPS – Frst-person shooter) вид из глаз главного персонажа. Типичными
16
примерами являются Call of Duty, Half-Life и Halo. В шутерах от третьего
лица типа Fortnite и Splatoon действие показано так, что игрок может видеть
главного персонажа, обычно чуть сверху и сзади.
Шутеры с видом сверху, например, Galaga, Space Invaders и Raiden V:
Director’s Cut, как и следует из названия, демонстрируют нам вид полностью
сверху. И если в шутерах от третьего лица обычно используется шкала
здоровья, которая растет или уменьшается в зависимости от уровня здоровья
или состояния персонажа, то в шутерах с видом сверху часто применяется
принцип с некоторым количеством «жизней», когда надпись Game Over
появляется после исчерпания их запаса.
Файтинги.
В файтингах, в частности, Mortal Kombat и Street Fighter II, все
действие сосредоточено на боях, которые чаще всего проходят в форме
единоборств. Обычно в файтингах большой набор играбельных персонажей,
каждый из которых специализируется на своих уникальных способностях
или боевом стиле. В большинстве традиционных файтингов игрок должен
сражаться, продвигаясь все выше и побеждая все более и более сильных
противников.
Интересный факт: Street Fighter II был одной из первых видеоигр, где
появился играбельный женский персонаж, Чунь Ли (самый первый
играбельный женский персонаж появился в игре для автоматов Taito 1985
года под названием Typhoon Gal.)
Выживание.
Такой поджанр экшенов, как survival-action, в последние несколько лет
завоевал значительную популярность. Одним из первых его представителей
была игра в жанре survival-horror Resident Evil, хоть она и была линейной,
тогда как действие более современных игр на выживание типа Fortnite
обычно происходит в открытом мире, а игроки получают возможности и
ресурсы для создания инструментов, оружия и укрытий с целью выжить
Survival-horror.
17
В играх жанра survival-horror, например, Resident Evil, для создания
мрачных и суровых сеттингов часто используется серьезная тематика. Во
многих подобных играх изображается насилие и кровь, поэтому они
предназначены только для взрослой аудитории. Обычно такие игры могут
похвастаться захватывающим геймплеем, усиленным ключевым элементом
механики: ограниченными ресурсами, например, боеприпасами или
оружием.
Интересный факт: Resident Evil – одна из наиболее успешных игровых
серий в истории, в рамках которой появилось множество продолжений,
фильмов, игрушек, книг и настольных игр. А согласно геймерскому изданию
Книги рекордов Гиннесса первой Resident Evil для PlayStation принадлежит
рекорд худшего диалога в истории видеоигр.
Интерактивное кино.
Технология лазерных дисков позволила создать интерактивные
фильмы. В них используются заранее отснятые сцены с живыми актерами
или мультипликацией, приключение обычно представляется с видом от
третьего лица, а игрок контролирует выбор в определенных узловых точках
сюжета, например, сдвигает стик вправо или нажимает кнопку, чтобы
увернуться от летящего на него камня.
Интересный факт: Dragon’s Lair считается первым
примером интерактивного кино и классикой видеоигр. За анимацию отвечал
бывший аниматор Disney Дон Блут, и для создания игры его студии
потребовалось семь месяцев.
3D в реальном времени.
Последнее слово в жанре приключений – 3D в реальном времени,
которые иногда отделяют от интерактивного кино. Здесь вместо заранее
отснятых сцен игроки взаимодействуют с трехмерным игровым миром в
реальном времени. В качестве примера подобных игр можно назвать
Shenmue и Heavy Rain.
Ролевые игры.
18
Ролевые игры, или RPG – пожалуй, второй по популярности жанр. В
нем часто встречаются средневековые или фэнтезийные сеттинги, что
главным образом связано с происхождением жанра, который ведет свою
историю от Dungeons & Dragons и других настольных игр. Но ролевые игры
фантастической тематики, например, Mass Effect, Fallout и большинство
частей Final Fantasy, также не обделены вниманием хардкорных ролевиков и
внесли в жанр свой уникальный вклад.
Кроме того, на жанр повлияли и культурные различия – в частности,
многие геймеры делят RPG на WRPG (западные) и JRPG (японские).
Наконец, одной из знаковых фишек жанра является выбор игрока, влияющий
на итог игры, то есть у многих RPG есть несколько альтернативных
концовок. А теперь давайте рассмотрим различные виды ролевых игр.
MMORPG.
MMORPG, или массовые многопользовательские сетевые ролевые
игры, появились как графические варианты текстовых
многопользовательских подземелий (MUD – multi-user dungeon), популярных
в конце 1970-х.
В MMORPG сотни игроков активно взаимодействуют друг с другом в
едином мире и обычно выполняют одни и те же либо похожие задачи.
Симуляторы.
У представителей жанра симуляторов есть одна общая черта – все они
созданы для симуляции реальных или вымышленных систем, ситуаций или
событий.
Симуляторы строительства и менеджмента.
Самой популярной игрой этого жанра по праву является SimCity. В ней
игрок должен строить и развивать город, а также управлять им, в частности,
планировать улицы, распределять пространства и взимать налоги с горожан.
В других играх охват может быть ограничен большими или меньшими
рамками, например, кафе, небоскребом, парком развлечений или целой
планетой.
19
Симуляция жизни.
The Sims – самый популярный симулятор жизни и одна из самых
продаваемых игр всех времен. Как и в SimCity (также созданной Уиллом
Райтом) игрок управляет отдельными аспектами искусственной жизни. Такие
симуляторы могут позволять игрокам управлять генетикой персонажа или
средой их жизни. В некоторых случаях можно контролировать даже реакцию
персонажа на определенные ситуации.
Игры с виртуальными питомцами типа Nintendogs и «Тамагочи» также
можно отнести к этой категории – в сущности, это симуляторы ухода
за животными. Таким образом, The Sims можно назвать социальным
симулятором, и каждая из этих игр в определенном аспекте является
симуляцией жизни.
Наконец, некоторые наиболее масштабные игры этой категории
предоставляют персонажам значительный контроль над персонажами и их
окружением и поэтому называются «симуляторами бога».
Стратегии.
Геймплей этого жанра уходит своими корнями в традиционные
настольные стратегические игры. Часто в этих играх вам доступен целый мир
и все его ресурсы, а чтобы справиться с испытаниями, игроку требуется
тщательно продумывать стратегию и тактику. Со временем значительная
часть этого жанра перешла от пошаговых систем к реальному времени,
следуя желаниям игроков.
Варгеймы.
Геймплей этого поджанра стратегий сосредоточен на тактических или
стратегических изысканиях с привязкой к карте, чаще всего без
экономической составляющей и добычи ресурсов. Игры могут быть
пошаговыми и в реальном времени, очень часто используются исторические
сеттинги (в подавляющем большинстве случаев – Вторая мировая война).
Среди наиболее ярких представителей можно назвать серии Panzer General,
Close Combat, Sudden Strike («Противостояние») и «Блицкриг».
20
Глобальные стратегии.
Гибрид варгейма и 4X, где для достижения целей обычно требуется
грамотно управлять армией и ресурсами нации или империи.
Спортивные игры.
Спортивные игры, как и следует из названия, симулируют различные
виды спорта, например, гольф, баскетбол, обычный и американский футбол.
Встречаются также олимпийские виды спорта типа лыжных гонок, и даже
«барный спорт» вроде бильярда или дартс. Обычно соперники управляются
компьютером, хотя можно соревноваться и с другими игроками. И раз уж мы
говорим о спорте, сами по себе видеоигры тоже можно считать спортом!
Гонки.
Одни из наиболее популярных игр этой категории – гоночные
симуляторы серий Forza, Grand Turismo и Need for Speed, сюда же мы
относим классику игровых автоматов типа Pole Position. Здесь игроки
участвуют в гоночных заездах против соперников или на время.
Командные виды спорта.
Симуляция различных командных спортивных игр – один из
старейших игровых жанров. Некоторые представители жанра, например,
Arch Rivals и NBA Jam, подходят к спорту с юмором, тогда как другие,
например, Madden NFL и FIFA, стараются воссоздать реализм и подарить
ощущение участия в настоящих состязаниях.
Интересный факт: Серия Madden NFL старше половины игроков,
которые сейчас играют в реальной лиге NFL. Игры серии посетили 33
различных платформы и консоли, в том числе Windows, iOS, Sega Genesis
и Sega Saturn, Nintendo SNES, N64, GameCube, Wii и Wii U, Turbo Duo, 3DO,
PlayStation c первой по четвертую и все поколения Xbox.
Головоломки.
Головоломки, или логические игры, обычно играются на одном экране
или игровом поле, а для прохождения требуется решать определенные
интеллектуальные задачи.
21
Логические игры.
В логических играх нужно решать логические головоломки или
проходить какие-то испытания для ума типа лабиринтов. Среди наиболее
ярких представителей – интеллектуальные игры типа Brain Age и
более казуальные головоломки, например, Tetris.
Интересный факт: Первая версия «Тетриса» была текстовой. Ее
создатель Алексей Пажитнов для создания блоков различного размера
использовал скобки, а игроки должны были изменять положение блоков,
падающих в стакан, чтобы заполнять и убирать ряды.
Викторины.
Как и в настоящих викторинах, в компьютерных играх этого жанра для
набора очков игрок должен ответить на вопрос в течение заданного времени
(или раньше другого игрока). Этот жанр отлично подходит для казуальной
игры, поэтому в последнее время его популярность неуклонно растет,
особенно на мобильных телефонах.
22
Глава 2. Практическая часть
2.1. Среда Unity как инструмент разработки
23
кроссплатформенность
гибкость и расширяемость
гибкая ценовая политика
доступно для VITV и epichnoetv
поддержка физики ткани (PhysX Cloth)
Assets Store, так называемый магазин компонентов
наличие бесплатной версии с некоторыми ограничениями
скиннинг на CPU
Основной концепцией Unity3d является использование в сцене легко
управляемых объектов, которые, в свою очередь, состоят из множества
компонентов. Создание отдельных игровых объектов и последующее
расширение их функциональности с помощью добавления различных
компонентов позволяет бесконечно совершенствовать и усложнять проект.
Влияние компонента на поведение или положение того или иного
объекта в сцене (свойства компонента) определяется с помощью переменных
компонента.
Ресурсы (Assets) проекта – это строительные/составные блоки всех
проектов Unity, в качестве которых могут быть использованы файлы
изображений (текстур), 3D-моделей, звуковые файлы, которые будут
использоваться при создании в качестве ресурсов. Поэтому в любой папке
проекта Unity всегда существует подкаталог с именем Assets, где хранятся
все файлы ресурсов.
Когда какой-либо ресурс (например, геометрическая 3D-модель)
используется в сцене игры, он становится в терминологии Unity игровым
объектом (Game Object). Все эти объекты изначально имеют хотя бы один
компонент, задающий его положение в сцене и возможные преобразования
(компонент Transform). Переменные компонента Transform определяет
положение (position), поворот (rotation) и масштаб (scale) объекта в его
локальной декартовой прямоугольной системе координат X, Y, Z. Наличие
24
переменных у каждого компонента обусловливает возможность обращения к
ним из соответствующей программы (скрипта).
Компоненты (components) в Unity3d имеют различное назначение: они
могут влиять на поведение, внешний вид и многие другие функции объектов,
к которым прикрепляются (attaching). Unity предоставляет множество
компонентов различного назначения.
Для обеспечения интерактивности различных 3D-приложений в
Unity3d используются скрипты, которые также рассматриваются средой как
компоненты. Помимо JavaScript, Unity3d также предоставляет возможность
использовать для написания скриптов языки C# и Boo (производный от языка
Python). Для написания скриптов можно воспользоваться встроенным
редактором Unity3d MonoDevelop.
В качестве языка для написания скриптов в Unity применяются C#,
JavaScript и Boo. Наиболее приоритетными языками для нас были C# и
JavaScript.
Оба языка используют в качестве синтаксической основы язык
программирования C. В частности, от него унаследованы без изменений:
обозначения начала/конца блока кода фигурными скобками;
обозначения, ассоциативность и приоритет большинства
встроенных операций (присвоение, арифметические, логические,
побитовые операции, операции инкремента/декремента);
синтаксис описания и использования переменных и функций
(порядок «тип имя», использование модификаторов, обязательность
скобок для функций, описание формальных параметров);
синтаксис всех основных конструкций: условного оператора,
циклов, оператора множественного выбора;
отсутствие процедур (их заменяют функции типа void);
наименования встроенных элементарных типов (кроме bool, в
JavaScript этот тип называется boolean);
25
использование точки с запятой
Всё это приводит к тому, что программы на JavaScript и C# внешне на
первый взгляд выглядят чрезвычайно похоже на C-программы. В обоих
языках сделаны однотипные расширения и дополнения по отношению к C
(или C++), в частности, расширен алфавит и введён собственный синтаксис,
поддерживающий пакеты, импорт описаний, определение единиц
компиляции.
Оба языка позволяют определить класс внутри класса. Внутренние
классы JavaScipt имеют доступ к нестатическим членам родительского
класса; кроме того, внутри методов можно определять локальные классы,
имеющие доступ по чтению к локальным переменным, и безымянные
(анонимные) локальные классы, которые фактически позволяют создавать
экземпляры объектов и интерфейсов, перекрывающие методы своего класса,
непосредственно в месте их использования. На этом механизме в JS-
программах может строиться обработка событий (событие генерирует вызов
метода, в исходном классе-обработчике являющегося абстрактным; там, где
нужен конкретный обработчик события, программист создаёт экземпляр
локального анонимного класса - наследника базового класса-обработчика и
непосредственно использует его). Таким образом, исчезает необходимость в
специальном типе и синтаксической поддержке для событий, но сам код,
создающий обработчики, несколько более сложен для понимания.
29
Рис. 7 Размещение 2 персонажа
Рис.10 PlayerControl.cs
31
Рис.11 PlayerCamera.cs
Рис.12 PlayerDamage.cs
32
Заключение
33
распространяется в нашем обществе.
В ходе реализации проекта были выполнены следующие задачи:
изучены особенности и состояние компьютерной индустрии;
выбраны жанр, вид и платформа для компьютерной игры;
разработаны сценарий и концепция основных элементов;
выбрано и изучено средство реализации;
подготовлены необходимые для игры анимации;
реализован прототип игры.
34
Список источников и литературы
36
Приложение
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Platformer.Gameplay;
using static Platformer.Core.Simulation;
using Platformer.Model;
using Platformer.Core;
namespace Platformer.Mechanics
{
/// <summary>
/// This is the main class used to implement control of the player.
/// It is a superset of the AnimationController class, but is inlined to allow for
any kind of customisation.
/// </summary>
public class PlayerController : KinematicObject
{
public AudioClip jumpAudio;
public AudioClip respawnAudio;
public AudioClip ouchAudio;
/// <summary>
/// Max horizontal speed of the player.
/// </summary>
public float maxSpeed = 7;
/// <summary>
/// Initial jump velocity at the start of a jump.
/// </summary>
public float jumpTakeOffSpeed = 7;
bool jump;
Vector2 move;
SpriteRenderer spriteRenderer;
internal Animator animator;
readonly PlatformerModel model = Simulation.GetModel<PlatformerModel>();
void Awake()
{
health = GetComponent<Health>();
audioSource = GetComponent<AudioSource>();
collider2d = GetComponent<Collider2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
animator = GetComponent<Animator>();
}
37
{
stopJump = true;
Schedule<PlayerStopJump>().player = this;
}
}
else
{
move.x = 0;
}
UpdateJumpState();
base.Update();
}
void UpdateJumpState()
{
jump = false;
switch (jumpState)
{
case JumpState.PrepareToJump:
jumpState = JumpState.Jumping;
jump = true;
stopJump = false;
break;
case JumpState.Jumping:
if (!IsGrounded)
{
Schedule<PlayerJumped>().player = this;
jumpState = JumpState.InFlight;
}
break;
case JumpState.InFlight:
if (IsGrounded)
{
Schedule<PlayerLanded>().player = this;
jumpState = JumpState.Landed;
}
break;
case JumpState.Landed:
jumpState = JumpState.Grounded;
break;
}
}
38
animator.SetBool("grounded", IsGrounded);
animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / maxSpeed);
namespace Platformer.Mechanics
{
/// <summary>
/// This class animates all token instances in a scene.
/// This allows a single update call to animate hundreds of sprite
/// animations.
/// If the tokens property is empty, it will automatically find and load
/// all token instances in the scene at runtime.
/// </summary>
public class TokenController : MonoBehaviour
{
[Tooltip("Frames per second at which tokens are animated.")]
public float frameRate = 12;
[Tooltip("Instances of tokens which are animated. If empty, token instances are
found and loaded at runtime.")]
public TokenInstance[] tokens;
float nextFrameTime = 0;
void Awake()
{
//if tokens are empty, find all instances.
//if tokens are not empty, they've been added at editor time.
if (tokens.Length == 0)
FindAllTokensInScene();
//Register all tokens so they can work with this controller.
for (var i = 0; i < tokens.Length; i++)
{
tokens[i].tokenIndex = i;
tokens[i].controller = this;
}
}
void Update()
{
//if it's time for the next frame...
if (Time.time - nextFrameTime > (1f / frameRate))
{
//update all tokens with the next animation frame.
for (var i = 0; i < tokens.Length; i++)
39
{
var token = tokens[i];
//if token is null, it has been disabled and is no longer animated.
if (token != null)
{
token._renderer.sprite = token.sprites[token.frame];
if (token.collected && token.frame == token.sprites.Length - 1)
{
token.gameObject.SetActive(false);
tokens[i] = null;
}
else
{
token.frame = (token.frame + 1) % token.sprites.Length;
}
}
}
//calculate the time of the next frame.
nextFrameTime += 1f / frameRate;
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using Platformer.Core;
using Platformer.Model;
using UnityEngine;
namespace Platformer.Mechanics
{
/// <summary>
/// AnimationController integrates physics and animation. It is generally used for
simple enemy animation.
/// </summary>
[RequireComponent(typeof(SpriteRenderer), typeof(Animator))]
public class AnimationController : KinematicObject
{
/// <summary>
/// Max horizontal speed.
/// </summary>
public float maxSpeed = 7;
/// <summary>
/// Max jump velocity
/// </summary>
public float jumpTakeOffSpeed = 7;
/// <summary>
/// Used to indicated desired direction of travel.
/// </summary>
public Vector2 move;
/// <summary>
/// Set to true to initiate a jump.
/// </summary>
public bool jump;
/// <summary>
/// Set to true to set the current jump velocity to zero.
/// </summary>
public bool stopJump;
SpriteRenderer spriteRenderer;
40
Animator animator;
PlatformerModel model = Simulation.GetModel<PlatformerModel>();
animator.SetBool("grounded", IsGrounded);
animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / maxSpeed);
41