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

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

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

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

                                                         

(2)我们先将MainSceneManager.cs脚本文件进行完善。

[html]  view plain  copy
  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.     private Vector3 position = new Vector3(-3.37f, 10f,2.9f);  
  21.     private Quaternion qu = Quaternion.Euler(90f, -90f, 0);  
  22.     <span style="background-color:rgb(255,255,0);">//创建是否点击了改变界面的按钮</span>  
  23.     public bool 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脚本文件进行完善:

[html]  view plain  copy
  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.         bool isClickViewButton = MainSceneManager.Instance.isClickViewButton;  
  24.         <span style="background-color:rgb(255,255,0);">//判断是否点击了ViewButton,这一步很重要,否则MainCamera一直看向(0,0,0)坐标,无法完成角度的变化</span>  
  25.         if (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视图中如下显示:

                                              

    上图中红色线框内的属性为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幅图中都是通过点击按钮发生的变化,在图里面点击按钮时按钮颜色瞬间发生了轻微的变灰,可能看的不是特别清楚。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用备忘录模式来模拟围棋的和悔棋的示例代码(使用 Java 实现): ```java // 备忘录类,用于保存围棋棋盘状态 public class ChessboardMemento { private int[][] board; public ChessboardMemento(int[][] board) { this.board = board; } public int[][] getBoard() { return board; } } // 负责管理备忘录对象的存储和恢复 public class MementoCaretaker { private List<ChessboardMemento> mementos = new ArrayList<>(); public void saveMemento(ChessboardMemento memento) { mementos.add(memento); } public ChessboardMemento getMemento(int index) { return mementos.get(index); } } // 围棋游戏类 public class GoGame { private int[][] board = new int[19][19]; // 初始化棋盘 private MementoCaretaker caretaker = new MementoCaretaker(); public void play(int x, int y, int player) { // 下棋操作,改变棋盘状态 board[x][y] = player; // 保存当前状态到备忘录对象中 ChessboardMemento memento = new ChessboardMemento(copyOf(board)); caretaker.saveMemento(memento); } public void undo() { // 回退操作,将棋盘状态恢复到上一次保存的状态 ChessboardMemento memento = caretaker.getMemento(caretaker.size() - 1); board = memento.getBoard(); caretaker.getMementos().remove(memento); } public void printBoard() { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } } private static int[][] copyOf(int[][] original) { int[][] copy = new int[original.length][original[0].length]; for (int i = 0; i < original.length; i++) { System.arraycopy(original[i], 0, copy[i], 0, original[i].length); } return copy; } } // 测试代码 public class Main { public static void main(String[] args) { GoGame game = new GoGame(); game.play(1, 1, 1); // 黑方下在 (1, 1) 处 game.play(2, 2, 2); // 白方下在 (2, 2) 处 game.printBoard(); // 打印当前棋盘状态 game.play(3, 3, 1); // 黑方下在 (3, 3) 处 game.undo(); // 回退到上一步棋 game.printBoard(); // 打印回退后的棋盘状态 } } ``` 在上面的示例代码中,`ChessboardMemento` 类表示备忘录对象,保存了当前围棋棋盘的状态。`MementoCaretaker` 类负责管理备忘录对象的存储和恢复。`GoGame` 类实现了围棋游戏的逻辑,包括下棋和回退操作。在下棋时,将当前状态保存到备忘录对象中,并存储到 `MementoCaretaker` 对象中。在回退时,从 `MementoCaretaker` 对象中获取相应的备忘录对象,并将当前状态恢复为备忘录对象中保存的状态。在 Java 中,需要使用 `copyOf` 方法来复制二维数组,以避免对象引用的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值