public class CameraController : MonoBehaviour
{
[SerializeField]
private Transform target;
//位置偏移
private Vector3 offsetPosition;
//是否开始滑动拉近和拉远视角
private bool isAdjustDistance= false;
//是否开始滑动旋转视角
private bool isRotating = false;
//相机与目标的距离
private float distance = 0;
[Header("鼠标滚轮调节速率")]
public float scrollSpeed = 10;
[Header("鼠标左键调节旋转速率")]
public float rotateSpeed = 2;
[Header("自动旋转速率")]
public float autoRotateSpeed = 10;
private void Start()
{
transform.LookAt(target.position);
offsetPosition = transform.position - target.position;
}
private void Update()
{
//处理视野的旋转
RotateView();
//处理视野的拉近和拉远效果
ScrollView();
}
/// <summary>
/// 视野的拉近和拉远
/// </summary>
private void ScrollView()
{
//向后滑动返回负值 (拉近视野),向前滑动返回正值(拉远视野)
//print(Input.GetAxis("Mouse ScrollWheel"));
//得到距离
distance = offsetPosition.magnitude;
if (Input.GetMouseButtonDown(1))
{
isAdjustDistance = true;
}
if (Input.GetMouseButtonUp(1))
{
isAdjustDistance = false;
}
if(isAdjustDistance)
{
distance += Input.GetAxis("Mouse Y") * scrollSpeed*Time.deltaTime; //通过鼠标右键在垂直方向的滑动调节
}
distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed; //通过鼠标滚轮调节
//限制拉近和拉远的距离
distance = Mathf.Clamp(distance, 2, 18);
offsetPosition = offsetPosition.normalized * distance;
//相机的跟随
transform.position = offsetPosition + target.position;
}
/// <summary>
/// 视野的旋转
/// </summary>
private void RotateView()
{
//得到鼠标在水平方向的滑动
//Input.GetAxis("Mouse X");
//得到鼠标在垂直方向的滑动
//Input.GetAxis("Mouse Y");
if (Input.GetMouseButtonDown(0))
{
isRotating = true;
}
if (Input.GetMouseButtonUp(0))
{
isRotating = false;
}
if (isRotating)
{
transform.RotateAround(target.position, Vector3.up, rotateSpeed * Input.GetAxis("Mouse X"));
//保存原来的位置
Vector3 originalPos = transform.position;
//保存原来的旋转(四元数)
Quaternion originalRotation = transform.rotation;
//旋转影响的属性有两个:一个是position 一个是rotation
transform.RotateAround(target.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
float x = transform.eulerAngles.x;
if (x < 10 || x > 80)
{
//当超出范围之后,我们将属性归位原来的,就是让旋转无效
transform.position = originalPos;
transform.rotation = originalRotation;
}
}
offsetPosition = transform.position - target.position;
}
/// <summary>
/// 自动旋转
/// </summary>
/// <param name="isAuto"></param>
private void AutoRotateAround(bool isAuto)
{
if(isAuto)
{
transform.RotateAround(target.position, Vector3.up, -autoRotateSpeed * Time.deltaTime);
}
}
}