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

Unity 3D中Bool参数无法切换Idle动画至其他动画的问题求助

修复Unity玩家控制器的动画切换逻辑

你的代码已经正确声明了Animator私有字段并在Start方法中获取了组件,但动画切换逻辑存在明显问题——最后那段设置IsMoving参数的代码会先设为true再立刻设为false,导致动画永远停留在Idle状态。以下是针对AWSD控制逻辑的修正方案:

问题代码分析

原代码中这段逻辑完全无效:

animator.SetBool("IsMoving", true);
{
    animator.SetBool("IsMoving", false);
}

它没有任何条件判断,执行顺序是先把IsMoving设为true,紧接着就设为false,Animator根本不会捕捉到移动状态。

修正后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private float speed = 5.0f;
    private Animator animator;
    // 新增字段:跟踪玩家是否处于移动/旋转状态
    private bool isMoving;

    void Start()
    {
        animator = GetComponent<Animator>();
        speed = 5.0f;
    }

    void Update()
    {
        // 每帧开始重置移动状态为false
        isMoving = false;

        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * Time.deltaTime * speed);
            isMoving = true;
        }
        if (Input.GetKey(KeyCode.S))
        { 
            transform.Translate(-Vector3.forward * Time.deltaTime * speed);
            isMoving = true;
        }
        if (Input.GetKey(KeyCode.A)) 
        { 
            transform.Rotate(0, -1, 0);
            isMoving = true;
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(0, 1, 0);
            isMoving = true;
        }

        // 根据实际移动状态设置动画参数
        animator.SetBool("IsMoving", isMoving);
    }
}

关键改动说明

  • 新增private bool isMoving;私有字段:用来记录当前帧玩家是否有移动或旋转操作
  • 每帧开头重置isMoving = false;:确保没有按键输入时,状态会自动回到Idle
  • 在每个AWSD的输入判断块内设置isMoving = true;:只要有移动/旋转行为,就标记为正在移动
  • 最后统一设置animator.SetBool("IsMoving", isMoving);:确保每帧只更新一次动画参数,逻辑清晰且避免冲突

这样修改后,玩家按住AWSD任意按键时,IsMoving会被设为true,触发移动动画;松开按键后,isMoving重置为false,动画自动切回Idle状态,完全保留你喜欢的AWSD控制布局。

内容的提问来源于stack exchange,提问作者BBatz07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:33