1. 程式人生 > >Unity3D 使用備忘(三) 實現相機自動漫遊開始、暫停、停止及相機角度切換。

Unity3D 使用備忘(三) 實現相機自動漫遊開始、暫停、停止及相機角度切換。

(1)將Main Camera遊戲物體附加給SceneManager的MainSceneManager(Script)元件下的doToweenPath屬性(可通過點選doTweenPath在Scene中選擇Main Camera 或者直接將Main Camera 拖拽到doToweenPath屬性中)。

                                                         

(2)我們先將MainSceneManager.cs指令碼檔案進行完善。

  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4. using UnityEngine.UI;  
  5. using DG.Tweening;  //DOTween的名稱空間  
  6. using System;  
  7. public class MainSceneManager : MonoBehaviour {  
  8.     //初始化按軌跡移動的遊戲物體  
  9.     public DOTweenPath doTweenPath;  
  10.     <spanstyle="background-color:rgb(255,255,0);">//初始化當前相機</span>
  11.     public GameObject currCamera;     
  12.     <spanstyle="background-color:rgb(255,255,0);">//建立開始/暫停自動漫遊、停止自動漫遊及改變介面的按鈕,stopButton表示開始、暫停交替變化;</span>
  13.     public Button stopButton;  
  14.     public Button exitButton;  
  15.     public Button viewButton;  
  16.     <spanstyle="background-color:rgb(255,255,0);">//建立改變介面時相機的位置和旋轉角度</span>
  17.     private Vector3 position
     = new Vector3(-3.37f, 10f,2.9f);  
  18.     private Quaternion qu = Quaternion.Euler(90f, -90f, 0);  
  19.     <spanstyle="background-color:rgb(255,255,0);">//建立是否點選了改變介面的按鈕</span>
  20.     public bool isClickViewButton = false;  
  21.     <spanstyle="background-color:rgb(255,255,0);">//MainSceneManager管理物件</span>
  22.     public static MainSceneManager Instance;  
  23.     private void Awake()  
  24.     {  
  25.         <spanstyle="background-color:rgb(255,255,0);">//初始化MainSceneManager管理物件,方便其他cs指令碼檔案呼叫時使用。</span>
  26.         MainSceneManager.Instance = this;  
  27.     }  
  28.     void Start () {  
  29.         //遊戲物體按軌跡開始移動,這裡相當於啟動自動漫遊路徑。  
  30.         doTweenPath.DORestart();  
  31.         <spanstyle="background-color:rgb(255,255,0);">//這裡繫結兩個按鈕的點選事件</span>
  32.         stopButton.onClick.AddListener(StopAuto);  
  33.         exitButton.onClick.AddListener(ExitAuto);  
  34.         viewButton.onClick.AddListener(ChangeView);  
  35.     }  
  36.     <spanstyle="background-color:rgb(255,255,0);">//建立停止/開始自動漫遊、退出自動漫遊和改變介面的方法</span>
  37.     private void StopAuto()  
  38.     {  
  39.         <spanstyle="background-color:rgb(255,255,0);">//重新給isClickViewButton賦值為false,然後傳值到CameraManager.cs指令碼檔案中,否則相機無法看向(0,0,0)座標</span>
  40.         isClickViewButton = false;  
  41.         <spanstyle="background-color:rgb(255,255,0);">//在變化過程中執行該方法,停止、開始、停止、開始 </span>
  42.         doTweenPath.DOTogglePause();  
  43.     }  
  44.     private void ExitAuto()  
  45.     {  
  46.         <spanstyle="background-color:rgb(255,255,0);">//重新給isClickViewButton賦值為false,然後傳值到CameraManager.cs指令碼檔案中,否則相機無法看向(0,0,0)座標</span>
  47.         isClickViewButton = false;  
  48.         <spanstyle="background-color:rgb(255,255,0);">//變化過程中執行該方法,回到原始位置</span>
  49.         doTweenPath.DORewind();     
  50.     }  
  51.     private void ChangeView()  
  52.     {  
  53.         <spanstyle="background-color:rgb(255,255,0);">//點選了ViewButton將isClickViewButton設定為true;然後傳值到CameraManager.cs指令碼檔案中。</span>
  54.         isClickViewButton = true;  
  55.         <spanstyle="background-color:rgb(255,255,0);">//1f 秒內 currCamera的座標變化到position1</span>
  56.         currCamera.transform.DOMove(position, 1f);  
  57.         <spanstyle="background-color:rgb(255,255,0);">//1f 秒內 currCamera的旋轉角度變化到qu1 </span>
  58.         currCamera.transform.DORotateQuaternion(qu, 3f);  
  59.     }  
  60.     void Update () {  
  61.     }  
  62. }  
    上面背景為黃色的部分為本次新增的程式碼,注意下面和CameraManager.cs指令碼檔案的聯絡;

(3)將CameraManager.cs指令碼檔案進行完善:

  1. using System;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using UnityEngine;  
  5. using DG.Tweening; //DOTween的名稱空間  
  6. public class CameraManager : MonoBehaviour {  
  7.     public static CameraManager Instance; //相機管理物件       
  8.     void Awake()  
  9.     {  
  10.         CameraManager.Instance = this;   //在這裡初始化CameraManager  
  11.     }  
  12.     // Use this for initialization  
  13.     void Start () {          
  14.     }  
  15.     // Update is called once per frame  
  16.     void Update () {  
  17.         <spanstyle="background-color:rgb(255,255,0);">//實時接收MainSceneManager中的isClickViewButton屬性</span>
  18.         bool isClickViewButton = MainSceneManager.Instance.isClickViewButton;  
  19.         <spanstyle="background-color:rgb(255,255,0);">//判斷是否點選了ViewButton,這一步很重要,否則MainCamera一直看向(0,0,0)座標,無法完成角度的變化</span>
  20.         if (isClickViewButton==false) {  
  21.             //使相機始終看向座標(0,0,0)  
  22.             this.transform.DOLookAt(new Vector3(0, 0, 0), 0.0001f);  
  23.         }  
  24.     }  
  25. }  
    從程式碼中可以看出,這裡判斷了MainSceneManager中的isClickViewButton的值,然後決定相機指向的位置,如果這裡不進行設定,在MainSceneManger中就無法重置相機的旋轉角度,相機會一直看向(0,0,0)座標。

(4)回到Unit3D介面。在Hierarchy檢視中單擊SceneManger遊戲物體,其Inspector檢視中如下顯示:

                                              

    上圖中紅色線框內的屬性為SceneManager管理的遊戲物件。CurrentCamera為當前相機,我們先直接將Hierarhy檢視中的MainCamera拖拽到該文字框內。

(5)在Hierarchy檢視中建立3個Button,並將名字和Text中的內容進行更改,如下圖:

                                               

(6)將新建立的3個Button遊戲物體附加到SceneManager遊戲物體的3個Button屬性中。此時SceneManager的Inspector檢視如下顯示。

                                               

    上圖為將CurrCamera和3個Button附加到SceneManager後的效果。

(7)開始進行遊戲測試:

        1、點選Stop/StartButton的效果如下圖所示:

                                   

        2、點選ExitAuto的效果如下圖所示:

                                   

        3、點選ChangeView的效果如下圖所示:

                                   
注:上述3幅圖中都是通過點選按鈕發生的變化,在圖裡麵點擊按鈕時按鈕顏色瞬間發生了輕微的變灰,可能看的不是特別清楚。