Как сделать так, чтобы анимационные клипы запускались по одному и не смешивались друг с другом? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 2D анимация для вида , ходьбы и атаки - каждая с 4 направлениями - всего 12 анимационных клипов.Контроллер анимации имеет следующие параметры:

  • облицовка (целое число)
  • isMoving (логическое значение)
  • isAttacking (триггер)

Я хочу, чтобы одновременно воспроизводился только один клип.Он работает для анимаций look и walk , поскольку они являются взаимоисключающими в зависимости от своих параметров.Проблема в том, что клип атака основан на триггере.Когда я вхожу в это состояние, оно смешивается с анимацией look или walk , которая уже воспроизводится.Когда я вхожу в анимацию атаки , я хочу, чтобы текущая анимация была остановлена, и анимация атаки до конца выполнялась до того, как look или walk анимация воспроизводится снова.

Предпочтительно, я хочу сделать это, чтобы переходы только переходили из Any State в другое состояние (без межгосударственных переходов).У меня есть куча этих анимаций для разных персонажей и оборудования, плюс в будущем у меня будет еще несколько типов анимаций, помимо внешнего вида / ходьбы / атаки, поэтому я бы хотел избежать сложности, которая может возникнуть при добавленииеще несколько десятков переходов.

Я думал об изменении параметра isAttacking с триггера на логический, но это кажется плохим выбором, потому что тогда мне понадобится код и событие анимации для отслеживаниямоей атаки анимации и установите isAttacking на false, когда игра закончится, и это, кажется, добавляет сложности и раздувает систему

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы должны соединить все состояния между собой ... это похоже на 66 переходы ... не очень весело ... потому что ... теперь добавьте один переход спонтанно: D

IЭто означает, что вы могли бы сделать это и использовать HasExitTime = true; ExitTime = 1 для всех переходов, выходящих из состояний атаки, чтобы дождаться окончания анимации перед переходом - и для всех остальных есть HasExitTime = false, чтобы не ждать, а запустить переход непосредственно.


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

Вы можете просто добавить сценарий( StateMachineBehaviour ), чтобы он атаковал сами состояния (аналогично компонентам в GameObjects), где вы ждете, пока анимация не завершится, и сбросите bool.Чем вы можете оставить все переходы на Any State и настроить их так, как хотите.

При выборе состояния в окне аниматора вы заметите, что в каждом состоянии есть Инспектор с кнопкой Add Behaviour, очень похожей на GameObjects:

enter image description here

здесь создайте новое поведение и просто выполните

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 голосов
/ 05 февраля 2019

РЕДАКТИРОВАТЬ Неправильный вопрос.Хорошо бы просто установить длительность перехода в настройках перехода в инспекторе на 0.

В контроллере анимации: выберите переход, перейдите к инспектору, нажмите символ «-» в списке переходов,Вы также можете открыть настройки и изменить переход, если это то, что вы хотите с другими анимациями.

enter image description here

...