普通跟随:
using System.Collections; using UnityEngine; public class FollowCamera : MonoBehaviour { public Transform player; public Vector3 offset; public void Awake() { //摄像机和要跟踪的对象之间的偏移量 offset = transform.position - player.position; } public void LateUpdate() { transform.position = player.position + offset; } }
如果摄像机在游戏过程中为了看到更多的场景需要拉远摄像机则上面的代买就不适用了可以用下面的代码:
using UnityEngine; /// <summary> /// 跟踪角色的摄像机控制器 /// </summary> public class PlayerCamera : MonoBehaviour { [SerializeField] [Header("设定的摄像机的位置")] private Vector3 cameraInitPosition = new Vector3(0, 21.55f, -29.67f); [SerializeField] [Header("玩家初始化位置")] private Vector3 playerInitCenterPosition = new Vector3(-4, 0, -12); [SerializeField] [Header("每次放大的偏移量")] public float zoomOut = 10; [SerializeField] [Header("摄像机拉远速度")] private float zoomOutSpeed = 0.5f; private Transform player; private bool enableFollow; private Vector3 playeroffset; private Vector3 zoomoutDirection; [HideInInspector] public float baseDistance; public void InitCamera(Transform player) { this.player = player; //由于摄像机拥有旋转角度需要根据旋转角度来确定拉远的方向 zoomoutDirection = Quaternion.Euler(transform.eulerAngles) * Vector3.back; playeroffset = cameraInitPosition - playerInitCenterPosition; transform.position = player.position + playeroffset; baseDistance = Vector3.Distance(transform.position, player.position); enableFollow = true; } public void SetEnableZoomOut() { enableZoomout = true; zoomOutTotal = 0f; } private bool enableZoomout; private float zoomOutTotal; public void LateUpdate() { if (enableZoomout && zoomOutTotal < zoomOut) { zoomOutTotal += zoomOutSpeed; playeroffset += zoomoutDirection * zoomOutSpeed; if (zoomOutTotal >= zoomOut) { enableZoomout = false; zoomOutTotal = 0f; } } if (enableFollow) { transform.position = player.position + playeroffset; } } }