87 lines
2.2 KiB
C#
87 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
public class CamMouseOrbit : MonoBehaviour
|
|
{
|
|
private float x = 0.0f;
|
|
private float y = 0.0f;
|
|
private float dist;
|
|
private bool locked;
|
|
|
|
public Transform target;
|
|
public float distance = 10.0f;
|
|
public float xSpeed = 5.0f;
|
|
public float ySpeed = 2.5f;
|
|
public float distSpeed = 10.0f;
|
|
public float yMinLimit = -20.0f;
|
|
public float yMaxLimit = 80.0f;
|
|
public float distMinLimit = 5.0f;
|
|
public float distMaxLimit = 50.0f;
|
|
public float orbitDamping = 4.0f;
|
|
public float distDamping = 4.0f;
|
|
|
|
private void Awake()
|
|
{
|
|
ChangeCursor();
|
|
dist = distance;
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
Vector3 angles = transform.eulerAngles;
|
|
x = angles.y;
|
|
y = angles.x;
|
|
|
|
if (GetComponent<Rigidbody>())
|
|
{
|
|
GetComponent<Rigidbody>().freezeRotation = true;
|
|
}
|
|
}
|
|
|
|
private void ChangeCursor()
|
|
{
|
|
Cursor.lockState = locked ? CursorLockMode.None : CursorLockMode.Locked;
|
|
Cursor.visible = locked;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if(Input.GetMouseButtonDown(1))
|
|
{
|
|
locked = !locked;
|
|
ChangeCursor();
|
|
}
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
if (!target || locked) return;
|
|
|
|
x += Input.GetAxis("Mouse X") * xSpeed;
|
|
y -= Input.GetAxis("Mouse Y") * ySpeed;
|
|
distance -= Input.GetAxis("Mouse ScrollWheel") * distSpeed;
|
|
|
|
y = ClampAngle(y, yMinLimit, yMaxLimit);
|
|
distance = Mathf.Clamp(distance, distMinLimit, distMaxLimit);
|
|
dist = Mathf.Lerp(dist, distance, distDamping * Time.deltaTime);
|
|
|
|
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(y, x, 0), Time.deltaTime * orbitDamping);
|
|
transform.position = transform.rotation * new Vector3(0.0f, 0.0f, -dist) + target.position;
|
|
}
|
|
|
|
private float ClampAngle(float a, float min, float max)
|
|
{
|
|
while (max < min) max += 360.0f;
|
|
while (a > max) a -= 360.0f;
|
|
while (a < min) a += 360.0f;
|
|
|
|
if (a > max)
|
|
{
|
|
if (a - (max + min) * 0.5 < 180.0)
|
|
return max;
|
|
else
|
|
return min;
|
|
}
|
|
else
|
|
return a;
|
|
}
|
|
} |