From ff1e4698f877ead17ee723ff465f26fad58cd0a0 Mon Sep 17 00:00:00 2001
From: SmallFox <2806143047@qq.com>
Date: Sun, 31 May 2026 17:42:01 +0800
Subject: 合并最新分支,重构Roll,增加了Step_Back,有点手感问题后面调
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Assets/Scripts/PlayerLocomotion.cs | 112 ++++++++++++++++++++++---------------
1 file changed, 68 insertions(+), 44 deletions(-)
(limited to 'Assets/Scripts/PlayerLocomotion.cs')
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
+ ///
+ /// 处理角色旋转逻辑。
+ /// 根据输入方向和摄像机朝向,平滑旋转角色面向移动方向。
+ ///
+ /// 帧时间(秒)
+ 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
-
- ///
- /// 处理角色旋转逻辑。
- /// 根据输入方向和摄像机朝向,平滑旋转角色面向移动方向。
- ///
- /// 帧时间(秒)
- 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
}
--
cgit