Перейти к содержимому

Unity has exit time что это

  • автор:

После добавления анимации игроку в Unity у него отключилась физика и управление

Я делал анимацию игроку в Unity и у него отключилась физика и управление. И ещё появилась ошибка: Asset ‘player’: Transition ‘takeOf -> jump’ in state ‘takeOf’ doesn’t have an Exit Time or any condition, transition will be ignored UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) Вот код игрока:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour < public float speed; public float jumpForce; private float moveInput; private Rigidbody2D rb; private bool facingRight = true; private bool isGrounded; public Transform feetPos; public float checkRadius; public LayerMask whatIsGround; private Animator anim; private void Start() < anim = GetComponent(); rb = GetComponent(); > private void FixedUpdate() < moveInput = Input.GetAxis("Horizontal"); rb.velocity = new Vector2(moveInput * speed, rb.velocity.y); if(facingRight == false && moveInput >0) < Flip(); >else if (facingRight == true && moveInput < 0) < Flip(); >if(moveInput == 0) < anim.SetBool("isRunning", false); >else < anim.SetBool("isRunning", true); >> private void Update() < isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround); if(isGrounded == true && Input.GetKeyDown(KeyCode.Space))< rb.velocity = Vector2.up * jumpForce; anim.SetTrigger("takeOf"); >if(isGrounded == true) < anim.SetBool("isJumping", false); >else < anim.SetBool("isJumping", true); >> void Flip() < facingRight = !facingRight; Vector3 Scaler = transform.localScale; Scaler.x *= -1; transform.localScale = Scaler; if (moveInput < 0) < transform.eulerAngles = new Vector3(0, 180, 0); >else < transform.eulerAngles = new Vector3(0, 0, 0); >> > 

скриншот с ошибкой и переходом

Вот скриншот аниматора:

Отслеживать
задан 18 окт 2022 в 18:00
George-7777 George-7777
24 7 7 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Нужно в инспекторе игрока в компоненте Аниматор поставить галочку на Apply root motion

Отслеживать
ответ дан 27 дек 2022 в 12:17
George-7777 George-7777
24 7 7 бронзовых знаков

  • c#
  • unity3d
  • анимация
  • физика
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Unity C#. Как можно сделать две разные анимации при одинаковых условиях?

В общем есть скрипт, в котором описаны условия действия двух анимаций:

if (isGrounded && !isDead) State = CharState.knightidle; if (!isDead && Input.GetButtonDown("Fire1")) Attack(); 

CharState — переменная состояния персонажа

private void Attack() < State = CharState.knightattack; if (Vector3.Distance(transform.position, monster.transform.position) < length) < monster.GetDamage(); >> 

Когда скрипт пытается проиграть анимацию knightattack она тут же заменяется обратно на knightidle, видно буквально пару кадров от нужной анимации. Подозреваю, что это из-за условий выполнения анимации, ведь когда персонаж находится без опоры под ногами (прыгает или падает, то есть isGrounded = false) то анимация прекрасно проигрывается и не заменяется. Как можно исправить ситуацию? Заранее спасибо за уделенное время.

Покадровая спрайтовая 2д анимация в Unity

В Unity, как и во многих других движках существует несколько видов анимации. Но в данной статье речь пойдёт о покадровой спрайтовой анимациии. Это именно та анимация, которая присутствовала в играх на наших игровых приставках, и к которой все привыкли. Суть спрайтовых анимаций заключается в быстрой смене готовых кадров, которые создают эффект анимации.

В данной статье мы разберём анимацию на примере трёх самых популярных состояний в 2д платформере:

  • Состояние покоя
  • Бег, или ходьба
  • Прыжок

Подготовка кадров

Первым делом нам необходимо загрузить в окно Project спрайты для наших анимаций. На изображении ниже, я загрузил все необходимые кадры анимаций в три спрайта для каждого состояния(покоя, прыжок, бег). Вы можете все кадры использовать отдельными спрайтами, а можете сгруппировать как у меня. Это впринципе не важно.

Создание Анимации (Animation)

Теперь нам необходимо каждое из состояний анимировать. Для этого открываем окно Animation, с помощью вкладки Window — Animation — Animation. Откроется данное окно.

Благодаря этому окну, мы и будем превращать наши кадры в анимацию. Для этого выбираем игровой объект, который анимируем, в нашем случае это персонаж с именем Player. А далее нажимаем кнопку Create, которая изображена на рисунке выше. Далее откроется окно, в котором необходимо указать название для нашей первой анимации покоя. Назовём её idle. Готово, наша анимация создана, но пока она ещё пустая, и не имеет никаких кадров.

Важно №1. После создания ПЕРВОЙ анимации, автоматически создаётся и контроллер анимаций(Animator), с таким же названием, как и у объекта, которому мы и создаём анимацию. В моём случае название аниматора будет Player. Контроллер анимаций хранит ВСЕ состояния анимаций данного объекта(покой, бег, прыжок), и благодаря ему происходит смена этих состояний анимаций с одной на другую. На рисунке у нас создана пока ещё пустая анимация покоя idle, и контроллер анимаций Player.

Важно №2. Так же, после создания первой анимации, в Inspector-е данного объекта создаётся и компонент Animator, который несёт в себе ссылку на наш контроллер анимаций. Благодаря этому компоненту мы и будем в дальнейшем через скрипт C# менять состояния анимаций с одной в другую.

Перейдём к окну Animation. Перенесём наши спрайты из окна Project, в пустое пространство окна Animation. После нажатия клавиши «пробел«, Вы можете обнаружить, что ваш персонаж на игровой сцене начинает анимироваться.

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

Для этого открываем меню в правом верхнем углу(три точки), и ставим галочку на Show Sample Rate. А дальше снижаем значение кадров в поле Samples, например, до 12.

Отлично. Анимация состояния покоя idle готова! Теперь создадим вторую анимацию, бег. Для этого в окне Animation жмём треугольничек, напротив названия Вашей анимации, и в выпадающем списке жмём Create New Clip. После чего прописываем название Вашей анимации бега, например run, и сохраняем.

После чего была создана новая и пустая анимация бега. Теперь всё так же как и в предыдущем примере, перетаскиваем кадры бега в окно Animation, уменьшаем количество кадров, и всё. Таким же образом создаём анимацию прыжка, с названием, например, jump.

После всех проделанных манипуляций, у нас должно получится 3 анимации(idle, run, jump) и один контроллер(Animator) Player.

Контроллер Анимаций (Animator)

Теперь поработаем с контроллером анимаций. Открываем наш контроллер либо через вкладку Window — Animation — Animator, либо кликнув 2 раза по нашему аниматору Player в окне Project. Откроется окно Animator, которое будет выглядеть примерно так.

Для начала обратим своё внимание на зелёный блок Entry, это начальная точка аниматора. А оранжевая стрелочка, которая исходит от блока Entry указывает на стартовую анимацию, которая будет воспроизведена сразу после запуска сцены. С помощью таких стрелочек, нам нужно указать все возможные переходы от одних анимаций к другим.

Например, от состояния покоя idle анимация может быть переключена на анимацию бега run. И это нам нужно указать через стрелочки. Для этого правой кнопкой мыши нажмём на анимацию idle. Далее в выпадающем списке жмём Make Transition, и далее указываем к какому блоку будет вести стрелочка. Укажем на блок run. Ура, стрелочка прехода создана. Создаём такие же стрелочки и между другими анимациями. У Вас должно получится так:

Так же обратите внимание на блок Any Stay, что означает Любое Состояние. Например, чтобы не создавать много стрелочек от множества анимаций к анимации jump, можно сделать всего одну стрелочку от Any State. Это будет тоже самое.

Теперь настроим наши переходы. Для этого жмём на любую БЕЛУЮ стрелочку, и в окне Inspector проводим следующие настройки:

  • В поле Has Exit Time убираем галочку, чтобы анимация прерывалась сразу же, как произойдёт смена анимаций на другую.
  • В поле Transition Duration указываем значение 0, чтобы переход между анимациями был не плавный, а мгновенный.

Такие же настройки нужно проделать со ВСЕМИ БЕЛЫМИ стрелочками.

Готово! Теперь необходимо создать условия, при которых будет осуществляться переход из одной анимации к другой. Для этого создадим две переменные. Одна переменная будет хранить информацию о том, бежит ли наш персонаж — если да, то будем воспроизводить анимацию бега. А вторая переменная будет хранить информацию о том, находится ли наш персонаж в прыжке — если да, то воспроизводим анимацию прыжка.

Создадим эти две переменные с названиями moveX и Jumping с типами Float и Bool соответственно. Для этого в этом же окне выбираем Parametrs, жмём на плюсик, и выбираем тип. Далее указываем название этих переменных.

Переменные созданы, теперь необходимо создать 5 условий перехода, для каждой белой стрелочки. Приведу пример, как создать условие перехода с idle на run. Для этого жмём на белую стрелочку перехода между этими анимациями, и в окне Inspector находим отдел Conditions, в котором указываем, что переход осуществляется тогда, когда переменная moveX имеет значение больше чем 0.1 — то-есть находится в движении по оси X:

По такой же примеру необходимо создать ещё 4 условия для остальных белых стрелочек перехода.

  • От run к idle: переменная moveX имеет значение меньше чем 0.1
  • От Any State к jump: переменная jumping имеет значение true.
  • От jump к idle: переменная jumping имеет значение false.
  • От jump к run: переменная jumping имеет значение false.

Запуск анимаций через скрипт

Мы почти завершили. Отсалось совсем немного. Теперь нам необходимо в эти переменные занести данные из нашего скрипта C#, во время передвижения персонажа и прыжка.

Для этого откройте свой C# скрипт, в котором прописана ваша функция передвижения персонажа, и для начала объявите переменную anim, в котором будет хранится ссылка на наш контроллер.

public Animator anim;

Далее в методе Start() или Awake() присвоим ссылку к нашей переменной:

anim = GetComponent();

Отлично, теперь с помощью метода SetFloat() установим нашей переменной moveX значения полученное от нашего передвижения Mathf.Abs(Input.GetAxisRaw(«Horizontal»)) по модулю:

anim.SetFloat("moveX", Mathf.Abs(Input.GetAxisRaw("Horizontal")));

Теперь как только персонаж начнёт своё движение, будет воспроизведена анимация бега. А если персонаж остановится, то анимация бега перейдёт в состояние покоя.

Теперь работа с прыжком:

В вашем скрипте должна быть переменная, которая отвечает за то, находится ли персонаж на земле или нет. У меня эта переменная называется isGround. Необходимо проверять, если персонаж на земле, то в переменную Jumping заносим false, и анимация прыжка не воспроизводится. А если персонаж находится не на земле, то нужно в переменную Jumping записать true — которая и воспроизведёт анимацию прыжка:

if(isGround) < anim.SetBool("Jumping", false); >else

На это всё! Поздравляем, анимация готова.

Важно: В некоторых случаях, в зависимости от анимации прыжка, нам необходимо отменить циклическое воспроизведение анимации прыжка. Поэтому нажмите на стрелочку, исходящую от Any State ведущая к jump, и в окне Inspector в поле Can Transition To поставьте галочку.

Теперь уже точно всё! Надеюсь мне получилось объяснить принцип создания спрайтовой покадровой анимации. Так же напомню, что существует так же и костная анимация, которая так же довольно часто используется. Поэтому, если Вам интересна данная тема, то можете посетить наш гайд по созданию костной 2д анимации.

Если возникли вопросы, задавайте их в комментариях. И не забудьте поставить лайк за столь большой труд 🙂

Переходы анимации

Переходы анимации ( Animation Transitions ) определяют что именно происходит, когда вы переключаете одно состояние анимации ( Animation State ) в другое. В любой момент времени может быть активен только один переход. A transition can be set up to only occur when a certain condition is true, and these conditions are based on the values of parameters set up in the Animator Controller.

For example, your character might have a patrolling state and a sleeping state. The transition between patrolling and sleeping could be set up to occur only when an “alertness” parameter value drops below a certain level.

An example of a transition as viewed in the inspector.

Transitions can be given a name, by entering text into the field as shown:

This name is then shown in the Inspector of the state which uses the transition:

There can be only one transition active at any given time, however the currently active transition can be interrupted by another transition, if the settings have been configured to allow it.

Transition Properties

The following properties can be used to adjust the transition and how it blends between the current and next state (the two states connected by the transition).

Свойство: Функция:
Has Exit Time Determines whether the transition’s condition can take effect at any time, or only during the state’s exit time.
Settings Foldout containing detailed transition settings:
Exit Time If “Has Exit Time” is enabled, this value represents the time after which the condition can take effect. This is represented in normalised time, so for example an exit time of 0.75 would mean that the transition can take effect only when the playback of the current state is more than 75% complete and the transition’s conditions are met.
Fixed Duration If the Fixed Duration box is checked, the transition time is interpreted in seconds. If the Fixed Duration box is not checked, the transition time is interpreted as a fraction of the normalized time of the source state.
Transition Duration The duration of the transition, in normalised time (relative to the current state’s duration). This is visualised in the transition graph as the portion between the two blue markers.
Transition Offset The offset of the time to begin playing in the destination state which is transitioned to. For example, a value of 0.5 would mean the target state will begin playing at 50% of the way through its own timeline.
Interrupt Source Allows you to control the circumstances under which this transition may be interrupted.
None Атомарен ли этот переход (атомарные операции не могут быть прерваны)?
Current State The transition can be interrupted by other transitions within the current state, but not within the destination state.
Next State The transition can be interrupted by transitions defined in target (next) state, but not within the current state.
Current State then Next State The transition can be interrupted by transitions on either the current or the next. However, if a transition becomes true in both current and next at the same time, the current state will take priority.
Next State then Current State The transition can be interrupted by transitions on either the current or the next. However, if a transition becomes true in both current and next at the same time, the next state will take priority.
Ordered Interruption Determines whether the current transition can be interrupted by other transitions independently of their order.

Transition Graph

The settings listed above can either be adjusted manually by entering numbers into the fields, or the transition diagram can be used, which will modify the values above when the visual elements are manipulated.

In the above diagram, you can: — Drag the ‘out’ marker to change the duration of the transition. — Drag the ‘in’ marker to change the duration of the transition and the exit time. — Drag the target transition to adjust the transition offset. — Drag the preview playback marker to scrub through the animation blend in the preview window at the bottom of the inspector.

Transitions between blendtree states

If either the current or next state belonging to this transition is a Blend Tree state, the blend tree parameters will appear in the inspector. These values are adjustable, and these are provided as a way to preview how your transition would look with the blendtree values set to different configurations. If your blendtree contains clips of differing lengths, you may want to test what your transition looks in the case when the blendtree is showing the short clip and the case where it’s showing the long clip. Adjusting these values do not affect how the transition behaves at runtime, they are solely for helping you preview how the transition could look in different situations.

The blendtree parameter preview controls, visible when either your current or next state is a blend tree state.

Conditions

A transition can have a single condition, multiple conditions, or no conditions at all. If your transition has no conditions, only the exit time will be considered. When the exit time is reached, the transition will occur. If your transition has one or more conditions, the conditions must all be met before the transition will be triggered.

Условие (Condition) состоит из:

  • An event parameter, whose value will be considered in the condition.
  • Логического условия, при необходимости (например, Less (меньше)/ Greater (больше) для float значений).
  • Значения параметра (при необходимости).

If you have “Has Exit Time” selected for the transition and have one or more conditions, the condition(s) will only be checked after the exit time of the state. This allows you to ensure that your transition will only occur during a certain portion of the animation.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *