摄像机作为子物体,脚本悬挂在父物体上
public Transform target;//旋转目标
public float distance = 3f;//摄像机和目标之间的距离
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 = 0.5f;//摄像机最近
private float zoomSpeed = 0.4f;//摄像机的前进速度(放大)
//平移摄像机物体
private GameObject moveObj;
// Use this for initialization
void Start()
{
//开始的时候获得角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
//摄像机作为子物体
moveObj = transform.GetChild(0).gameObject;
}
// Update is called once per frame
void Update()
{
if (target != null && Input.GetMouseButton(1))
{
//获得鼠标右键拖拽
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);
//射线机的旋转(有万向锁问题)
mY = ClampAngle(mY, -80, 80);
Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
Vector3 mPosition = mRotation * new Vector3(0, 0, -distance) + target.position;
//不平滑移动
transform.rotation = mRotation;
transform.position = mPosition;
if (Input.GetMouseButton(2))
{
//横向平移
moveObj.transform.Translate(Vector3.right * Time.deltaTime * -Input.GetAxis("Mouse X"));
//纵向平移,若相机垂直地面则向前平移
moveObj.transform.Translate(Vector3.up * Time.deltaTime * -Input.GetAxis("Mouse Y"));
//横向平移
moveObj.transform.Translate(Vector3.right * Time.deltaTime * -Input.GetAxis("Mouse X"));
//纵向平移,若相机垂直地面则向前平移
moveObj.transform.Translate(Vector3.up * Time.deltaTime * -Input.GetAxis("Mouse Y"));
}
}
//限制角度
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);
}