经过自己的努力,终于整理出一版unity 鼠标控制摄像机的文档提供给大家 .
文件1:主文件 FreeView.cs
创建好后与主摄像机进行绑定
using UnityEngine;
using System.Collections;
public class FreeView : MonoBehaviour {
//观察目标
public static Transform Target;
//观察距离
public float Distance = 10;
//旋转速度
private float SpeedX=240;
private float SpeedY=200;
//角度限制
private float MinLimitY = -30;
private float MaxLimitY = 60;
//旋转角度
private float mX = 0.0F;
private float mY = 0.0F;
//鼠标缩放距离最值
private float MaxDistance=50;
private float MinDistance=10;
//鼠标缩放速率
private float ZoomSpeed=5F;
//是否启用差值
public bool isNeedDamping=true;
//速度
public float Damping=10F;
//存储角度的四元数
private Quaternion mRotation;
//定义鼠标按键枚举
private enum MouseButton
{
//鼠标左键
MouseButton_Left=0,
//鼠标右键
MouseButton_Right=1,
//鼠标中键
MouseButton_Midle=2
}
//相机移动速度
//private float MoveSpeed=5.0F;
//屏幕坐标
private Vector3 mScreenPoint;
//坐标偏移
private Vector3 mOffset;
void Start ()
{ Camera.main.fieldOfView = Camera.main.fieldOfView;
//初始化旋转角度
mX=transform.eulerAngles.x;
mY=transform.eulerAngles.y;
}
void LateUpdate ()
{
//鼠标右键旋转
if(Target!=null && Input.GetMouseButton((int)MouseButton.MouseButton_Left))
{
//获取鼠标输入
mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
//范围限制
mY = ClampAngle(mY,MinLimitY,MaxLimitY);
//计算旋转
mRotation = Quaternion.Euler(mY, mX, 0);
//根据是否插值采取不同的角度计算方式
if(isNeedDamping){
transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);
}else{
transform.rotation = mRotation;
}
}
//鼠标中键平移
//鼠标滚轮缩放
Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
//重新计算位置
<span style="white-space: pre;"> </span>//注:Target.position为监视目标的坐标,所以调整监视目标的position就可以调整刚开始时摄像机的位置
<span style="white-space:pre"> </span> Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
//设置相机的位置
if(isNeedDamping){
transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);
}else{
transform.position = transform.position;
}
}
//角度限制
private float ClampAngle (float angle,float min,float max)
{
if (angle < -360) angle += 360;
if (angle > 360) angle -= 360;
return Mathf.Clamp (angle, min, max);
}
}
模型中心文件,创建后绑定此文件
using UnityEngine;
using System.Collections;
public class Model : MonoBehaviour {
// Use this for initialization
void Start () {
FreeView.Target = transform;
}
// Update is called once per frame
void Update () {
}
}
所谓的瑕疵就是,刚开始的时候,摄像机的位置不对,我暂时没有解决的办法,如果说哪位知道怎么解决,请不要吝啬哦!