You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.9 KiB
C#

using UnityEngine;
public class FreeCamera : MonoBehaviour {
public bool enableInputCapture = true;
public bool holdRightMouseCapture = false;
public float lookSpeed = 5f;
public float moveSpeed = 5f;
public float sprintSpeed = 50f;
bool m_inputCaptured;
float m_yaw;
float m_pitch;
void Awake() {
enabled = enableInputCapture;
}
void OnValidate() {
if(Application.isPlaying)
enabled = enableInputCapture;
}
void CaptureInput() {
m_inputCaptured = true;
m_yaw = transform.eulerAngles.y;
m_pitch = transform.eulerAngles.x;
}
void ReleaseInput() {
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
m_inputCaptured = false;
}
void OnApplicationFocus(bool focus) {
if(m_inputCaptured && !focus)
ReleaseInput();
}
void Update() {
if(!m_inputCaptured) {
if(!holdRightMouseCapture && Input.GetMouseButtonDown(0))
CaptureInput();
else if(holdRightMouseCapture && Input.GetMouseButtonDown(1))
CaptureInput();
}
if(!m_inputCaptured)
return;
if(m_inputCaptured) {
if(!holdRightMouseCapture && Input.GetKeyDown(KeyCode.Escape))
ReleaseInput();
else if(holdRightMouseCapture && Input.GetMouseButtonUp(1))
ReleaseInput();
}
var rotStrafe = Input.GetAxis("Mouse X");
var rotFwd = Input.GetAxis("Mouse Y");
m_yaw = (m_yaw + lookSpeed * rotStrafe) % 360f;
m_pitch = (m_pitch - lookSpeed * rotFwd) % 360f;
transform.rotation = Quaternion.AngleAxis(m_yaw, Vector3.up) * Quaternion.AngleAxis(m_pitch, Vector3.right);
var speed = Time.deltaTime * (Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : moveSpeed);
var forward = speed * Input.GetAxis("Vertical");
var right = speed * Input.GetAxis("Horizontal");
var up = speed * ((Input.GetKey(KeyCode.E) ? 1f : 0f) - (Input.GetKey(KeyCode.Q) ? 1f : 0f));
transform.position += transform.forward * forward + transform.right * right + Vector3.up * up;
}
}