146 lines
5.4 KiB
C#
146 lines
5.4 KiB
C#
using UnityEngine;
|
||
|
||
namespace NBF
|
||
{
|
||
public partial class FPlayer
|
||
{
|
||
#region Move
|
||
|
||
private Quaternion lastRotation;
|
||
|
||
private void UpdateMove()
|
||
{
|
||
UpdateGrounded();
|
||
UpdateWater();
|
||
ProcessMoveStates();
|
||
UpdateLookInput();
|
||
}
|
||
|
||
private void UpdateGrounded()
|
||
{
|
||
Data.IsGrounded = FirstPerson.IsGrounded();
|
||
Data.Speed = FirstPerson.velocity.magnitude;
|
||
|
||
Quaternion rotation = FirstPerson.transform.rotation;
|
||
|
||
// 计算当前帧与上一帧的旋转差异
|
||
Quaternion rotationDelta = rotation * Quaternion.Inverse(lastRotation);
|
||
|
||
// 将四元数转换为角度轴表示
|
||
rotationDelta.ToAngleAxis(out float angle, out Vector3 axis);
|
||
|
||
// 确保角度在0-360范围内
|
||
if (angle > 180f) angle -= 360f;
|
||
|
||
// 获取Y轴旋转分量(归一化处理)
|
||
float yRotation = 0f;
|
||
if (Mathf.Abs(angle) > 0.001f && Mathf.Abs(axis.y) > 0.1f)
|
||
{
|
||
// 计算Y轴方向的旋转角度(考虑旋转轴方向)
|
||
yRotation = angle * Mathf.Sign(axis.y);
|
||
}
|
||
|
||
float maxTurnSpeed = 180f; // 度/秒
|
||
// 转换为角速度并归一化到[-1, 1]
|
||
float angularSpeed = yRotation / Time.deltaTime;
|
||
float turnValue = Mathf.Clamp(angularSpeed / maxTurnSpeed, -1f, 1f);
|
||
|
||
|
||
Data.RotationSpeed = turnValue;
|
||
|
||
lastRotation = rotation;
|
||
}
|
||
|
||
private void UpdateWater()
|
||
{
|
||
// SceneSettings.Instance.Water.w
|
||
}
|
||
|
||
private void ProcessMoveStates()
|
||
{
|
||
// if (CameraView.Value == CameraViewType.TPP)
|
||
// {
|
||
// float num = (IsRunPressed.Value ? MovementSpeed.Value : (MovementSpeed.Value * 0.5f));
|
||
// num = (IsFlyModeEnabled ? (num * (float)FlySpeed) : num);
|
||
// Vector3 zero = Vector3.zero;
|
||
// zero += Vector3.right * MovementDirection.Value.x;
|
||
// zero += Vector3.forward * MovementDirection.Value.y;
|
||
// zero = zero.relativeTo(_CameraTPPTarget, _Character.GetUpVector());
|
||
// _Character.RotateTowards(zero, Time.deltaTime * _RotateTPPSpeed);
|
||
// float value = Vector3.Dot(_Character.GetForwardVector(), zero);
|
||
// Vector3 vector = _Character.GetForwardVector() * Mathf.Clamp01(value) * num;
|
||
// if (checkWaterBound)
|
||
// {
|
||
// SetMovementDirectionWithRaycastCheck(vector);
|
||
// }
|
||
// else
|
||
// {
|
||
// _Character.SetMovementDirection(vector);
|
||
// }
|
||
// }
|
||
// else
|
||
{
|
||
var num2 = Data.Run ? 7 : 5;
|
||
//(IsRunPressed.Value ? MovementSpeed.Value : (MovementSpeed.Value * 0.5f));
|
||
// num2 = (IsFlyModeEnabled ? (num2 * (float)FlySpeed) : num2);
|
||
Vector3 vector2 = FirstPerson.GetRightVector() * Data.MoveInput.x * num2;
|
||
vector2 += FirstPerson.GetForwardVector() * Data.MoveInput.y * num2;
|
||
// if (checkWaterBound)
|
||
// {
|
||
// SetMovementDirectionWithRaycastCheck(vector2);
|
||
// }
|
||
// else
|
||
{
|
||
FirstPerson.SetMovementDirection(vector2);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Look
|
||
|
||
public float MouseSensitivity = 0.1f;
|
||
[Space(15f)] public bool invertLook = true;
|
||
|
||
public float minPitch = -60f;
|
||
|
||
public float maxPitch = 60f;
|
||
|
||
private void UpdateLookInput()
|
||
{
|
||
// TPPLookTarget.position = base.transform.position;
|
||
// if (CameraView.Value == CameraViewType.TPP)
|
||
// {
|
||
// lookXRot -= MouseInput.Value.y;
|
||
// lookXRot = Mathf.Clamp(lookXRot, -25f, 55f);
|
||
// lookYRot += MouseInput.Value.x;
|
||
// lookYRot = Mathf.Repeat(lookYRot, 360f);
|
||
// TPPLookTarget.localEulerAngles = new Vector3(lookXRot, lookYRot, 0f);
|
||
// }
|
||
// else if (CameraView.Value == CameraViewType.FPP)
|
||
{
|
||
// if (_IsInVehicle && PlayerState.Value == State.vehicle)
|
||
// {
|
||
// lookXRot -= MouseInput.Value.y;
|
||
// lookXRot = Mathf.Clamp(lookXRot, VehicleLookXMinMax.x, VehicleLookXMinMax.y);
|
||
// lookYRot += MouseInput.Value.x;
|
||
// lookYRot = Mathf.Clamp(lookYRot, VehicleLookYMinMax.x, VehicleLookYMinMax.y);
|
||
// VehicleLookTargetParent.localEulerAngles = new Vector3(lookXRot, lookYRot, 0f);
|
||
// _character.CameraPitch = 0f;
|
||
// }
|
||
// else
|
||
{
|
||
Vector2 value = InputManager.GetLookInput();
|
||
FirstPerson.AddControlYawInput(value.x * (float)MouseSensitivity);
|
||
FirstPerson.AddControlPitchInput((invertLook ? (0f - value.y) : value.y) * (float)MouseSensitivity,
|
||
minPitch, maxPitch);
|
||
// lookXRot = base.transform.eulerAngles.x;
|
||
// lookYRot = base.transform.eulerAngles.y;
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
} |