unity 攝像機圍繞物體轉動(有萬向鎖)
public Transform target;//旋轉目標
public float distance = 1.8f;//攝像機和目標之間的距離
private float speedX = 240f;//x軸轉速
private float speedY = 120f;//y軸轉速
private float mX = 0.0f;//攝像機的旋轉角度x
private float mY = 0.0f;//攝像機的旋轉角度y
private float maxDistance = 5f; //攝像機最遠
private float minDistance = 1.2f;//攝像機最近
private float zoomSpeed = 0.2f;//攝像機的前進速度(放大)
public bool isNeedDamping = true;//是否平滑過渡
public float damping = 1f;//平滑過渡速度
// Use this for initialization
void Start()
{
//開始的時候獲得角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
}
// Update is called once per frame
void Update()
{
if (target != null && Input.GetMouseButton(0))
{
//獲得滑鼠右鍵拖拽
mX += Input.GetAxis("Mouse X") * speedX * Time.deltaTime;
mY -= Input.GetAxis("Mouse Y") * speedY * Time.deltaTime;
}
//滑鼠滾輪攝像機的距離
distance -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
//攝像機的距離範圍--限制
distance = Mathf.Clamp(distance, minDistance, maxDistance);
//射線機的旋轉(有萬向鎖問題)
Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
Vector3 mPosition = mRotation * new Vector3(0, 0, -distance) + target.position;
////是否平滑過渡
//if (isNeedDamping)
//{
// //在from和to之間旋轉-插值法
// transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * damping);
// transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * damping);
//}
//else
//{
// transform.rotation = mRotation;
// transform.position = mPosition;
//}
//不平滑移動
transform.rotation = mRotation;
transform.position = mPosition;
}
//限制角度
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);
}