← Назад к вопросам

Как работает State Machine в Animator?

2.0 Middle🔥 251 комментариев
#Анимация#Паттерны проектирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает State Machine в Animator Unity?

State Machine (или State Machine Behaviour) в Animator Unity — это ключевой механизм для управления анимациями персонажей или объектов. Он основан на концепции Finite State Machine (FSM), где объект может находиться только в одном из конечного числа состояний в любой момент времени, а переходы между ними происходят по строго определённым правилам.

Основные компоненты State Machine Animator

  1. States (Состояния) — это узлы в графе машины состояний. Каждое состояние обычно представляет одну анимацию (например, Idle, Walk, Jump).
  2. Transitions (Переходы) — связи между состояниями, определяющие условия, при которых система переходит из одного состояния в другое.
  3. Parameters (Параметры) — переменные (Bool, Float, Int), которые используются в условиях переходов. Они управляются из скриптов игры.
  4. Conditions (Условия) — логические правила, основанные на параметрах, которые должны быть выполнены для активации перехода.

Работа и управление через код

Машина состояний работает циклически: Animator Controller оценивает текущее состояние, проверяет условия всех переходов, исходящих из него, и если условия выполнены — переходит к следующему состоянию. Основное управление происходит через изменение Parameters из C# скриптов.

using UnityEngine;

public class PlayerAnimationController : MonoBehaviour
{
    private Animator animator;

    private void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        // Управление параметрами на основе логики игры
        float horizontalInput = Input.GetAxis("Horizontal");
        bool isJumping = Input.GetKeyDown(KeyCode.Space);

        // Передача значений параметрам Animator
        animator.SetFloat("Speed", Mathf.Abs(horizontalInput));
        animator.SetBool("IsJumping", isJumping);

        // Пример сложного условия: переход в "Attack" только если Speed == 0 и IsJumping == false
        if (Input.GetKeyDown(KeyCode.F) && Mathf.Abs(horizontalInput) < 0.1f && !isJumping)
        {
            animator.SetTrigger("Attack");
        }
    }
}

Ключевые особенности и практики

  • Логика переходов: Условия могут быть простыми (IsMoving == true) или сложными, комбинирующими несколько параметров (Speed > 0.5 && IsGrounded == true). Переходы могут иметь порядок оценки и настройки времени (Transition Duration, Exit Time).
  • Любые State и Sub-State Machines: Для сложных объектов (например, персонаж с верхней и нижней частью тела) используются Sub-State Machines, создавая иерархию состояний.
  • State Machine Behaviours: Это специальные скрипты, которые можно добавить непосредственно к состоянию для выполнения логики при входе в состояние, во время его работы и при выходе.
// Пример State Machine Behaviour
using UnityEngine;

public class CustomAttackBehaviour : StateMachineBehaviour
{
    // Вызывается при первом входе в состояние
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Атака началась!");
        animator.GetComponent<Player>().EnableWeaponCollider();
    }

    // Вызывается при выходе из состояния
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Атака завершена!");
        animator.GetComponent<Player>().DisableWeaponCollider();
    }
}
  • Оптимизация: Для эффективности следует минимизировать количество активных переходов и сложных условий в каждом кадре, использовать Layer Masking и Avatar Masking для разделения анимации разных частей модели.

Итог

State Machine в Animator — это мощный, визуальный и интуитивно понятный инструмент для создания сложных анимационных систем. Его работа основана на изменении параметров из игрового кода, что вызывает проверку условий переходов между состояниями. Использование State Machine Behaviours и Sub-State Machines позволяет создавать глубокую и модульную логику анимации, интегрированную с игровыми процессами. Правильное понимание и использование этого механизма — основа профессиональной анимации в Unity.