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 +}