学习自罗培羽的《Unity3D 网络游戏实战》
[RequireComponent(typeof(Camera))]
public class ThirdPersonCamera : MonoBehaviour {
public float distance = 5;
public Vector2 distaceRange=new Vector2(0,8);
public float angleXY = 60;
public Vector2 angleXYRange = new Vector2(0, 90);
public float angleXZ = 90;
public float zoomSpeed = 1;
public float rotSpeed = 10;
public float rollSpeed = 10;
private Transform target;
private void LateUpdate() {
if (target == null)
return;
// 算出相机的位置,并看向目标
float y = Mathf.Sin(angleXY *Mathf.Deg2Rad) * distance;
float mapLine = Mathf.Cos(angleXY * Mathf.Deg2Rad) * distance;
float x = Mathf.Cos(angleXZ * Mathf.Deg2Rad) * mapLine;
float z = Mathf.Sin(angleXZ * Mathf.Deg2Rad) * mapLine;
transform.position = target.position+ new Vector3(x, y, z);
transform.LookAt(target);
//缩放、旋转
Zoom();
if (Input.GetMouseButton(2)) {
Rot();
Roll();
}
}
public void SetTarget(Transform target) {
Transform cameraPos = target.Find("CameraPoint");
this.target = cameraPos == null ? target : cameraPos;
}
private void Zoom() {
float mouseWheel = Input.GetAxis("Mouse ScrollWheel");
if (mouseWheel == 0)
return;
distance = Mathf.Clamp(distance-zoomSpeed*mouseWheel, distaceRange.x, distaceRange.y);
}
private void Rot() {
float mouseX = Input.GetAxis("Mouse X");
if (mouseX == 0)
return;
angleXZ -= rotSpeed * mouseX;
}
private void Roll() {
float mouseY = Input.GetAxis("Mouse Y");
if (mouseY == 0)
return;
angleXY = Mathf.Clamp(angleXY - rollSpeed * mouseY, angleXYRange.x, angleXYRange.y);
}
}