unity3d 鼠标控制摄像机

经过自己的努力,终于整理出一版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);
	}
}


文件2:副文件 Model.cs

模型中心文件,创建后绑定此文件 

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 () {
	
	}
}

所谓的瑕疵就是,刚开始的时候,摄像机的位置不对,我暂时没有解决的办法,如果说哪位知道怎么解决,请不要吝啬哦!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值