Как сделать так, чтобы анимационные клипы запускались по одному и не смешивались друг с другом?
У меня есть 2D анимация для вида, ходьбы и атаки - каждая с 4 направлениями - всего 12 анимационных клипов. Контроллер анимации имеет следующие параметры:
- облицовка (целое число)
- isMoving (логическое)
- isAttacking (триггер)
Я хочу, чтобы одновременно воспроизводился только один клип. Это работает для анимации вида и ходьбы, потому что они являются взаимоисключающими в зависимости от их параметров. Проблема заключается в том, что клип основан на триггере. Когда я вхожу в это состояние, оно смешивается с уже воспроизводимой анимацией вида или ходьбы. Когда я вхожу в анимацию атаки, я хочу, чтобы текущая анимация остановилась, и анимация атаки запустилась до завершения, прежде чем анимация просмотра или ходьбы снова запустится.
Желательно, чтобы переходы происходили только из Any State
друг к другу (без межгосударственных переходов). У меня есть куча этих анимаций для разных персонажей и оборудования, плюс в будущем у меня будет еще несколько типов анимаций, помимо внешнего вида / ходьбы / атаки, поэтому я бы хотел избежать сложности, которая может возникнуть при добавлении еще несколько десятков переходов.
Я думал об изменении isAttacking
параметр от триггера до логического значения, но это кажется плохим выбором, потому что тогда мне понадобится код и событие анимации, чтобы отслеживать мою анимацию атаки и установить isAttacking
в false, когда игра закончена, и это, кажется, добавляет сложности и раздувает систему
3 ответа
Вы должны были бы соединить все состояния между собой... это как 66
переходы.. не очень весело.. потому что... теперь добавить один переход спонтанно:D
Я имею в виду, что вы могли бы сделать это и использовать HasExitTime = true; ExitTime = 1
для всех переходов, выходящих из состояний атаки, чтобы дождаться окончания анимации перед переходом - и для всех остальных HasExitTime = false
чтобы не ждать, а начать переход напрямую.
Но я бы настоятельно рекомендовал использовать небольшой скрипт и использовать bool
за isAttacking
это сделало бы вашу жизнь намного проще.
Вы можете просто добавить скрипт ( StateMachineBehaviour), чтобы он атаковал сами состояния (аналогично компонентам в GameObjects), где вы ждете, пока анимация не завершится, и сбросите bool. Чем вы можете оставить все переходы на Any State
и настройте их так, как вы хотите.
При выборе состояния в окне аниматора вы заметите, что в каждом состоянии есть инспектор с Add Behaviour
кнопка очень похожа на GameObjects
:
здесь создать новое поведение и просто сделать
using UnityEngine;
public class StopAttack : StateMachineBehaviour
{
private float timePassed = 0;
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//
// Unity's comment above sounds a bit confusing ... but
// simply consider this the Update method of StateMachineBehaviours ;)
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
timePassed += Time.deltaTime;
// while timePassed is smaller than the animation clip's length
// do nothing
if (timePassed < stateInfo.length) return;
// reset the bool
animator.SetBool("isAttacking", false);
}
}
Теперь для плавного смешивания просто установите переходы на что-то вроде
- HasExitTime = true
- ExitTime = 0,75 (%)
- TransitionDuration = 0,25 (секунд, если
FixedDuration
, % иначе)
в зависимости от этой продолжительности перехода и т. д. вы также можете захотеть, чтобы анимация атаки isAttacking
немного раньше как например
if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;
РЕДАКТИРОВАТЬ неправильно прочитал вопрос. Хорошо бы просто установить длительность перехода в настройках перехода в инспекторе на 0.
В контроллере анимации: выберите переход, перейдите к инспектору, щелкните символ "-" в списке переходов. Вы также можете открыть настройки и изменить переход, если это то, что вы хотите с другими анимациями.
Попробуйте добавить состояние анимации в 8 углов вместо 4. Так, например, сейчас у вас может быть 4 угла: вверх-вправо, вверх-влево, вниз-влево и вниз-вправо, поэтому, когда он выбирает состояние, он выбирает два из них и ничего не знает. какой из них придерживаться. Возможно, попробуйте добавить узлы в отсутствующие углы, например ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО, и выберите подходящую анимацию.
Я использовал это в своей игре, и, по крайней мере, на данный момент это решило проблему.