74 lines
2.0 KiB
C#
74 lines
2.0 KiB
C#
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
|
|
namespace Agame
|
|
{
|
|
public class MouseLook : MonoBehaviour
|
|
{
|
|
[Header("Sensitivity")]
|
|
[Tooltip("Degrees of rotation per pixel of mouse movement.")]
|
|
public float mouseSensitivity = 0.12f;
|
|
|
|
[Header("Vertical Clamp")]
|
|
public float minLookAngle = -80f;
|
|
public float maxLookAngle = 80f;
|
|
|
|
[Header("References")]
|
|
public Transform characterBody;
|
|
|
|
private float xRotation = 0f;
|
|
|
|
private void Start()
|
|
{
|
|
LockCursor(true);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
var kb = Keyboard.current;
|
|
var mouse = Mouse.current;
|
|
if (mouse == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Esc releases the cursor, left click grabs it again (editor-friendly)
|
|
if (kb != null && kb.escapeKey.wasPressedThisFrame)
|
|
{
|
|
LockCursor(false);
|
|
}
|
|
if (mouse.leftButton.wasPressedThisFrame && Cursor.lockState != CursorLockMode.Locked)
|
|
{
|
|
LockCursor(true);
|
|
}
|
|
|
|
if (Cursor.lockState != CursorLockMode.Locked)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Mouse delta is in pixels for the new Input System
|
|
Vector2 delta = mouse.delta.ReadValue();
|
|
float mouseX = delta.x * mouseSensitivity;
|
|
float mouseY = delta.y * mouseSensitivity;
|
|
|
|
// Yaw the body left/right
|
|
if (characterBody != null)
|
|
{
|
|
characterBody.Rotate(Vector3.up * mouseX);
|
|
}
|
|
|
|
// Pitch the camera up/down
|
|
xRotation -= mouseY;
|
|
xRotation = Mathf.Clamp(xRotation, minLookAngle, maxLookAngle);
|
|
transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
|
|
}
|
|
|
|
private void LockCursor(bool locked)
|
|
{
|
|
Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None;
|
|
Cursor.visible = !locked;
|
|
}
|
|
}
|
|
}
|