Unity3D 使用备忘(三) 实现相机自动漫游开始、暂停、停止及相机角度切换。


2018年01月05日 06:03:05

阅读数:379


    在Unity3D 使用备忘(二) 我实现了相机自动漫游功能,在这一节中,我将实现如何进行相机按预设的位置进行角度切换。

(1)将Main Camera游戏物体附加给SceneManager的MainSceneManager(Script)组件下的doToweenPath属性(可通过点选doTweenPath在Scene中选择Main Camera 或者直接将Main Camera 拖拽到doToweenPath属性中)。

                                                         

unity做漫游代码 unity3d漫游_初始化

(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.   
8. public class MainSceneManager : MonoBehaviour {  
9.   
10.     //初始化按轨迹移动的游戏物体  
11.     public DOTweenPath doTweenPath;  
12.      
13. <span style="background-color:rgb(255,255,0);">//初始化当前相机</span>  
14.     public GameObject currCamera;     
15. <span style="background-color:rgb(255,255,0);">//创建开始/暂停自动漫游、停止自动漫游及改变界面的按钮,stopButton表示开始、暂停交替变化;</span>  
16.     public Button stopButton;  
17.     public Button exitButton;  
18.     public Button viewButton;  
19. <span style="background-color:rgb(255,255,0);">//创建改变界面时相机的位置和旋转角度</span>  
20. position = new Vector3(-3.37f, 10f,2.9f);  
21. qu = Quaternion.Euler(90f, -90f, 0);  
22. <span style="background-color:rgb(255,255,0);">//创建是否点击了改变界面的按钮</span>  
23. isClickViewButton = false;  
24. <span style="background-color:rgb(255,255,0);">//MainSceneManager管理对象</span>  
25.     public static MainSceneManager Instance;  
26.   
27.     private void Awake()  
28.     {  
29. <span style="background-color:rgb(255,255,0);">//初始化MainSceneManager管理对象,方便其他cs脚本文件调用时使用。</span>  
30. MainSceneManager.Instance = this;  
31.     }  
32.   
33.     void Start () {  
34.         //游戏物体按轨迹开始移动,这里相当于启动自动漫游路径。  
35.         doTweenPath.DORestart();  
36.   
37. <span style="background-color:rgb(255,255,0);">//这里绑定两个按钮的点击事件</span>  
38.         stopButton.onClick.AddListener(StopAuto);  
39.         exitButton.onClick.AddListener(ExitAuto);  
40.         viewButton.onClick.AddListener(ChangeView);  
41.     }  
42.   
43. <span style="background-color:rgb(255,255,0);">//创建停止/开始自动漫游、退出自动漫游和改变界面的方法</span>  
44.     private void StopAuto()  
45.     {  
46. <span style="background-color:rgb(255,255,0);">//重新给isClickViewButton赋值为false,然后传值到CameraManager.cs脚本文件中,否则相机无法看向(0,0,0)坐标</span>  
47. isClickViewButton = false;  
48. <span style="background-color:rgb(255,255,0);">//在变化过程中执行该方法,停止、开始、停止、开始 </span>  
49.         doTweenPath.DOTogglePause();  
50.          
51.     }  
52.     private void ExitAuto()  
53.     {  
54. <span style="background-color:rgb(255,255,0);">//重新给isClickViewButton赋值为false,然后传值到CameraManager.cs脚本文件中,否则相机无法看向(0,0,0)坐标</span>  
55. isClickViewButton = false;  
56. <span style="background-color:rgb(255,255,0);">//变化过程中执行该方法,回到原始位置</span>  
57.         doTweenPath.DORewind();     
58.     }  
59.     private void ChangeView()  
60.     {  
61. <span style="background-color:rgb(255,255,0);">//点击了ViewButton将isClickViewButton设置为true;然后传值到CameraManager.cs脚本文件中。</span>  
62. isClickViewButton = true;  
63. <span style="background-color:rgb(255,255,0);">//1f 秒内 currCamera的坐标变化到position1</span>  
64.         currCamera.transform.DOMove(position, 1f);  
65. <span style="background-color:rgb(255,255,0);">//1f 秒内 currCamera的旋转角度变化到qu1 </span>  
66.         currCamera.transform.DORotateQuaternion(qu, 3f);  
67.     }  
68.     void Update () {  
69.           
70.     }  
71. }

    上面背景为黄色的部分为本次添加的代码,注意下面和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.   
7. public class CameraManager : MonoBehaviour {  
8.   
9.     public static CameraManager Instance; //相机管理对象       
10.     void Awake()  
11.     {  
12. CameraManager.Instance = this;   //在这里初始化CameraManager  
13.     }  
14.   
15.     // Use this for initialization  
16.     void Start () {          
17.   
18.     }  
19.       
20.     // Update is called once per frame  
21.     void Update () {  
22. <span style="background-color:rgb(255,255,0);">//实时接收MainSceneManager中的isClickViewButton属性</span>  
23. isClickViewButton = MainSceneManager.Instance.isClickViewButton;  
24. <span style="background-color:rgb(255,255,0);">//判断是否点击了ViewButton,这一步很重要,否则MainCamera一直看向(0,0,0)坐标,无法完成角度的变化</span>  
25. isClickViewButton==false) {  
26.             //使相机始终看向坐标(0,0,0)  
27.             this.transform.DOLookAt(new Vector3(0, 0, 0), 0.0001f);  
28.         }  
29.           
30.     }  
31. }

    从代码中可以看出,这里判断了MainSceneManager中的isClickViewButton的值,然后决定相机指向的位置,如果这里不进行设置,在MainSceneManger中就无法重置相机的旋转角度,相机会一直看向(0,0,0)坐标。

(4)回到Unit3D界面。在Hierarchy视图中单击SceneManger游戏物体,其Inspector视图中如下显示:


                                              

unity做漫游代码 unity3d漫游_System_02

    上图中红色线框内的属性为SceneManager管理的游戏对象。CurrentCamera为当前相机,我们先直接将Hierarhy视图中的MainCamera拖拽到该文本框内。

(5)在Hierarchy视图中创建3个Button,并将名字和Text中的内容进行更改,如下图:

                                               

unity做漫游代码 unity3d漫游_System_03

(6)将新创建的3个Button游戏物体附加到SceneManager游戏物体的3个Button属性中。此时SceneManager的Inspector视图如下显示。

                                               

unity做漫游代码 unity3d漫游_初始化_04

    上图为将CurrCamera和3个Button附加到SceneManager后的效果。

(7)开始进行游戏测试:

        1、点击Stop/StartButton的效果如下图所示:

                                   

unity做漫游代码 unity3d漫游_初始化_05

        2、点击ExitAuto的效果如下图所示:



                                   

unity做漫游代码 unity3d漫游_System_06



        3、点击ChangeView的效果如下图所示:


                                   

unity做漫游代码 unity3d漫游_unity做漫游代码_07


注:上述3幅图中都是通过点击按钮发生的变化,在图里面点击按钮时按钮颜色瞬间发生了轻微的变灰,可能看的不是特别清楚。