【发布时间】:2021-05-13 05:02:56
【问题描述】:
所以我有这个设置:
-
相机旋转被限制在 Y 轴上。只能左右旋转-75到75度,旋转由鼠标控制。
-
玩家身体可以围绕它的 Y 轴旋转,并且它的 Y 旋转值被添加到 -75 和 75 度的相机夹子中,以保持玩家身体前方的相机旋转空间。示例:如果玩家在 Y 轴上旋转 90 度,则钳位值将变为 15 度和 165 度。
当玩家身体在 Y 轴上超过 359 度时会出现问题,因为相机钳位值会从 284 和 434 跳回到 -75 和 75,这会导致相机移动时出现明显的卡顿。我怎样才能消除这个快照?
Video example - Note the camera clamps (Limit L, Limit R) in the MouseLook script after 00:40
*handleBodyRotation 方法只是将玩家的身体旋转到面对作为相机子对象的红色立方体。
public class MouseLook : MonoBehaviour
{
public Transform CameraBox;
public Transform lookAtPivot;
public Transform lookAtObject;
public Transform playerBody;
public float sensitivity;
public float bodyRotSpeed;
float xRotation = 0f;
float yRotation = 0f;
public float limitL;
public float limitR;
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
void handleCamRotation()
{
float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -45, 35);
yRotation += mouseX;
yRotation = Mathf.Clamp(yRotation, limitL, limitR);
//Handle and clamp Camera, lookAtPivot, and lookAtObject rotation
transform.rotation = Quaternion.Euler(xRotation, yRotation, 0f);
//Handle left limit and right limit
limitL = -75 + playerBody.transform.rotation.eulerAngles.y;
limitR = 75 + playerBody.transform.rotation.eulerAngles.y;
}
void handleBodyRotation()
{
Quaternion targetRotation = Quaternion.Euler(playerBody.transform.rotation.eulerAngles.x, lookAtObject.transform.rotation.eulerAngles.y, playerBody.transform.rotation.eulerAngles.z);
playerBody.transform.localRotation = Quaternion.Lerp(playerBody.transform.localRotation, targetRotation, bodyRotSpeed * Time.deltaTime);
}
void Update()
{
//Camera Rotation (clamped)
handleCamRotation();
//Body Rotation
if (Input.GetKey(KeyCode.W))
{
handleBodyRotation();
}
}
}
【问题讨论】:
标签: c# unity3d camera rotation euler-angles