You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Blend Tree无法播放角色多方向及待机动画求助

角色四方向移动+待机Blend Tree动画故障排查

问题背景

需要为角色制作5种不同方向移动(W/S/A/D)及待机(AFK)动画,尝试通过Unity Blend Tree连接动画但未成功,代码逻辑无异常,问题大概率出在Blend Tree配置上,已耗时3小时仍未解决。原本期望首次尝试即可成功,但实际未能实现。

关联代码

using UnityEngine;

public class PlayerVisual : MonoBehaviour
{
    private Animator animator;
    public float moveSpeed = 5f;

   
    public string IsWalkingW = "IsWalkingW";
    public string IsWalkingS = "IsWalkingS";
    public string IsWalkingA = "IsWalkingA";
    public string IsWalkingD = "IsWalkingD";

    
    public enum AnimationMode { BlendTree, SingleAnimation }
    public AnimationMode currentMode = AnimationMode.BlendTree;
            
    void Start()
    {
        animator = GetComponent<Animator>();
        if (animator == null)
        {
            Debug.LogError("Animator component not found on this GameObject!");
        }
    }

    void Update()
    {
        
        if (Input.GetKeyDown(KeyCode.Q))
        {
            currentMode = (currentMode == AnimationMode.BlendTree) ? AnimationMode.SingleAnimation : AnimationMode.BlendTree;
        }

        switch (currentMode)
        {
            case AnimationMode.BlendTree:
                UpdateBlendTreeAnimation();
                break;
            case AnimationMode.SingleAnimation:
                UpdateSingleAnimation();
                break;
        }
    }

    private void UpdateBlendTreeAnimation()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        animator.SetFloat("HorizontalSpeed", horizontal);
        animator.SetFloat("VerticalSpeed", vertical);

        
        Vector3 movement = new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
        transform.Translate(movement);
    }

    private void UpdateSingleAnimation()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            PlayAnimation(IsWalkingW, true);
        }
        else if (Input.GetKeyUp(KeyCode.W))
        {
            PlayAnimation(IsWalkingW, false);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            PlayAnimation(IsWalkingS, true);
        }
        else if (Input.GetKeyUp(KeyCode.S))
        {
            PlayAnimation(IsWalkingS, false);
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            PlayAnimation(IsWalkingA, true);
        }
         else if (Input.GetKeyUp(KeyCode.A))
         {
             PlayAnimation(IsWalkingA, false);
         }
        if (Input.GetKeyDown(KeyCode.D))
        {
            PlayAnimation(IsWalkingD, true);
        }
        else if (Input.GetKeyUp(KeyCode.D))
        {
             PlayAnimation(IsWalkingD, false);
        }
    }

     private void PlayAnimation(string animationName, bool isWalking)
    {
        animator.SetBool(animationName, isWalking);
    }
}

Blend Tree核心排查点

  • 参数一致性检查:Animator Controller中必须存在HorizontalSpeed和VerticalSpeed两个Float参数,名称大小写要和代码完全匹配,不能有拼写错误。
  • Blend Tree类型选择:必须选用2D Freeform Directional类型,该类型专门适配四方向+待机的混合逻辑,不要误用其他2D类型。
  • 动画节点配置:
    • 待机动画:Position设为(0, 0),Speed设为0
    • W方向动画:Position设为(0, 1),Speed设为1
    • S方向动画:Position设为(0, -1),Speed设为1
    • A方向动画:Position设为(-1, 0),Speed设为1
    • D方向动画:Position设为(1, 0),Speed设为1
  • 过渡条件配置:确保从待机状态到Blend Tree的过渡条件为HorizontalSpeed != 0 || VerticalSpeed != 0,从Blend Tree回到待机的条件为HorizontalSpeed == 0 && VerticalSpeed == 0,同时取消过渡的Has Exit Time选项,避免延迟。
  • 根运动冲突检查:如果动画片段启用了根运动,需关闭代码中的transform.Translate移动逻辑,或者关闭Animator组件的Apply Root Motion选项,防止两者移动逻辑冲突。
  • 实时参数监控:在Unity编辑器的Animator窗口中,打开Parameters面板,实时查看HorizontalSpeed和VerticalSpeed的数值变化,确认键盘输入是否正确传递到Animator。
  • 动画循环设置:所有移动动画片段必须勾选Loop Time选项,否则动画播放一次后会停止,无法持续循环。

内容的提问来源于stack exchange,提问作者Сергей Левашов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:27:04