создание движения персонажа unity3d

Основы создания 2D персонажа в Unity 3D 4.3. Часть 2: бегущий персонаж

Всем привет. Продолжаем дело, начатое в первой части. Сейчас у нас есть платформа и стоящий на ней персонаж с анимацией покоя. Настало время научить нашего персонажа бегать вправо-влево по платформе.

Загрузим сцену из первой части. Напомню, что в прошлый раз мы импортировали несколько спрайтов в папку AssetsSprites. На всякий случай, внизу поста еще раз приведу ссылку на спрайты. Среди них должен быть спрайт под названием Run. Мы будем использовать его для создания анимации бега. Для этого нам надо проделать те же действия по превращению одиночного спрайта в коллекцию, как и при создании анимации покоя. Вкратце напомню: выделяем спрайт, в окне Inspector устанавливаем свойство Sprite Mode как Multiple, нажимаем ниже Sprite Editor, нарезаем изображение в режиме Grid или Automatic.

image loader

Теперь в окне Hierarchy выбираем Character и переходим в окно Animation. Нажимаем на поле с анимацией Idle и выбираем Create New Clip, чтобы создать анимацию бега. Сохраним файл анимации в папке AssetsAnimations под именем Run.

image loader

Новая созданная анимация Run стала текущей в окне Animation. Разворачиваем спрайт Run в окне Project, выделяем все фалы Run_0… Run_9 и перетаскиваем в окно Animation. Установим пока значение Sample равное 24.

image loader

Все это мы уже делали в первой части, а теперь будет нечто новое. Перейдем в окно Animator. Сейчас там отображены три анимации: Any State, Idle и Run. Нам предстоит задать условия перехода из анимации Idle в анимацию Run, то есть из состояния покоя в состояние бега. В нижнем левом углу есть поле Parameters. Нажимаем на плюсик, выбираем Float и называем новый параметр как Speed. Тем самым мы создали параметр типа число с плавающей запятой, обозначающий скорость перемещения персонажа. Именно в зависимости от значения этого параметра будет происходить переключение из анимации покоя в анимацию бега. Теперь нажимаем правой кнопкой мыши на анимацию Idle, выбираем Make Transition и нажимаем левой кнопкой мыши на анимацию Run. Между анимациями появится линия со стрелкой. Передвиньте мышкой прямоугольники анимации, если плохо видно. Кликнем по линии со стрелкой. В окне Inspector отобразятся свойства перехода между анимациями. Обратим внимание на низ окна, в раздел Conditions. Кликнем на параметр Exit Time и поменяем его на Speed. Второе поле Greater оставим без изменений, а в третьем введем значение 0.01. Мы создали условие перехода из анимации покоя в анимацию бега — оно происходит, когда значение параметра скорости становится немногим больше нуля.

image loader

Теперь нужно сделать обратный переход — из Run в Idle. Делаем все с точностью наоборот: Make Transition от Run к Idle, выделяем переход, в Conditions устанавливаем SpeedLess0.01.

image loader

Теперь у нас есть две анимации и условия перехода между ними. Но пока ничего работать не будет, потому что все что мы сделали нужно «оживить» при помощи скрипта. Давайте перейдем в окно Project и создадим в папке Assets подпапку Scripts. Добавим в нее новый C# Script, назовем его CharacterControllerScript и откроем на редактирование.

image loader

Я приведу полный листинг скрипта с подробными комментариями, а ниже еще поясню, что в нем происходит.

Итак, мы завели несколько переменных: для задания максимальной скорости перемещения, для определения направления (вправо/влево) и для работы с компонентом Animator. Почти все действия происходят в методе FixedUpdate. В нем мы получаем значение оси Х, которое меняется при нажатии на клавиатуре клавиш влево-вправо или A-D (если не меняли соответствующие настройки проекта!). Затем устанавливаем это значение параметру Speed компонента Animator. Обратите внимание, что мы берем модуль этого значения при помощи метода Mathf.Abs, так как при создании условий перехода между анимациями покоя и бега мы сравниваем значение параметра с положительным числом 0.01. Нам здесь не важно, в какую сторону бежит персонаж. Важно лишь величина значения. Далее задаем скорость перемещения по оси Х в соответствии со значением максимальной скорости. И, наконец, проверяем, в какую сторону бежит персонаж, и в какую сторону он в этот момент повернут. Если он бежит вправо, а повернут влево — разворачиваем его вправо путем инвертирования его размера по оси Х. И наоборот. Этим нехитрым способом мы избавились от необходимости делать две анимации вместо одной: для бега вправо и для бега влево.

Сохраняем скрипт. В Unity перетаскиваем его на нашего Character в окне Hierarchy. Запускаем игру, нажимаем влево-вправо или A-D.

Читайте также:  кристобаль де моралес биография

image loader

Капитан Коготь теперь умеет бегать! Скорость анимации получилась быстроватой. Ее можно снизить путем уменьшения значения Sample в окне Animation для анимации Run (значение 12 будет нормально). Если одновременно с игрой у вас видно окно Animator, то вы увидите, что во время покоя работает анимация Idle (бегает синий прогрессбар), а во время бега происходит переход на анимацию Run, и, соответственно, работает она.

На этом пока все. Нам осталось разобраться с прыжками… и узнать при этом еще несколько новых вещей!
Ссылка на спрайты.

Источник

Как работает Unity Character Controller (Контроллер Персонажа)?

Команда Unity3D заботится о рядовых пользователях и разработчиках игр. Поэтому в Unity была введена интересная система, называется она – Character Controller, а по русски – Контроллер Персонажа. Что же она делает и для чего вообще нужна? В основном она используется для управления персонажем от первого или третьего лица без использования физики Rigidbody.

01Итак для начала нам следует подготовить сцену. Создадим Terrain, Меню GameObject>3d Object>Terrain

И создадим заготовку нашего персонажа. Для этого опять, Меню GameObject>Create Empty и назовем его Player. Затем делаем нашу камеру дочерней нашему свежесозданному Player.

Теперь добавим плееру компонент Character Controller. Для этого в окне инспектора нажмем кнопку Add Component и в появившемся списке в пункте Physics нажмем на Character Controller.

Когда контроллер персонажа добавлен к нашей заготовке, рассмотрим подробнее поля его настроек.

Slope Limit: этот параметр ограничивает возможность персонажу взбираться на различные препятствия. Например, по умолчанию стоит число 45, это значит, что если угол препятствия больше 45 градусов, то персонаж на него не сможет взобраться.

Step Offset: персонаж будет подниматься по лестнице, только если он ближе к земле, чем указанное значение.

Skin width: 2 коллайдера могут пересечься друг с другом на глубину, равную значению Skin Width.

Min Move Distance: если персонаж пытается переместиться ниже указанного значения, он не будет двигаться вообще.

Center: сдвиг коллайдера контроллера.

Radius: радиус коллайдера контроллера. Определяет, насколько жирный получился персонаж.

Height: высота коллайдера. Ну и, соответственно, высота контроллера. Например, если сделать это значение выше высоты дверных проемов, то персонаж просто застрянет в них.

Пока все значения оставим по умолчанию. В дальнейшем можно поменять их для лучшей работы контроллера. И как, это не странно, подготовка персонажа готова. Нам осталось написать небольшой скрипт управления камерой и нашим контроллером и персонаж будет готов.

Создадим новый скрипт под названием Player. Этот скрипт нам нужен для отдачи команд CharacterController, который и будет их выполнять, двигая и поворачивая персонажа. Для этого выберем в иерархии нашего персонажа и в инспекторе нажмем Add Component. Далее, в конце появившегося списка, нажимаем New Script, в появившемся поле ввода вводим название скрипта, в нашем случае – Player.

Завершающие действие – это кнопка Create and Add. Нажимаем! Отлично, скрипт создан и добавлен к нашему персонажу!

Откроем его, кликнув по его имени два раза.

%D0%A1%D0%BD%D0%A1 01

В этом скрипте нам надо обьявить три переменные. Первая – это ссылка на CharaсterController. Вторая – скорость движения. Третья-скорость поворота. И укажем им значения по умолчанию 1 и 3 соответственно.

%D0%A1%D0%BD%D0%A1 02

В методе Start, который, как мы знаем, вызывается при старте сцены, добавим строку, которая найдет и добавит компонент CharacterController к нашей переменной. Конечно же, при условии, что он присутствует на том же GameObject что и наш скрипт.

%D0%A1%D0%BD%D0%A1 03

Теперь переходим к методу Update. Этот метод вызывается каждый кадр. В него для начала добавим строку, которая поворачивает наш персонаж вокруг оси Y, посредством клавиш leftArrow и RightArrow.

%D0%A1%D0%BD%D0%A1 04

Затем мы задаем, куда нам двигаться. Точнее – вектор направления. Он у нас forward или z.

%D0%A1%D0%BD%D0%A1 05

Затем мы устанавливаем скорость движения. В зависимости от того, какая клавиша нажата, она положительная или отрицательная. То есть вперед и назад.

%D0%A1%D0%BD%D0%A1 06

И наконец, собираем все это вместе и передаем на Character Controller.

%D0%A1%D0%BD%D0%A1 07

Сохраняем наш скрипт и переходим в Unity. На нашем персонаже должно быть два скрипта Charaster Controller и Player.

%D0%A1%D0%BD%D0%A1 08Жмем Play и стрелочками на клавиатуре двигаем и поворачиваем нашего персонажа. Урааа, побежали!

Источник

Как научить персонажа двигаться в Unity 2D и 3D

unity min

Привет, друзья! Давайте начнем обучение созданию игр на Unity (Юнити). Мы публикуем уроки Юнити бесплатно, чтобы вы смогли познакомиться с этой средой и узнать, как устроен язык программирования C# (Си Шарп). В этом уроке разберем как сделать управление персонажем и прыжки в 2D- и 3D-проекте.

Управление персонажем в 3D

unnamed
Создаем скрипт и даем ему название на английском языке.

unnamed 2
Управление персонажем в 2D

Для работы потребуется два спрайта — для персонажа и для земли. Перемещаем персонажа и землю на сцену. С помощью клавиш CTRL+D дублируем землю.

unnamed 3
Создаем пустой объект. И в него перемещаем все объекты земли.

unnamed 5
Персонажу добавляем физику и коллайдер и так же настраиваем границы коллайдера.

unnamed 6
Создаем скрипт на C#

Теперь отражаем наш спрайт в зависимости от того, в какую сторону движется наш персонаж. Условием If проверяем. Если нажали клавишу для перемещения вправо, а персонаж направлен влево, то поворачиваем спрайт вправо. С else if — обратная ситуация.

Читайте также:  абстинентный синдром история болезни

И теперь сама функция Flip. В ней мы отражаем спрайт по оси X и задаем размеры, чтобы из-за отражения не исказились размеры спрайта.

unnamed 7
Сохраняем скрипт и перемещаем его на персонажа. Запускаем Юнити и проверяем.

В школе “Пиксель” мы ведем полный курс обучения Unity 3D для детей и подростков. Изучая наши уроки Си Шарп, вы быстро освоите азы программирования и научитесь создавать свои игры.

Источник

Правильная реализация передвижения персонажа

Почему один обьект проходит сквозь другой хотя у меня есть коллайдеры на обоих обьектах?

Почему мой персонаж во время движения проходит сквозь другой обьект, а потом его откидывает назад?

Как реализовать передвижение персонажа в Unity3d правильно?

Почему так часто используется передвижение через transform.position и почему это неправильно?

Почему мой персонаж движется с разной скоростью если проседает FPS?

Почему двигать персонажа через смену transform.position неправильно?

Как сделать прыжок от пола, но так что бы персонаж не мог бесконечно взлетать

Почему когда платформа движется, персонаж стоящий на платформе остается на месте?

Почему пуля не всегда наносит урон?

Все эти вопросы, фактически, являются одним единым вопросом, который слишком уж часто встречается у начинающих.

Заодно создал тэг unity3d-faq

dRPDg

1 ответ 1

Перед прочтением важно знать

Хоть я здесь и разбираю в т.ч. нефизическое движение, я настоятельно рекомендую использовать ФИЗИЧЕСКОЕ движение. И переходить на нефизическое только в исключительных ситуациях.

Я буду использовать здесь 2 термина: «телепортация» и «плавное движение». В моем понимании:

Есть люди у которых мнение отличается.

Учтите, что все что написано ниже упирается в верхние значения терминов, а не эти.

Двигать обьекты в игровых движках можно следующими способами:

используя физический движок (движение обусловленное физической моделью игрового движка)

Движение реализуемое через CharacterController (здесь пока что не рассматривается т.к. новички в его сторону вообще не смотрят, может, позже распишу)

Новички очень часто использую телепортацию на каждом кадре, что есть критически неправильным подходом. Потом на SO появляются кучи клонов вопросов вроде «почему персонажа дергает возле стены?» или «почему он проходит сквозь стену?» или «почему пуля не всегда наносит урон?» и подобные.

Нужно запомнить всего одно правило: Двигать/поворачивать через присвоение transform.position / transform.rotation нельзя. Это порождает проблемы. В любом случае это вам вылезет боком.

Пример правильной реализации движения:

( на примере обьекта-шара )

в отличии от пестрящих дичью форумов, в т.ч. сервисе вопросов/ответов от юнити. Там в таких темах слишком часто пишут ответы те люди, которые понятия не имеют о правильном подходе.

Связанные с темой понятия:

Если обьект не обладает физическими свойствами (не имеет RigidBody) эти параметры и методы можно использовать для НЕфизического передвижения.

Например поворот камеры.

Или крутящийся куб на небосводе.

Мы не получим дергающуюся картинку при проседании кадров если сделаем НЕФИЗИЧЕСКОЕ движение правильно:

мы присваиваем в новую позицию:

Про физические свойства движения.

мы разово задаем вектор скачка. Только 1 долю секунды. Но он будет изменятся во времени автоматически равномерно уменьшаясь под силой тяжения. Пока не станет нулевым (верхняя точка прыжка), а потом не пойдет в минус по Y (падение), а потом не упадет на землю и не отскочит от нее (снова плюс по Y ) и так до полной остановки физической скорости обьекта на земле.

Если девайс с игрой сильно загружен, вызов методов Update() / FixedUpdate() тоже может просесть в скорости. И если в физике это учтено и без нас, то сейчас мы делаем НЕ физическое движение и именно по-этому это нужно учитывать добавлением даного множителя.

Но и без использования даного множителя у нас не появится проблем с провалами сквозь стены. Это просто фикс скорости.

Пример простой но хорошей НЕФИЗИЧЕСКОЙ реализации кода движения на примере персонажа.

Если в прошлом примере мы двигали шар, то было допустимо его толкать используя физ.модель. То есть мы использовали AddForce() для этих целей.

CENlJ

Давайте актуализируем этот код под даного персонажа. Мы заменим физический толчек обьекта на не-физическое, но ПЛАВНОЕ перемещение обьекта в пространстве:

С этим кодом мы получим такой результат:

X44zR

С такой реализацией у нас не будет проблем вроде скачков скорости на проседании или повышении количества FPS, проваливаний, дерганости, прохождения сквозь стены или других неожиданностей.

Так же можно добавить анимацию бега на нашего персонажа (ну если бы это был не куб).

Но как же реализация на физике?

Да, можно подобное реализовать и на физике.

Наша прошлая версия скрипта имела несколько недостатков. А именно:

Давайте поместим на наш куб CapsuleCollider (минимальное торможение из-за силы трения) и заблочим в rigidBody rotateX и rotateZ (что б наш персонаж не падал на бок).

А потом нацепим на него вот этот скрипт:

dWib3

Вы видите эту плавность, как будто человек бежит, останавливается, бежит в другую сторону? Красота!

А теперь вернитесь к прошлой гифке и присмотритесь. Движение совсем не такое 🙂 Там как буд-то рукой двигают шахматную фигуру по доске.

Читайте также:  памфилова элла александровна биография национальность родители

Ну и описанные выше баги поведения были пофикшены с такой реализацией.

Можно добавить еще физический материал нашему персонажу и откоректировать его поведение.

Вообще улучшать реализацию можно до бесконечности. Но, думаю, основные проблемы СПОСОБОВ ПЕРЕДВИЖЕНИЯ с которыми вы столкнетесь, я затронул 🙂

Оптимально использовать именно передвижение на базе физики.

Пытайтесь использовать исключительно физическое передвижение.

Реализация нестандартной физики движений.

Одним из моих любимейших примеров нестандартной физики движения является игра Ori and the Blind Forest

Такое перемещение/такие прыжки невозможно сделать на основе стандартной физики. Вероятнее всего, это делалось через физическое перемещение + костыли для получения нужных эфектов которые противоречат стандартной физике.

Сначала разрабатываются концепты движения. Они делаются в любом видеоредакторе с примитивными фигурами. Вот пример (если станет недоступным искать можно по Ori and the blind forest Enemy Concepts ) :

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

Костыли для каждого персонажа/врага свои собственные. Это делается что бы каждый из них обладал своей уникальной физикой. Сделать это на общей физике навряд ли возможно.

Движение реализовано «правильно» но предмет все равно пролетает сквозь стену

ДАЖЕ если вы реализовали физическое передвижение вашего персонажа, все равно может случится такое, что просчет CollisionDetect может проходить с ошибками. Такое бывает.

Для таких случаев есть настройки отвечающие за обработку CollisionDetect в настройках самого RigidBody.

GkfsP

Желательно такого не делать т.к. это негативно сказывается на производительности. Чем на большем количестве обьектов вы меняете эти настройки, тем более вероятно что вы делаете какую-то дичь, которую делать совсем не нужно. Считайте это спасательным кругом, а не панацеей. А если вы так будете делать, то рано или поздно вы прийдете на SO с вопросом почему игра тормозит, вас попросят показать код и ничего не найдут просто потому, что проблема тормозов не в коде. И намучаетесь вы с оптимизациями ой как сильно.

Источник

Перемещение объекта по нажатии кнопки в Unity3d на C#

Доброго времени суток.

Сегодня поговорим про движение объекта по нажатию кнопки на экране в Unity3D. Эта тема очень проста, но часто используется в разного рода играх.

Для начала давайте создадим пустой 3D проект. Открываем Unity, нажимаем кнопку в правом верхнем углу с надписью «New». В поле «Project name» указываем название проекта. В строке «Location» указываем расположение проекта на диске. Ниже поля «Location» ставим флажок «3D» и нажимаем «Create project».

image loader

Затем создаем куб который будет заменять нам землю (GameObject->3D Object->Cube). Потом сделаем его более плоским и растянем. Открываем окно «Inspector», выделяем наш куб, в параметре «Transform» пункт «Scale» задаем x:10, y:0.2, z:10. У нас должно получится такое полотно:

image loader

Теперь перемещаем камеру на координаты x:0,y:5,z:0. Затем поворачиваем ее на 90 градусов по оси x. Затем нам нужно создать объект который мы будем перемещать. Создаем сферу (GameObject->3D Object->Sphere), задаем параметр «Position» в «Transform» как x:0, y:1, z:0. После этого чтобы лучше видеть нашу сцену ищем на вкладке «Hierarchy» объект с именем «Directional Light» и задаем ему параметр «Rotation» в «Transform» как x:180, y:-30, z:0. Наш проект теперь должен выглядеть вот так:

image loader

Теперь нам нужна кнопка, по нажатию которой мы будем определять двигать ли наш объект. Сначала создаем экран на котором будет располагаться наша кнопка (GameObject->UI->Canvas). Следующий этап — создаем кнопку (GameObject->UI->Button). Затем надо написать скрипт для перемещения нашей сферы. В окне «Project» выбираем «Create», а там выбираем C# Script. Далее приведен код:

Сначала создаем переменную нашего объекта для перемещения. Вторая переменная — это расстояние на которое мы будем перемещать объект. Публичный метод «OnButtonDown» отвечает за перемещение при нажатии кнопки. Сначала задаем переменной S значение 1 или 2, после чего двигаем объект по оси X на S расстояние.

Затем выделяем нашу кнопку, в панели «Inspector» в самом низу нажимаем кнопку «Add Component», выбираем в «Scripts» наш код. Далее в компоненте «Button» снизу в пункте «On Click ()» нажимаем «+». Нажимаем на получившееся окно в параметре «On Click ()» в поле, где стоит «None (Object)». В нем выбираем нашу кнопку. Вот как это должно выглядеть:

image loader

Потом в нашем параметре «On Click ()» выбираем блок в котором стоит «No Function», внутри него выбираем название нашего кода, а в нем выбираем метод «OnButtonDown()». Теперь когда кнопка настроена переходим к коду. В окне «Inspector» должен отображаться компонент с названием нашего кода. В поле «Sphere» выбираем нашу сферу. Вот что должно получится:

image loader

Затем в окне «Game» нажимаем на «Maximize On Play». Теперь нажимаем на кнопку запуска игры. На экране отображается наша кнопка. Если кликнуть по ней, то наша сфера переместится по оси X.

image loader

image loader

Большое спасибо за прочтение публикации. Надеюсь, Вы приобрели для себя новые знания.

Источник

Поделиться с друзьями
Моря и океаны
Adblock
detector