轉載請加上地址便於糾錯 http://www.cnblogs.com/JeroChan/
學習了siki的黑暗之光,在學習老師的實現代碼之余自己網上還查找了其他的實現方法,為了以后項目方便自己獨立封裝了旋轉、拉伸的方法,使耦合度盡量降低。
定義
private GameObject playerObject;
private Camera cameraObject;
private Vector3 offSetPos; //偏移(相機與目標的差)
public float fieldViewMax = 90f; //拉伸距離最遠距離
public float fieldViewMin = 10f; //拉伸距離最近距離
public float scrollSpeed = 40f; //拉伸速度
public float rotateSpeed = 10f; //旋轉速度
private bool isRotate = false; //旋轉狀態標識符
跟隨及主代碼
使用LateUpdate控制相機,在Update處理完角色邏輯后LateUpdate處理相機邏輯,防止相機跟丟角色。
void Start () {
cameraObject = this.GetComponent<Camera>(); playerObject = GameObject.FindGameObjectWithTag("Player"); offSetPos = this.transform.position - playerObject.transform.position; transform.LookAt(playerObject.transform); } void LateUpdate () { //相機跟隨(使用固定偏移方法) this.transform.position = offSetPos + playerObject.transform.position; //視野拉伸(使用Camera.fieldOfView方法) ScrollOfView(cameraObject,fieldViewMin, fieldViewMax, scrollSpeed); //視野旋轉(使用Transform.RotateAround方法) RotateOfView(cameraObject.transform, playerObject.transform,ref offSetPos,ref isRotate,rotateSpeed); }
相機視野拉伸代碼
滾輪控制相機視野拉伸(掛載相機上) _camera ---->相機 _fieldViewMin ---->最近視野 _fieldViewMax ---->最大視野 _scrollSpeed ---->拉伸速度(默認40)
void ScrollOfView(Camera _camera, float _fieldViewMin, float _fieldViewMax,float _scrollSpeed=40)
{
_camera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * _scrollSpeed; _camera.fieldOfView = Mathf.Clamp(_camera.fieldOfView, _fieldViewMin, _fieldViewMax); }
相機視野旋轉代碼
右鍵拖動旋轉視野(掛載相機上) _cameraTransform ---->相機的transform _targetTransform ---->目標的transform _offSetPos ---->相機與目標的偏移位置(可傳遞) _isRotate ---->旋轉狀態標識符(可專遞) _rotateSpeed ---->旋轉速度(默認為10)
void RotateOfView(Transform _cameraTransform, Transform _targetTransform,ref Vector3 _offSetPos,ref bool _isRotate,float _rotateSpeed=10)
{
//當鼠標右鍵按下切換旋轉狀態,抬起表示結束旋轉狀態
if (Input.GetMouseButtonDown(1)) _isRotate = true; if (Input.GetMouseButtonUp(1)) _isRotate = false; //旋轉狀態 if (_isRotate) { Vector3 originalPosition = _cameraTransform.position; Quaternion originalRotation = _cameraTransform.rotation; _cameraTransform.RotateAround(_targetTransform.position, _targetTransform.up, _rotateSpeed * Input.GetAxis("Mouse X")); _cameraTransform.RotateAround(_targetTransform.position, _cameraTransform.right, -_rotateSpeed * Input.GetAxis("Mouse Y")); //限制上下旋轉角度 if (_cameraTransform.eulerAngles.x > 80 || _cameraTransform.eulerAngles.x < 10) { _cameraTransform.position = originalPosition; _cameraTransform.rotation = originalRotation; } //更新偏移 _offSetPos = _cameraTransform.position - _targetTransform.position; } }
函數寫的相對直觀,就不多做筆記表明了,歡迎大神有更好的方法請指教。
最后附上PlayerFollow.cs源碼

1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class FollowPlayer : MonoBehaviour { 6 7 8 private GameObject playerObject; 9 private Camera cameraObject; 10 private Vector3 offSetPos; //偏移(相機與目標的差) 11 public float fieldViewMax = 90f; //拉伸距離最遠距離 12 public float fieldViewMin = 10f; //拉伸距離最近距離 13 public float scrollSpeed = 40f; //拉伸速度 14 public float rotateSpeed = 10f; //旋轉速度 15 private bool isRotate = false; //旋轉狀態標識符 16 17 18 void Start () { 19 20 cameraObject = this.GetComponent<Camera>(); 21 playerObject = GameObject.FindGameObjectWithTag("Player"); 22 offSetPos = this.transform.position - playerObject.transform.position; 23 transform.LookAt(playerObject.transform); 24 } 25 26 27 void LateUpdate () 28 { 29 //相機跟隨(使用固定偏移方法) 30 this.transform.position = offSetPos + playerObject.transform.position; 31 //視野拉伸(使用Camera.fieldOfView方法) 32 ScrollOfView(cameraObject,fieldViewMin, fieldViewMax, scrollSpeed); 33 //視野旋轉(使用Transform.RotateAround方法) 34 RotateOfView(cameraObject.transform, playerObject.transform,ref offSetPos,ref isRotate,rotateSpeed); 35 } 36 37 38 39 40 41 /// <summary> 42 /// 滾輪控制相機視野拉伸(掛載相機上) 43 /// </summary> 44 /// <param name="_camera">相機</param> 45 /// <param name="_fieldViewMin">最近視野</param> 46 /// <param name="_fieldViewMax">最大視野</param> 47 /// <param name="_scrollSpeed">拉伸速度(默認40)</param> 48 void ScrollOfView(Camera _camera, float _fieldViewMin, float _fieldViewMax,float _scrollSpeed=40) 49 { 50 _camera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * _scrollSpeed; 51 _camera.fieldOfView = Mathf.Clamp(_camera.fieldOfView, _fieldViewMin, _fieldViewMax); 52 } 53 54 55 56 57 /// <summary> 58 /// 右鍵拖動旋轉視野(掛載相機上) 59 /// </summary> 60 /// <param name="_cameraTransform">相機的transform</param> 61 /// <param name="_targetTransform">目標的transform</param> 62 /// <param name="_offSetPos">相機與目標的偏移位置(可傳遞)</param> 63 /// <param name="_isRotate">旋轉狀態標識符(可專遞)</param> 64 /// <param name="_rotateSpeed">旋轉速度(默認為10)</param> 65 void RotateOfView(Transform _cameraTransform, Transform _targetTransform,ref Vector3 _offSetPos,ref bool _isRotate,float _rotateSpeed=10) 66 { 67 //當鼠標右鍵按下切換旋轉狀態,抬起表示結束旋轉狀態 68 if (Input.GetMouseButtonDown(1)) 69 _isRotate = true; 70 if (Input.GetMouseButtonUp(1)) 71 _isRotate = false; 72 //旋轉狀態 73 if (_isRotate) 74 { 75 Vector3 originalPosition = _cameraTransform.position; 76 Quaternion originalRotation = _cameraTransform.rotation; 77 _cameraTransform.RotateAround(_targetTransform.position, _targetTransform.up, _rotateSpeed * Input.GetAxis("Mouse X")); 78 _cameraTransform.RotateAround(_targetTransform.position, _cameraTransform.right, -_rotateSpeed * Input.GetAxis("Mouse Y")); 79 //限制上下旋轉角度 80 if (_cameraTransform.eulerAngles.x > 80 || _cameraTransform.eulerAngles.x < 10) 81 { 82 _cameraTransform.position = originalPosition; 83 _cameraTransform.rotation = originalRotation; 84 } 85 //更新偏移 86 _offSetPos = _cameraTransform.position - _targetTransform.position; 87 } 88 } 89 90 }