借鑑前人代碼,自己加了一些註釋,幫助大家理解
操作方式:
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);
}
}