创建4个空物体,将相机放到最子层
1:y控制左右旋转
2:z控制上下旋转
3:照着主角
4:z修改相机缩放
主相机用来做震动之类的其他功能
下边的脚本添加到 1 上.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraCtrl : MonoBehaviour { [SerializeField] Transform CameraUpAndDown; [SerializeField] Transform CameraZoonContainer; [SerializeField] Transform CameraContainer; public static CameraCtrl _instance; void Awake() { _instance = this; Init(); } void Init() { CameraUpAndDown.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(CameraUpAndDown.localEulerAngles.z, 35, 80)); } /// <summary> /// 设置摄像机旋转 /// </summary> /// <param name="type">0=左 1=右</param> public void SetCameraRotate(int type) { transform.Rotate(0, 100 * Time.deltaTime * (type == 0 ? -1 : 1), 0); } /// <summary> /// 设置摄像机上下 /// </summary> /// <param name="type">0=上,1=下</param> public void SetCameraUpAndDown(int type) { CameraUpAndDown.Rotate(0, 0, Time.deltaTime * 30 * (type == 0 ? -1 : 1)); CameraUpAndDown.localEulerAngles = new Vector3(0, 0, Mathf.Clamp(CameraUpAndDown.localEulerAngles.z, 1, 40)); } /// <summary> /// 设置摄像机缩放 /// </summary> /// <param name="type">0=拉近,1=拉远</param> public void SetCamerZoon(int type) { CameraContainer.Translate(new Vector3(0,0,Time.deltaTime * 5*(type ==0?-1:1))); CameraContainer.transform.localPosition = new Vector3(0, 0, Mathf.Clamp(CameraContainer.transform.localPosition.z, -5, 0)); } public void AutoLookAt(Vector3 pos) { CameraZoonContainer.LookAt(pos); } }
这个方法可以添加到主角上,在Update中调用
void AutoFllow() { CameraCtrl._instance.transform.position = transform.position; CameraCtrl._instance.AutoLookAt(transform.position); if (Input.GetKey(KeyCode.A)) { CameraCtrl._instance.SetCameraRotate(0); } else if (Input.GetKey(KeyCode.D)) { CameraCtrl._instance.SetCameraRotate(1); } else if (Input.GetKey(KeyCode.W)) { CameraCtrl._instance.SetCameraUpAndDown(0); } else if (Input.GetKey(KeyCode.S)) { CameraCtrl._instance.SetCameraUpAndDown(1); } else if (Input.GetKey(KeyCode.Q)) { CameraCtrl._instance.SetCamerZoon(0); } else if (Input.GetKey(KeyCode.E)) { CameraCtrl._instance.SetCamerZoon(1); } }