角色控制
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user