From c2a9c6d3298c294956935d7dc9c680bf0044ac49 Mon Sep 17 00:00:00 2001 From: BobSong <605277374@qq.com> Date: Wed, 10 Sep 2025 11:26:53 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=8E=A7=E5=88=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Unity/CharacterControllerComponent.cs | 83 +++++++++++++------ 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/Assets/Scripts/Fishing2/Unit/Unity/CharacterControllerComponent.cs b/Assets/Scripts/Fishing2/Unit/Unity/CharacterControllerComponent.cs index b50625eaf..1e97215df 100644 --- a/Assets/Scripts/Fishing2/Unit/Unity/CharacterControllerComponent.cs +++ b/Assets/Scripts/Fishing2/Unit/Unity/CharacterControllerComponent.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using NBC; using NBC.Entitas; using NBC.Entitas.Interface; @@ -20,14 +20,14 @@ namespace NBF.Fishing2 private Vector3 networkPosition; // private Vector3 networkFacingDirection; + // 添加目标位置和旋转用于插值 + private Vector3 targetPosition; + private Quaternion targetRotation; + // 插值平滑参数 public float positionLerpSpeed = 10f; public float rotationLerpSpeed = 10f; - - - [Tooltip("视角旋转敏感度")] public Vector2 sensitivity = new Vector2(0.015f, 0.015f); - public float minPitch = -40.0f; - public float maxPitch = 75.0f; + #region System @@ -60,6 +60,9 @@ namespace NBF.Fishing2 var unitUnityComponent = self.Parent.GetComponent(); self.characterController = unitUnityComponent.GameObject.GetComponent(); self.lastSyncedFacing = self.characterController.transform.forward; + // 初始化目标位置和旋转 + self.targetPosition = self.characterController.transform.position; + self.targetRotation = self.characterController.transform.rotation; var mapUnit = self.Parent as MapUnit; if (mapUnit.IsSelf()) { @@ -79,6 +82,8 @@ namespace NBF.Fishing2 { self.ProcessMoveStates(); self.CheckRotationSync(); + // 插值更新位置和旋转 + self.InterpolatePositionAndRotation(); var mapUnit = self.Parent as MapUnit; mapUnit.Position = self.characterController.transform.position; mapUnit.Rotation = self.characterController.transform.rotation; @@ -170,7 +175,6 @@ namespace NBF.Fishing2 /// /// /// - /// /// /// public void OnServerStartMove(Vector3 startPosition, Vector3 moveDirection, float speed, double timestamp) @@ -192,7 +196,6 @@ namespace NBF.Fishing2 /// 接收服务器移动停止通知 /// /// - /// /// public void OnServerStopMove(Vector3 finalPosition, double timestamp) { @@ -212,7 +215,8 @@ namespace NBF.Fishing2 public void OnServerLook(Vector3 rotation, double timestamp) { - + // 设置目标旋转用于插值 + targetRotation = Quaternion.LookRotation(rotation); } #endregion @@ -250,6 +254,7 @@ namespace NBF.Fishing2 private void StartMovement(MoveState moveState) { networkPosition = moveState.startPosition; + targetPosition = moveState.startPosition; Debug.Log($"开始移动 - 位置: {moveState.startPosition}"); } @@ -257,7 +262,7 @@ namespace NBF.Fishing2 private void StopMovement(MoveState moveState) { networkPosition = moveState.startPosition; - characterController.transform.position = networkPosition; + targetPosition = moveState.startPosition; Debug.Log($"停止移动 - 最终位置: {moveState.startPosition}"); } @@ -268,12 +273,35 @@ namespace NBF.Fishing2 Vector3 movement = movementDirection * currentMoveState.moveSpeed * Time.deltaTime; networkPosition += movement; + targetPosition = networkPosition; characterController.Move(movement); // 如果移动方向不为零,可以自动更新朝向 if (currentMoveState.moveDirection != Vector3.zero) { // networkFacingDirection = currentMoveState.moveDirection; + targetRotation = Quaternion.LookRotation(currentMoveState.moveDirection); + } + } + + // 添加位置和旋转插值方法 + private void InterpolatePositionAndRotation() + { + // 只对非本地玩家进行插值 + var mapUnit = Parent as MapUnit; + if (!mapUnit.IsSelf()) + { + // 插值位置 + characterController.transform.position = Vector3.Lerp( + characterController.transform.position, + targetPosition, + positionLerpSpeed * Time.deltaTime); + + // 插值旋转 + characterController.transform.rotation = Quaternion.Slerp( + characterController.transform.rotation, + targetRotation, + rotationLerpSpeed * Time.deltaTime); } } @@ -285,26 +313,31 @@ namespace NBF.Fishing2 public float minRotationChange = 10f; private Vector3 _rotationInput = Vector3.zero; - private float _cameraPitch; private float rotationSyncTimer; private Vector3 lastSyncedFacing; + [Tooltip("视角旋转敏感度")] public Vector2 sensitivity = new Vector2(0.015f, 0.015f); + private void UpdatePlayerRotation(Vector2 lookValue) { // Look - // Vector2 lookInput = lookValue * sensitivity; - // - // if (lookInput.x != 0.0f) - // { - // _rotationInput.y += lookInput.x; - // } - // - // // Player.CameraRoot.transform.localRotation = Quaternion.Euler(_cameraPitch, 0.0f, 0.0f); - // if (_rotationInput != Vector3.zero) - // { - // characterController.transform.rotation *= Quaternion.Euler(_rotationInput); - // _rotationInput = Vector3.zero; - // } + Vector2 lookInput = lookValue * sensitivity; + + // 处理水平旋转 (Yaw) + if (lookInput.x != 0.0f) + { + _rotationInput.y += lookInput.x; + } + + + + // 应用旋转到角色和相机 + if (_rotationInput != Vector3.zero) + { + characterController.transform.rotation *= Quaternion.Euler(0, _rotationInput.y, 0); + _rotationInput = Vector3.zero; + } + } // 检查朝向同步 @@ -326,4 +359,4 @@ namespace NBF.Fishing2 #endregion } -} \ No newline at end of file +}