下面的代码对标的是Google Earth的鼠标鼠标操作。
为模拟操作,欢迎指正!
using UnityEngine;
using System.Collections;
public class MouseControllerCmaer : MonoBehaviour
{
[Tooltip("观察的对象")]
public GameObject target;
[Tooltip("X轴的移动速率")]
public float xSpeed;
[Tooltip("Y轴的移动速率")]
public float ySpeed;
[Tooltip("Y轴限制最小值")]
public float yMinLimit;
[Tooltip("Y轴限制最大值")]
public float yMaxLimit;
[Tooltip("滚轮速率")]
public float scrollSpeed;
[Tooltip("移动速率")]
public float moveSpeed;
[Tooltip("最小距离限制")]
public float zoomMin;
[Tooltip("最大距离限制")]
public float zoomMax;
[Tooltip("是否带插值")]
public bool isDamping;
[Tooltip("插值系数")]
public float damping;
/// <summary>
/// 参数,距离
/// </summary>
private float distance;
/// <summary>
/// 用于计算的参数
/// </summary>
private float distanceLerp;
/// <summary>
/// 位置
/// </summary>
private Vector3 position;
/// <summary>
/// bool值,鼠标按下事件为true,否则false
/// </summary>
private bool isActivated;
/// <summary>
/// 参数
/// </summary>
private float x;
/// <summary>
/// 参数
/// </summary>
private float y;
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
CalDistance();
}
void LateUpdate()
{
ScrollMouse();
RotateCamera();
RotateAroundPointer();
ScrollMouseMove();
}
/// <summary>
/// 右键控制移动
/// </summary>
void ScrollMouseMove()
{
distanceLerp = Mathf.Lerp(distanceLerp, distance, Time.deltaTime * 5);
if (Input.GetMouseButtonDown(1))
{
y = Input.GetAxis("Mouse Y") * ySpeed;
}
if (Input.GetMouseButton(1))
{
distance = Vector3.Distance(transform.position, target.transform.position);
float v = Input.GetAxis("Mouse Y") * ySpeed;
distance = ScrollLimit(distance - (y - v) * moveSpeed, zoomMin, zoomMax);
}
}
/// <summary>
/// 中键按下控制旋转
/// </summary>
void RotateAroundPointer()
{
if (Input.GetMouseButtonDown(2))
{
isActivated = true;
}
if (Input.GetMouseButtonUp(2))
{
isActivated = false;
}
if (target && isActivated)
{
y -= Input.GetAxis("Mouse Y") * ySpeed;
x += Input.GetAxis("Mouse X") * xSpeed;
y = ClampAngle(y, yMinLimit, yMaxLimit);
}
}
/// <summary>
/// 控制相机旋转
/// </summary>
void RotateCamera()
{
if (Input.GetMouseButtonDown(0))
{
isActivated = true;
}
if (Input.GetMouseButtonUp(0))
{
isActivated = false;
}
if (target && isActivated)
{
y -= Input.GetAxis("Mouse Y") * ySpeed;
x += Input.GetAxis("Mouse X") * xSpeed;
}
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
if (isDamping)
{
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
}
else
{
transform.rotation = rotation;
transform.position = position;
}
}
/// <summary>
/// 数据的初始化
/// </summary>
void CalDistance()
{
distance = zoomMax;
distanceLerp = distance;
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
transform.rotation = rotation;
transform.position = position;
}
/// <summary>
/// 滚轮控制移动
/// </summary>
void ScrollMouse()
{
distanceLerp = Mathf.Lerp(distanceLerp, distance, Time.deltaTime * 5);
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
distance = Vector3.Distance(transform.position, target.transform.position);
distance = ScrollLimit(distance - Input.GetAxis("Mouse ScrollWheel") * scrollSpeed, zoomMin, zoomMax);
}
}
/// <summary>
/// 限制
/// </summary>
/// <param name="dist"></param>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
float ScrollLimit(float dist, float min, float max)
{
if (dist < min)
dist = min;
if (dist > max)
dist = max;
return dist;
}
/// <summary>
/// 限制
/// </summary>
/// <param name="angle"></param>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}
}