自由視角攝像機,實現旋轉,縮放

借鑑前人代碼,自己加了一些註釋,幫助大家理解

操作方式:
1.新建一個腳本:CameraControl.cs
2.把腳本綁定到攝像機上
代碼如下:(註釋很詳細)

using UnityEngine;
using System.Collections;

public class CameraControl : MonoBehaviour
{
	//觀察目標
	public Transform Target;

	//觀察距離
	public float Distance = 5F;

	//旋轉速度
	private float SpeedX = 240;
	private float SpeedY = 120;

	//角度限制
	private float MinLimitY = -20;
	private float MaxLimitY = 80;

	//旋轉角度
	private float mX = 0.0F;
	private float mY = 0.0F;

	//鼠標縮放距離最值
	private float MaxDistance = 10;
	private float MinDistance = 1.5F;
	//鼠標縮放速率
	private float ZoomSpeed = 2F;

	//是否啓用差值
	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 ()
	{  
		//初始化旋轉角度  
		mX = transform.eulerAngles.x;  
		mY = transform.eulerAngles.y;  
	}

	void LateUpdate ()
	{  
		//鼠標右鍵旋轉  
		if (Target != null && Input.GetMouseButton ((int)MouseButton.MouseButton_Right)) {  
			//獲取鼠標輸入  
			mX += Input.GetAxis ("Mouse X") * SpeedX * 0.02F;  
			mY -= Input.GetAxis ("Mouse Y") * SpeedY * 0.02F;  
			//範圍限制
			mY = ClampAngle (mY, MinLimitY, MaxLimitY);  
			//計算旋轉(按照X,Y,Z軸進行旋轉,分別旋轉 mX,mY,0度)
			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);  

		//重新計算攝像機的位置 (Vector3 (0.0F, 0.0F, -8)爲方向向量) 叉乘代表旋轉後的相對座標
		/**
		 * detail:
		 * Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0)); --代表根據Y軸旋轉90度
		 * vec = new Vector3(0, 1, 0);
		 * vec2 = quaternion * vec;  --quaternion 左乘 vec, 返回 向量 vec 旋轉 quaternion 後的向量
		 * 
		 */
		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 = mPosition;  
		}  

	}


	//角度限制
	private float  ClampAngle (float angle, float min, float max)
	{  
		if (angle < -360)
			angle += 360;  
		if (angle > 360)
			angle -= 360;  
		/**
		 * Clamp 作用:範圍控制
		 * 如果angle<min ->angle=min   如果angle>max angle=max 如果 min<=angle<=max  angle = angle
		 */
		return Mathf.Clamp (angle, min, max);  
	}
}

有什麼問題歡迎大家來交流
End 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章