相机观察器
网上找了许多视角控制的方法,但都不满意,达不到我预期的效果,于是总结一些方法自己写了一个。
仿Unity的Scene里的视角操作模式,实现控制视角旋转,平移,缩放。对其做了一些限制,即限制了X方向上的角度避免翻转过头,可选择设置限制目标物体来限制视平面的拉近拉远距离.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 相机观察器
/// </summary>
public class CameraViewer : MonoBehaviour
{
//距离限制目标物体,可不设置,即不限制视角拉近拉远的最小最大值
[SerializeField]
Transform limitTarget;
[SerializeField]
float
//视角旋转敏感度
rotateFactor = 2,
//视角平移敏感度
translationFactor = 0.1f,
//视角拉近拉远敏感度
zoomFactor = 1,
//限制视平面距离目标最小值
limitMinDistance = 1f,
//限制视平面距离目标最大值
limitMaxDistance = 10f,
//X角度限制
xLimit = 60;
void Update()
{
//按下右键拖拽,视角旋转
if (Input.GetMouseButton(1))
{
var dx = Input.GetAxis("Mouse X") * rotateFactor;
var dy = Input.GetAxis("Mouse Y") * rotateFactor;
if (Mathf.Abs(dx) > 0 || Mathf.Abs(dy) > 0)
{
Vector3 angles = transform.rotation.eulerAngles;
angles.y += dx;
angles.x = Mathf.Repeat(angles.x + 180f, 360f) - 180f;
angles.x -= dy;
angles.x = ClampAngle(angles.x, -xLimit, xLimit);
Quaternion targetRotation = default;
targetRotation.eulerAngles = new Vector3(angles.x, angles.y, 0);
transform.rotation = targetRotation;
}
}
//按下滚轮拖拽,视角平移
else if (Input.GetMouseButton(2))
{
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
var tv = new Vector3(-x, -y) * translationFactor;
transform.Translate(tv);
}
//滚动滚轮,视角拉近拉远
else if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
var sv = Input.GetAxis("Mouse ScrollWheel") * zoomFactor;
var backupPos = transform.position;
transform.Translate(0, 0, sv);
if (limitTarget != null)
{
var d = new Plane(transform.forward, transform.position).GetDistanceToPoint(limitTarget.position);
if ((d > limitMaxDistance && sv < 0) || (d < limitMinDistance && sv > 0))
{
transform.position = backupPos;
}
}
}
}
// 控制角度范围
float ClampAngle(float angle, float min, float max)
{
if (angle < -360f) angle += 360f;
else if (angle > 360f) angle -= 360f;
return Mathf.Clamp(angle, min, max);
}
}
使用方法:
挂载到MainCamera上即可,可选择设置limitTarget参数来限制视平面的拉近拉远距离.