1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class CameraController : MonoBehaviour 6 { 7 8 [SerializeField] 9 private float distance = 5f; //跟随距离 10 [SerializeField] 11 private float speed = 2f; //跟随速率 12 [SerializeField] 13 private float mouseSpeed = 2f; //鼠标移动敏感度 14 [SerializeField] 15 private float mouseScroll = 2f; //鼠标缩放速率 16 17 //跟随最大与最小距离 18 private float distanceMin = 2f; 19 private float distanceMax = 15f; 20 private Transform target; //摄像机跟随的目标 21 private Vector3 targetPos; //目标位置 22 private Vector3 direction = Vector3.zero; //摄像机移动的方向 23 private float mouseX = 0f; //鼠标x轴移动值 24 private float mouseY = 15f; //鼠标y轴移动值 25 private float mouseYMin = -5f; //鼠标y轴移动值最小值 26 private float mouseYMax = 89.5f; //鼠标y轴移动值最大值 27 28 29 private void Awake() 30 { 31 target = GameObject.FindWithTag("Player").transform; 32 direction = target.position - transform.position; 33 } 34 35 private void LateUpdate() 36 { 37 GetInput(); 38 39 CameraRotate(); 40 41 CalculateTargetPos(); 42 43 FollowTarget(); 44 } 45 46 private void CalculateTargetPos() 47 { 48 //文章入口的代码图解 49 targetPos = target.position - direction.normalized * distance; 50 } 51 52 private void FollowTarget() 53 { 54 transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * speed); 55 transform.LookAt(target.position); 56 } 57 58 private void GetInput() 59 { 60 if (Input.GetMouseButton(0)) 61 { 62 Cursor.visible = false; 63 64 mouseX += Input.GetAxis("Mouse X") * mouseSpeed; 65 //摄像机鼠标上下移动与mouseY是相反的,可自己通过观察可得,这里就不明说了 66 mouseY -= Input.GetAxis("Mouse Y") * mouseSpeed; 67 68 mouseY = Mathf.Clamp(mouseY, mouseYMin, mouseYMax); 69 70 } 71 else Cursor.visible = true; 72 73 distance = distance - Input.GetAxis("Mouse ScrollWheel") * mouseScroll; 74 distance = Mathf.Clamp(distance, distanceMin, distanceMax); 75 76 } 77 78 private void CameraRotate() 79 { 80 Quaternion rotation = Quaternion.Euler(mouseY, mouseX, 0); 81 //transform.rotation = rotation; //不围绕目标旋转 82 //Quaternion作用于Vector3的右乘操作(*)返回一个将向量做旋转操作后的向量. 83 //这里算是一个难点,这里意思是将根据鼠标XY轴旋转“加到”Vector3.forward向前向量,所以direction是经过了旋转的向前向量 84 //就好像一条直线绕着一点旋转了一样 85 direction = rotation * Vector3.forward; 86 } 87 88 }