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); }
问题分析
动画参数值设置逻辑错误
Starter Asset的Third Person Controller中,_animIDSpeed对应角色的实际移动速度值,而非固定的6f。当前代码无论移动还是停止都强制设为6f,导致动画状态机无法区分移动与 idle 状态。停止状态参数完全错误
到达目标位置时,代码错误地将_animIDSpeed设为6f,这会让动画一直处于移动状态,完全无法触发 idle 动画。参数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
相关产品推荐
相关产品推荐

