——直接把相機做爲要跟隨物體的子物體
我在製做小地圖相機的時候通常這樣用其餘的狀況都不推薦ide
——計算偏移量求出相機正確的實時位置this
using UnityEngine; public class CameraController : MonoBehaviour { public Transform targetPos;//跟隨物體的位置 private Vector3 offset;//偏移量 private void Start() { offset = transform.position - targetPos.position; } private void LateUpdate() { transform.position = offset + targetPos.position; } }
——算是方法2的升級版(插值移動)spa
using UnityEngine; public class CameraController : MonoBehaviour { public Transform targetPos;//跟隨物體的位置 private Vector3 offset;//偏移量 public float smooth;//平滑度 private void Start() { offset = transform.position - targetPos.position; } private void LateUpdate() { transform.position = Vector3.Lerp(transform.position, offset + targetPos.position, Time.deltaTime * smooth); } }
——跟隨的物體到達屏幕中心點再進行跟隨
注意視口座標轉換時Z軸也須要轉換,由於是對於相機的操做code
using UnityEngine; public class CameraController : MonoBehaviour { public Transform targetPos;//跟隨物體的位置 private Vector3 velocity;//速度 public float smooth;//平滑度 private void LateUpdate() { Follow(); } //相機跟隨 private void Follow() { Vector3 middlePos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, -Camera.main.transform.position.z)); Vector3 offset = targetPos.position - middlePos; Vector3 des = transform.position + offset; des.x = 0; if (des.y > transform.position.y) { transform.position = Vector3.SmoothDamp(transform.position, des, ref velocity, smooth); } } }
using UnityEngine; public class CameraController : MonoBehaviour { public Transform targetPos;//跟隨物體的位置 private float velocity;//速度 public float smooth;//平滑度 private void LateUpdate() { Follow(); } //跟隨相機 private void Follow() { float offsetY = targetPos.position.y - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, -Camera.main.transform.localPosition.z)).y; float targetY = offsetY + transform.localPosition.y; Vector3 pos = transform.localPosition; if (targetY > pos.y) { pos.y = Mathf.SmoothDamp(pos.y, targetY, ref velocity, smooth); } transform.localPosition = pos; } }
——2D相機跟隨中限制相機的範圍,不超出邊界(與Cineamachine中的2DCamera功能相似)orm
using UnityEngine; public class CameraController : MonoBehaviour { public Transform playerPos;//玩家位置 private Vector3 offset;//偏移量 private void Start() { offset = transform.position - playerPos.position; } private void LateUpdate() { Vector3 targetPos = playerPos.position + offset; transform.position = new Vector3(Mathf.Clamp(targetPos.x, -5.3f, 5.3f), Mathf.Clamp(targetPos.y, -3, 3), targetPos.z); } }
using UnityEngine; public class CameraController : MonoBehaviour { private Transform playerPos;//玩家位置 private Vector3 offset;//偏移量 public int minZoom;//最小縮放 public int maxZoom;//最大縮放 public float followSpeed;//跟隨的速度 public float zoomSpeed;//縮放的速度 public float rotateSpeed;//旋轉的速度 private bool isPress;//是否按下 private void Start() { playerPos = GameObject.FindGameObjectWithTag(Tag.player).transform; offset = this.transform.position - playerPos.position; } private void LateUpdate() { Follow(); Rote(); Zoom(); } //相機跟隨 private void Follow() { this.transform.position = Vector3.Lerp(this.transform.position, playerPos.position + offset, followSpeed * Time.deltaTime); } //相機縮放 private void Zoom() { float distance = offset.magnitude; distance = Mathf.Clamp(distance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed, minZoom, maxZoom); offset = offset.normalized * distance; } //相機旋轉 private void Rote() { if (Input.GetMouseButtonDown(1)) { isPress = true; } if (Input.GetMouseButtonUp(1)) { isPress = false; } if (isPress) { Vector3 oriPos = transform.position; Quaternion oriRot = transform.rotation; transform.RotateAround(playerPos.position, playerPos.up, Input.GetAxis("Mouse X") * rotateSpeed); transform.RotateAround(playerPos.position, transform.right, -Input.GetAxis("Mouse Y") * rotateSpeed); float x = transform.eulerAngles.x; if (x < 10 || x > 70) { transform.position = oriPos; transform.rotation = oriRot; } } offset = this.transform.position - playerPos.position; } }