diff options
Diffstat (limited to 'Assets/Scripts/PlayerLocomotion.cs')
| -rw-r--r-- | Assets/Scripts/PlayerLocomotion.cs | 112 |
1 files changed, 68 insertions, 44 deletions
diff --git a/Assets/Scripts/PlayerLocomotion.cs b/Assets/Scripts/PlayerLocomotion.cs index 5203432..5952325 100644 --- a/Assets/Scripts/PlayerLocomotion.cs +++ b/Assets/Scripts/PlayerLocomotion.cs @@ -110,7 +110,9 @@ namespace DS // ============================================================ private void Update() { - UpdateCharacterMovement(); + float delta = Time.deltaTime; // 获取帧时间 + UpdateCharacterMovement(delta); + HandleRollingAndSpringting(delta); } // ============================================================ @@ -121,14 +123,56 @@ namespace DS // 当前未在此处处理逻辑 // 若需要基于物理的移动,可将 rigidbody.velocity 赋值移到这里 } + + // ============================================================ + // 移动与旋转相关方法 + // ============================================================ + #region Movement + /// <summary> + /// 处理角色旋转逻辑。 + /// 根据输入方向和摄像机朝向,平滑旋转角色面向移动方向。 + /// </summary> + /// <param name="delta">帧时间(秒)</param> + private void HandleRotation(float delta) + { + Vector3 targetDir = Vector3.zero; // 目标朝向向量 + // 注意:当前未使用 moveOverride,保留备用 + float moveOverride = _inputHandler.moveAmount; + + // ---------------------------------------------------------- + // 1. 根据输入计算目标朝向 + // ---------------------------------------------------------- + // 目标朝向 = 摄像机正方向 * 垂直输入 + 摄像机右方向 * 水平输入 + targetDir = _cameraObject.forward * _inputHandler.vertical; + targetDir += _cameraObject.right * _inputHandler.horizontal; + + // 归一化并置平 Y 轴 + targetDir.Normalize(); + targetDir.y = 0; + + // 如果没有输入(目标方向为零向量),则保持当前面向不变 + if (targetDir == Vector3.zero) + { + targetDir = myTransform.forward; + } + + // ---------------------------------------------------------- + // 2. 通过 Slerp 平滑旋转至目标方向 + // ---------------------------------------------------------- + float rs = rotationSpeed; // 旋转速度 + Quaternion tr = Quaternion.LookRotation(targetDir); // 目标旋转四元数 + // 使用球形插值(Slerp)实现平滑旋转 + Quaternion targetRotation = Quaternion.Slerp(myTransform.rotation, tr, rs * delta); + + // 应用旋转 + myTransform.rotation = targetRotation; + } // ============================================================ // 角色移动更新(核心逻辑) // ============================================================ - private void UpdateCharacterMovement() + private void UpdateCharacterMovement(float delta) { - float delta = Time.deltaTime; // 获取帧时间 - // 处理输入(读取水平/垂直输入值) _inputHandler.TickInput(delta); @@ -190,51 +234,31 @@ namespace DS } } - // ============================================================ - // 移动与旋转相关方法 - // ============================================================ - #region Movement - - /// <summary> - /// 处理角色旋转逻辑。 - /// 根据输入方向和摄像机朝向,平滑旋转角色面向移动方向。 - /// </summary> - /// <param name="delta">帧时间(秒)</param> - private void HandleRotation(float delta) + private void HandleRollingAndSpringting(float delta) { - Vector3 targetDir = Vector3.zero; // 目标朝向向量 - // 注意:当前未使用 moveOverride,保留备用 - float moveOverride = _inputHandler.moveAmount; - - // ---------------------------------------------------------- - // 1. 根据输入计算目标朝向 - // ---------------------------------------------------------- - // 目标朝向 = 摄像机正方向 * 垂直输入 + 摄像机右方向 * 水平输入 - targetDir = _cameraObject.forward * _inputHandler.vertical; - targetDir += _cameraObject.right * _inputHandler.horizontal; - - // 归一化并置平 Y 轴 - targetDir.Normalize(); - targetDir.y = 0; - - // 如果没有输入(目标方向为零向量),则保持当前面向不变 - if (targetDir == Vector3.zero) + if (animatorHandler.animator.GetBool("isInteracting")) { - targetDir = myTransform.forward; + return; } - // ---------------------------------------------------------- - // 2. 通过 Slerp 平滑旋转至目标方向 - // ---------------------------------------------------------- - float rs = rotationSpeed; // 旋转速度 - Quaternion tr = Quaternion.LookRotation(targetDir); // 目标旋转四元数 - // 使用球形插值(Slerp)实现平滑旋转 - Quaternion targetRotation = Quaternion.Slerp(myTransform.rotation, tr, rs * delta); - - // 应用旋转 - myTransform.rotation = targetRotation; + if (_inputHandler.rollFlag) + { + _moveDirection = _cameraObject.forward * _inputHandler.vertical; + _moveDirection += _cameraObject.right * _inputHandler.horizontal; + + if (_inputHandler.moveAmount > 0) + { + animatorHandler.PlayerTargetAnimation("Roll",true); + _moveDirection.y = 0; + Quaternion rollRotation = Quaternion.LookRotation(_moveDirection); + myTransform.rotation = rollRotation; + } + else + { + animatorHandler.PlayerTargetAnimation("step_back",true); + } + } } - #endregion } |
