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

Unity Animator中Walk状态HumanoidWalk动画为何延迟5秒以上启动?

问题背景
  • 已在Animator中新增类型为Trigger、名为Walk的参数,相关配置截图如下:
    • 状态与参数配置:状态与参数配置
    • 状态过渡配置:状态过渡配置
  • 项目Update生命周期函数中实现逻辑如下:
private void Update()
{
    if (startRotating)
    {
        if (rotateTowards)
        {
            if (rotateTowardsObject)
            {
                anim.SetTrigger("Walk");

                Vector3 targetDirection = objectToRotatetowards.position - transform.position;
                float singleStep = rotationSpeed * Time.deltaTime;
                Vector3 newDirection = Vector3.RotateTowards(transform.forward, targetDirection, singleStep, 0.0f);
                transform.rotation = Quaternion.LookRotation(newDirection);
            }
        }
    }
}
  • 异常表现:运行时rotateTowardsObject标识位置为true后,旋转逻辑会立即执行,但Walk状态对应的HumanoidWalk动画需要等待5秒甚至更长时间才会开始播放。
故障原因

故障由代码逻辑和Animator配置两个问题共同导致:

  1. Trigger参数被重复调用重置
    当前代码将anim.SetTrigger("Walk")放在Update的持续判断分支中,只要rotateTowardsObject为true,每帧都会调用一次SetTrigger。Unity Animator的Trigger参数机制为:若调用SetTrigger时不满足过渡触发条件,下一次重复调用SetTrigger会重置之前的触发信号,导致触发信号被反复刷新,始终无法等到有效触发时机。
  2. 状态过渡配置了固定退出时间
    从数秒延迟的现象判断,当前状态到Walk状态的过渡开启了Has Exit Time选项,且退出时间点设置为当前动画播放总时长的末尾位置(例如当前Idle动画时长为5秒,Exit Time设置为0.95左右就会等到动画接近播放完成才允许过渡),同时未配置过渡打断规则,导致必须等当前动画播放到设定的退出时间点,才会响应Trigger信号完成状态切换。
修复方案

代码调整

将SetTrigger的调用从帧循环的持续判断中移出,仅在rotateTowardsObject从false变为true的瞬间调用一次,避免重复重置Trigger信号,参考代码如下:

// 缓存上一帧的旋转标识状态
private bool _lastRotateTowardsObjectState = false;
private void Update()
{
    if (startRotating && rotateTowards)
    {
        // 仅在标识位首次变为true时触发一次Walk动画
        if (rotateTowardsObject && !_lastRotateTowardsObjectState)
        {
            anim.SetTrigger("Walk");
        }
        _lastRotateTowardsObjectState = rotateTowardsObject;

        // 旋转逻辑保持不变
        if (rotateTowardsObject)
        {
            Vector3 targetDirection = objectToRotatetowards.position - transform.position;
            float singleStep = rotationSpeed * Time.deltaTime;
            Vector3 newDirection = Vector3.RotateTowards(transform.forward, targetDirection, singleStep, 0.0f);
            transform.rotation = Quaternion.LookRotation(newDirection);
        }
    }
}

Animator配置调整

打开Animator窗口,选中当前状态指向Walk状态的过渡连线,修改以下配置:

  • 取消勾选Has Exit Time,移除必须等当前动画播放到指定节点才能过渡的限制
  • 将Transition Duration(s)调整为0.1~0.2秒的合理值,避免两个动画硬切产生突兀感
  • 确认过渡条件列表中已正确绑定Walk Trigger参数,无其他多余条件限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:48:46