Как сделать так, чтобы анимационные клипы запускались по одному и не смешивались друг с другом?

У меня есть 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 угла: вверх-вправо, вверх-влево, вниз-влево и вниз-вправо, поэтому, когда он выбирает состояние, он выбирает два из них и ничего не знает. какой из них придерживаться. Возможно, попробуйте добавить узлы в отсутствующие углы, например ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО, и выберите подходящую анимацию.

Я использовал это в своей игре, и, по крайней мере, на данный момент это решило проблему.

Другие вопросы по тегам