角色控制

This commit is contained in:
2025-05-29 21:10:30 +08:00
parent cdcb007d6d
commit 8d3cfe170c
6 changed files with 463 additions and 401 deletions

View File

@@ -1,4 +1,6 @@
using NBC;
using System;
using NBC;
using RootMotion.FinalIK;
using UnityEngine;
namespace NBF
@@ -16,9 +18,20 @@ namespace NBF
private FPlayer _player;
private bool _isRun;
public LookAtIK lookAtIK; // 挂在背部上的 LookAtIK 脚本
public float aimDistance = 1.5f; // 目标点离相机多远
private Transform lookTarget; // 实际目标点
[Header("限制角度(单位:度)")] public float maxUpAngle = 20f; // 相机抬头最多20°
public float maxDownAngle = 40f; // 相机低头最多40°
public LayerMask interactableLayer;
private void Start()
{
firstPersonController = GetComponent<FirstPersonController>();
@@ -41,6 +54,11 @@ namespace NBF
InputManager.OnPlayerCanceled += OnPlayerCanceled;
InputManager.OnPlayerPerformed += OnPlayerPerformed;
lookAtIK = GetComponent<LookAtIK>();
lookTarget = new GameObject("SpineLookTarget").transform;
lookTarget.SetParent(_player.transform);
interactableLayer = LayerMask.GetMask("Interactive");
}
private void OnDestroy()
@@ -87,7 +105,7 @@ namespace NBF
{
firstPersonController.enabled = true;
}
private void Update()
{
var movementAxis = InputManager.GetMovementInput();
@@ -130,8 +148,11 @@ namespace NBF
nextShowSlotIndex = -1;
}
}
UpdatePlayerHandView();
}
private void FixedUpdate()
{
if (_player.MainArm)
@@ -139,5 +160,31 @@ namespace NBF
// _player.MainArm.Shoulder.SetCameraEulerAngleX(BaseCamera.Main.transform.localEulerAngles.x);
}
}
#region
private void UpdatePlayerHandView()
{
var cameraTransform = BaseCamera.Main.transform;
Vector3 cameraForward = cameraTransform.forward;
Vector3 flatForward = Vector3.ProjectOnPlane(cameraForward, Vector3.up).normalized;
// 获取相机 pitch 角度(负值是上看,正值是下看)
float pitchAngle = Vector3.SignedAngle(flatForward, cameraForward, cameraTransform.right);
// 限制 pitch 角度
pitchAngle = Mathf.Clamp(pitchAngle, -maxUpAngle, maxDownAngle);
// 重新构造限制后的目标方向
Quaternion limitedPitch = Quaternion.AngleAxis(pitchAngle, cameraTransform.right);
Vector3 limitedDirection = limitedPitch * flatForward;
// 设置目标点
lookTarget.position = cameraTransform.position + limitedDirection * aimDistance;
lookAtIK.solver.target = lookTarget;
}
#endregion
}
}