Другое

Как добавить анимации ходьбы, бега и прыжка в Unity

Подробное руководство по добавлению анимаций ходьбы, бега и прыжка для персонажа игрока в Unity с примерами кода C# и решением проблем.

Как добавить анимации ходьбы, бега и прыжка для персонажа игрока в Unity? Я пробовал различные туториалы, но они либо не работают, либо объяснения в них не совсем понятны. Также обращался за помощью, но ответов не было достаточно ясными. Подробное руководство или пример кода были бы очень полезны.

Для добавления анимаций ходьбы, бега и прыжка для персонажа игрока в Unity вам потребуется настроить систему анимации, создать состояния в Animator, установить параметры переходов и написать скрипт управления движением. Процесс включает настройку компонентов Animator и CharacterController, создание анимаций или импорт готовых, а также написание кода на C# для управления анимациями в зависимости от действий игрока.

Содержание


Основы настройки анимации персонажа

Для начала убедитесь, что у вас есть модель персонажа с правильной структурой скелета. Импортируйте модель в Unity и проверьте, что все кости имеют правильные имена и что анимации могут быть применены к этой модели.

  1. Создание анимаций или импорт готовых

    • Если вы создаете анимации в сторонних программах, экспортируйте их в формате FBX
    • Для готовых анимаций убедитесь, что они совместимы с вашей моделью персонажа
    • Настройте импорт для сохранения иерархии костей
  2. Настройка компонента Animator

    • Добавьте компонент Animator к вашему персонажу
    • Создайте новый контроллер анимации: Assets → Create → Animator Controller
    • Перетащите этот контроллер на компонент Animator персонажа
  3. Настройка Character Controller

    • Добавьте компонент Character Controller для базового физического движения
    • Настройте параметры Character Controller в зависимости от вашего персонажа

Создание состояний анимации в Animator

Откройте окно Animator (Window → Animation → Animator) и приступите к созданию состояний для ваших анимаций.

  1. Добавление анимаций в Animator

    • Откройте окне Project и найдите ваши анимации
    • Перетащите анимации ходьбы, бега и прыжка в окно Animator
    • Unity автоматически создаст состояния из этих анимаций
  2. Настройка состояний

    • Создайте базовое состояние “Idle” (бездействие) как начальное состояние
    • Убедитесь, что все состояния имеют правильные циклические настройки:
      • Для ходьбы и бега установите Loop Time
      • Для прыжка установите Loop Time = false
  3. Иерархия состояний

    • Настройте логическую иерархию: Idle → Walk → Run → Jump
    • Создайте родительские группы для логической организации, если необходимо

Настройка параметров и переходов

Для управления анимациями вам понадобятся параметры, которые будут изменяться в зависимости от действий игрока.

  1. Создание параметров

    • В окне Animator нажмите правой кнопкой мыши → Create → Parameter
    • Создайте следующие параметры:
      • Speed (Float) - для управления скоростью движения
      • IsGrounded (Bool) - для проверки, стоит ли персонаж на земле
      • IsJumping (Bool) - для состояния прыжка
  2. Настройка переходов

    • Для каждого состояния создайте переходы в другие состояния на основе параметров
    • Например:
      • Из Idle в Walk при Speed > 0.1
      • Из Walk в Run при Speed > 5.0
      • Из Walk/Run в Jump при IsJumping = true
      • Из Jump в Walk при IsGrounded = true и Speed > 0.1
  3. Настройка условий переходов

    • Установите правильные пороговые значения для параметров
    • Настройте время смешивания (Transition Duration) для плавных переходов
    • Отключите Has Exit Time для более точного контроля переходов

Скрипт управления анимациями на C#

Создайте скрипт для управления движением персонажа и переключением анимаций. Вот базовый пример:

csharp
using UnityEngine;

public class CharacterAnimationController : MonoBehaviour
{
    public Animator animator;
    public CharacterController characterController;
    public float walkSpeed = 3.0f;
    public float runSpeed = 6.0f;
    public float jumpForce = 8.0f;
    
    private float currentSpeed;
    private Vector3 moveDirection;
    private bool isGrounded;
    private bool isJumping;
    
    void Start()
    {
        // Получаем компоненты
        animator = GetComponent<Animator>();
        characterController = GetComponent<CharacterController>();
        
        // Устанавливаем начальную скорость
        currentSpeed = walkSpeed;
    }
    
    void Update()
    {
        // Проверка, стоит ли персонаж на земле
        isGrounded = characterController.isGrounded;
        
        // Обработка прыжка
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            isJumping = true;
            moveDirection.y = jumpForce;
        }
        
        // Обработка движения
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        moveDirection.x = horizontal * currentSpeed;
        moveDirection.z = vertical * currentSpeed;
        
        // Определение текущей скорости
        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            currentSpeed = runSpeed;
        }
        else
        {
            currentSpeed = walkSpeed;
        }
        
        // Сброс прыжка при приземлении
        if (isGrounded && moveDirection.y < 0)
        {
            moveDirection.y = 0f;
            isJumping = false;
        }
        
        // Применение гравитации
        moveDirection.y -= Physics.gravity.y * Time.deltaTime;
        
        // Движение персонажа
        characterController.Move(moveDirection * Time.deltaTime);
        
        // Обновление параметров аниматора
        UpdateAnimatorParameters();
    }
    
    void UpdateAnimatorParameters()
    {
        // Обновление параметров в аниматоре
        animator.SetFloat("Speed", characterController.velocity.magnitude);
        animator.SetBool("IsGrounded", isGrounded);
        animator.SetBool("IsJumping", isJumping);
    }
}

Практический пример кода

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

csharp
using UnityEngine;

[RequireComponent(typeof(CharacterController), typeof(Animator))]
public class AdvancedCharacterController : MonoBehaviour
{
    [Header("Movement Settings")]
    public float walkSpeed = 3.5f;
    public float runSpeed = 7.0f;
    public float rotationSpeed = 10.0f;
    public float jumpForce = 8.0f;
    
    [Header("Ground Check")]
    public Transform groundCheck;
    public float groundRadius = 0.4f;
    public LayerMask groundMask;
    
    private CharacterController characterController;
    private Animator animator;
    
    private Vector3 velocity;
    private bool isGrounded;
    private bool isJumping;
    private float currentSpeed;
    
    void Awake()
    {
        characterController = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
        
        if (groundCheck == null)
        {
            Debug.LogError("Ground Check transform is not assigned!");
        }
    }
    
    void Update()
    {
        GroundCheck();
        HandleMovement();
        HandleJump();
        ApplyGravity();
        RotateCharacter();
        
        // Обновление анимаций
        UpdateAnimator();
    }
    
    private void GroundCheck()
    {
        isGrounded = Physics.CheckSphere(groundCheck.position, groundRadius, groundMask);
        if (isGrounded && velocity.y < 0)
        {
            velocity.y = -2f;
            isJumping = false;
        }
    }
    
    private void HandleMovement()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        // Определение скорости (ходьба или бег)
        currentSpeed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
        
        // Движение относительно камеры
        Vector3 move = new Vector3(horizontal, 0f, vertical);
        move = transform.right * move.x + transform.forward * move.z;
        
        characterController.Move(move * currentSpeed * Time.deltaTime);
    }
    
    private void HandleJump()
    {
        if (Input.GetButtonDown("Jump") && isGrounded && !isJumping)
        {
            velocity.y = Mathf.Sqrt(jumpForce * -2f * Physics.gravity.y);
            isJumping = true;
        }
    }
    
    private void ApplyGravity()
    {
        velocity.y += Physics.gravity.y * Time.deltaTime;
        characterController.Move(velocity * Time.deltaTime);
    }
    
    private void RotateCharacter()
    {
        if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0)
        {
            Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            Quaternion toRotation = Quaternion.LookRotation(moveDirection, Vector3.up);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
        }
    }
    
    private void UpdateAnimator()
    {
        animator.SetFloat("Speed", characterController.velocity.magnitude);
        animator.SetBool("IsGrounded", isGrounded);
        animator.SetBool("IsJumping", isJumping);
        
        // Дополнительные параметры для более плавных анимаций
        animator.SetFloat("VerticalInput", Input.GetAxis("Vertical"));
        animator.SetFloat("HorizontalInput", Input.GetAxis("Horizontal"));
    }
    
    // Визуализация для отладки
    void OnDrawGizmos()
    {
        if (groundCheck != null)
        {
            Gizmos.color = Color.green;
            Gizmos.DrawWireSphere(groundCheck.position, groundRadius);
        }
    }
}

Этот включает:

  • Проверку на землю с помощью SphereCast
  • Плавную вращение персонажа
  • Дополнительные параметры анимации
  • Визуальную отладку Gizmos

Решение распространенных проблем

Проблема 1: Анимации не переключаются

Решение: Проверьте параметры аниматора и условия переходов. Убедитесь, что значения параметров соответствуют условиям переходов.

Проблема 2: Персонаж “проскальзывает” при прыжке

Решение: Увеличьте значение groundRadius в настройках или настройте слои для физического взаимодействия.

Проблема 3: Анимации перекрываются

Решение: Настройте время смешивания (Transition Duration) в настройках переходов между состояниями.

Проблема 4: Прыжок слишком высокий/низкий

Решение: Отрегулируйте значение jumpForce в скрипте.

Проблема 5: Персонаж движится назад

Решение: Проверьте конфигурацию осей в настройках Input Manager или в настройках Character Controller.


Источники

  1. Официальная документация Unity - Animator Controller
  2. Unity Learn - Character Animation Tutorial
  3. Unity Documentation - Character Controller
  4. Unity Scripting API - Animator
  5. Brackeys - Unity Animation Tutorial

Заключение

Основные моменты для успешной реализации анимаций персонажа в Unity:

  1. Правильная настройка иерархии анимаций - создайте четкую структуру состояний с правильными параметрами переходов
  2. Эффективное управление параметрами - используйте Float, Bool и Trigger параметры для гибкого контроля анимаций
  3. Оптимизированный скрипт управления - пишите чистый, читаемый код с правильной логикой обновления анимаций
  4. Тестирование и отладка - используйте Gizmos и отладочные инструменты Unity для проверки работы системы

Для дальнейшего изучения рекомендую поэкспериментировать с Blend Trees для более плавных переходов между анимациями движения, а также изучить систему Animation Events для синхронизации действий с анимациями. Не бойтесь экспериментировать с параметрами - именно так вы достигнете идеальных результатов для вашего проекта.

Авторы
Проверено модерацией
Модерация