![]()
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 }