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

Unity Starter Asset第三人称控制器动画问题及代码排查请求

Unity第三人称控制器动画触发异常排查

使用Unity Starter Asset的Third Person Controller时,通过鼠标点击实现角色移动功能,角色可正常移动但对应动画无法触发,以下是代码问题排查及修正方案:

原代码片段

鼠标点击移动逻辑

if(Input.GetMouseButtonDown(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit))
    {
        if (hit.collider.CompareTag("Ground"))
        {
            target.transform.position = hit.point;
            targetPosition = hit.point;
            isMoving = true;
        }
    }
}

if (isMoving)
{
    MoveToPosition(targetPosition);
}

移动方法实现

private void MoveToPosition(Vector3 targetPosition)
{
    Vector3 direction = targetPosition - transform.position;
    direction.y = 0f;

    if (direction.magnitude > 0.1f)
    {
        Quaternion toRotation = Quaternion.LookRotation(direction);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, RotationSmoothTime * Time.deltaTime);
    }
    else
    {
        isMoving = false;
        _animator.SetFloat(_animIDSpeed, 6f);
        return;
    }

    _controller.Move(direction.normalized * MoveSpeed * Time.deltaTime);
    _animator.SetFloat(_animIDSpeed, 6f);
}

问题分析

  1. 动画参数值设置逻辑错误
    Starter Asset的Third Person Controller中,_animIDSpeed对应角色的实际移动速度值,而非固定的6f。当前代码无论移动还是停止都强制设为6f,导致动画状态机无法区分移动与 idle 状态。

  2. 停止状态参数完全错误
    到达目标位置时,代码错误地将_animIDSpeed设为6f,这会让动画一直处于移动状态,完全无法触发 idle 动画。

  3. 参数ID初始化缺失(潜在问题)
    若未在Awake/Start方法中执行_animIDSpeed = Animator.StringToHash("Speed");,则参数ID无效,动画无法被正确触发。

修正后的代码

private void MoveToPosition(Vector3 targetPosition)
{
    Vector3 direction = targetPosition - transform.position;
    direction.y = 0f; // 忽略垂直方向

    if (direction.magnitude > 0.1f)
    {
        Quaternion toRotation = Quaternion.LookRotation(direction);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, RotationSmoothTime * Time.deltaTime);
        
        // 传入实际移动速度,触发移动动画
        _animator.SetFloat(_animIDSpeed, MoveSpeed);
    }
    else
    {
        isMoving = false;
        // 设置Speed为0,触发idle动画
        _animator.SetFloat(_animIDSpeed, 0f);
        return;
    }

    _controller.Move(direction.normalized * MoveSpeed * Time.deltaTime);
}

额外检查项

  • 确认角色对象已正确挂载Animator组件,且_animator变量不为null
  • 检查动画状态机:确保存在名为Speed的Float类型参数,且过渡条件为Speed > 0.1(切换到移动动画)和Speed <= 0(切换到idle动画)
  • 确认_controller变量正确引用了CharacterController组件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:38:07