Unity學習-相機的拉伸、跟隨、旋轉


轉載請加上地址便於糾錯 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 }
PlayerFollow.cs

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM