做过很多相机的旋转和缩放 感觉这个挺平滑的
public class CameraMove : MonoBehaviour
{
public float ratio = 2;//放大缩小速率
public float min_distance = 5; //相机距物体最小距离
public float max_distance = 60;//相机距物体最大距离
private float view_distance; //相机的Field of View 大小
Transform CenObj;//围绕的物体
//滑动结束时的瞬时速度
Vector3 Speed = Vector3.zero;
//每帧偏差
Vector3 offSet = Vector3.zero;
//速率衰减值
public float decelerationRate = 0.2f;
private Vector3 Rotion_Transform;
private Camera cameraObj;
private float lastTime;
private void Awake()
{
cameraObj = GetComponent<Camera>();
}
//设置围绕的物体
public void SetCenObj(Transform center)
{
CenObj = center;
Rotion_Transform = CenObj.position;
}
void Update()
{
if (!MouseControl.Instance.isEnter)
{
Ctrl_Cam_Move();
Cam_Ctrl_Rotation();
}
}
//镜头的远离和接近
public void Ctrl_Cam_Move()
{
//根据fieldOfView设置远近
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
view_distance = cameraObj.fieldOfView;
view_distance += Input.GetAxis("Mouse ScrollWheel") * ratio;
view_distance = Mathf.Clamp(view_distance, min_distance,max_distance);
cameraObj.fieldOfView = view_distance;
}
var mouse_y = Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
if (Input.GetMouseButton(0) && mouse_y!=0)
{
if (mouse_y != 0)
{
view_distance = cameraObj.fieldOfView;
view_distance += mouse_y * ratio;
view_distance = Mathf.Clamp(view_distance, min_distance, max_distance);
cameraObj.fieldOfView = view_distance;
}
}
}
//摄像机的旋转
public void Cam_Ctrl_Rotation()
{
var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
if (Input.GetMouseButton(0) && mouse_x != 0)
{
offSet.x = mouse_x;
//瞬时速度
Speed = offSet / (Time.deltaTime * 10);
}
else
{
Speed *= Mathf.Pow(decelerationRate, Time.deltaTime);
if (Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
{
Speed = Vector3.zero;
}
}
if (Vector3.Magnitude(Speed) == 0)
{
return;
}
transform.RotateAround(Rotion_Transform, Vector3.up, Speed.x * Time.deltaTime * 2.0f);
}
}
//第一人称视角旋转
public void Cam_Ctrl_Rotation()
{
//var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
//var mouse_y = Input.GetAxis("Mouse Y");//获取鼠标X轴移动
if (Input.GetMouseButton(0))
{
mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
mouse_y = Input.GetAxis("Mouse Y");//获取鼠标X轴移动
offSet.x = mouse_x;
offSet.y = mouse_y;
//瞬时速度
Speed = offSet / (Time.deltaTime * speed);
}
else
{
Speed *= Mathf.Pow(decelerationRate, Time.deltaTime);
if (Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
{
Speed = Vector3.zero;
}
}
Move(Speed);
}
public void Move(Vector3 speed)
{
if (Vector3.Magnitude(speed) == 0)
{
return;
}
speed.z = 0;
float rotatedAngle = transform.eulerAngles.x + speed.y * Time.deltaTime * 2.0f;
rotatedAngle = CheckAngle(rotatedAngle);
//限制上下看到的角度
if(rotatedAngle < -30)
{
transform.localEulerAngles = new Vector3(-30, transform.localEulerAngles.y, 0);
}
else if (CheckAngle(rotatedAngle) > 45)
{
transform.localEulerAngles = new Vector3(45, transform.localEulerAngles.y, 0);
}
else
{
transform.RotateAround(transform.position, transform.right, speed.y * Time.deltaTime * 2.0f);
}
transform.RotateAround(transform.localPosition, Vector3.up, speed.x * Time.deltaTime * 2.0f);
}
public float CheckAngle(float value)
{
float angle = value - 180;
if (angle > 0)
return angle - 180;
return angle + 180;
}