日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C# > 正文

Unity常用命令模式詳解

2019-10-29 19:32:16
字體:
來源:轉載
供稿:網友

在調用一些簡單的方法實現一系列的動作時,回退的問題比較重要。作為一款用戶體驗良好的產品而言,有回退功能將顯得比較人性化,想想如果我們常用的window,在刪除一個文件后無法恢復將變得多么的糟糕。更為直觀的例子是在玩一些小游戲時,比如象棋、推箱子,提供了悔棋的功能,用戶有了更多選擇的余地。

本文主要將的將是在Unity中實現一個以常聽說的命令模式為設計原理,實現一個可以撤銷移動、旋轉、顏色和文字信息的小Demo。

命令模式,主要成員有提出要求的客戶、設置命令的收集者、執行命令的接收者。客戶要求很簡單,點擊按扭就要實現一項目具體的效果,設置命令的收集者無需要知道命令如何執行,只需要為執行者做好配制。用命令的執行者將執行一個方法,所有的命令者是繼承于有這個方法的接口的類。

抽象到程序代碼中,這三類成員分別對應于界面上的用戶,RemoteControl (這里是隨便命名的),RemoteLoader

Unity,命令模式

先制作如上的界面,方便你比較直觀的認識,其中左邊兩個是用于切換選擇不同的命令。下面第一個按扭可以執行選中的命令,第二個按扭可以進行撤銷操作。

程序,UGUI面局如下,在Canvas下分別設置了執行者和配制者。

Unity,命令模式

制作好界面之后就可以來實現具體的腳本編輯了,分別創建好接口ICommand,配制腳本RemoteLoader和執行腳本RemoteControl,結構如下:

Unity,命令模式

在Commonds中,分別編寫了用于移動,旋轉,顏色,文字的腳本

Unity,命令模式

這樣一來,就可以實現一個可撤銷的命令模式了,效果如下所示:

Unity,命令模式

其中用于保存undo方法和具體怎么undo都是使用Stack來實現的,下面分別是部分代碼實現 :

一、接口

public interface ICommand{  void Execute();  void UnDo();}

二、執行器

public class RemoteControl : MonoBehaviour {  public Button ctrlBtn;  public Button undoBtn;  public Text ctrlName;  private ICommand icommand;  public Stack<UnityAction> undoFunctions = new Stack<UnityAction>();  void Awake(){    ctrlBtn.onClick.AddListener(OnCtrlBtnClicked);    undoBtn.onClick.AddListener(OnUnDoBtnClicked);  }    public void SetText(string textinfo)  {    ctrlName.text = textinfo;  }  public void SetCommond(ICommand icommand)  {    this.icommand = icommand;  }  /// <summary>  /// 執行  /// </summary>  public void OnCtrlBtnClicked()  {    if (icommand != null)    {      icommand.Execute();      undoFunctions.Push(icommand.UnDo);    }  }  /// <summary>  /// 撤銷  /// </summary>  private void OnUnDoBtnClicked()  {    if (undoFunctions.Count > 0)    {      undoFunctions.Pop().Invoke();    }  }}

三、配制加載器

public class RemoteLoader : MonoBehaviour{  public Button lastBtn;  public Button nextBtn;  private int index;  private const int NUM_COMMAND = 10;  private ICommand[] commands;  private string[] textinfos;  private MoveCommand movexCmd;  private MoveCommand moveyCmd;  private MoveCommand movezCmd;  private RotateCommand rotxCmd;  private RotateCommand rotyCmd;  private RotateCommand rotzCmd;  private ColorChangeCommand redColorCmd;  private ColorChangeCommand greenColorCmd;  private ColorChangeCommand blueColorCmd;  private TextChangeCommand textCmd;  private string[] infos = { "A","B", "C", "D", "E", "F" };  public RemoteControl remoteCtrl;  public GameObject cube;  void Awake()  {    lastBtn.onClick.AddListener(OnLastBtnClicked);    nextBtn.onClick.AddListener(OnNextBtnClicked);  }  void Start()  {    commands = new ICommand[NUM_COMMAND];    textinfos = new string[NUM_COMMAND];    textinfos[0] = "x方向移動";    commands[0] = new MoveCommand(cube.transform, Vector3.right);    textinfos[1] = "y方向移動";    commands[1] = new MoveCommand(cube.transform, Vector3.up);    textinfos[2] = "z方向移動";    commands[2] = new MoveCommand(cube.transform, Vector3.forward);    textinfos[3] = "x軸旋轉10度";    commands[3] = new RotateCommand(cube.transform, Vector3.right * 10);    textinfos[4] = "y軸旋轉10度";    commands[4] = new RotateCommand(cube.transform, Vector3.up * 10);    textinfos[5] = "z軸旋轉10度";    commands[5] = new RotateCommand(cube.transform, Vector3.forward * 10);    textinfos[6] = "變紅";    commands[6] = new ColorChangeCommand(Color.red, cube.GetComponent<Renderer>().material);    textinfos[7] = "變綠";    commands[7] = new ColorChangeCommand(Color.green, cube.GetComponent<Renderer>().material);    textinfos[8] = "變藍";    commands[8] = new ColorChangeCommand(Color.blue, cube.GetComponent<Renderer>().material);    textinfos[9] = "換信息";    commands[9] = new TextChangeCommand(cube.GetComponentInChildren<TextMesh>(), infos);  }  private void OnNextBtnClicked()  {    if (index == NUM_COMMAND || index == -1)    {      index = 0;    }    remoteCtrl.SetCommond(commands[index]);    remoteCtrl.SetText(textinfos[index]);    index++;  }  private void OnLastBtnClicked()  {    if (index == NUM_COMMAND || index == -1)    {      index = NUM_COMMAND - 1;    }    remoteCtrl.SetCommond(commands[index]);    remoteCtrl.SetText(textinfos[index]);    index--;  }}

四、顏色轉換命令腳本

public class ColorChangeCommand : ICommand{  private Stack<Color> m_OriginColor = new Stack<Color>();  private Color m_Color;  private Material m_Material;    public ColorChangeCommand(Color color, Material material)  {    m_Color = color;    m_Material = material;  }  public void Execute()  {    m_OriginColor.Push(m_Material.color);    m_Material.color = m_Color;  }  public void UnDo()  {    m_Material.color = m_OriginColor.Pop();  }}

五、移動命令腳本

public class MoveCommand : ICommand{  private Vector3 m_Offset;  private Transform m_Object;  public MoveCommand(Transform obj, Vector3 offset)  {    this.m_Object = obj;    this.m_Offset = offset;  }  public void Execute()  {    m_Object.transform.position += m_Offset;  }  public void UnDo()  {    m_Object.transform.position -= m_Offset;  }}

六、轉換命令腳本

public class RemoteControl : MonoBehaviour {  public Button ctrlBtn;  public Button undoBtn;  public Text ctrlName;  private ICommand icommand;  public Stack<UnityAction> undoFunctions = new Stack<UnityAction>();  void Awake(){    ctrlBtn.onClick.AddListener(OnCtrlBtnClicked);    undoBtn.onClick.AddListener(OnUnDoBtnClicked);  }    public void SetText(string textinfo)  {    ctrlName.text = textinfo;  }  public void SetCommond(ICommand icommand)  {    this.icommand = icommand;  }  /// <summary>  /// 執行  /// </summary>  public void OnCtrlBtnClicked()  {    if (icommand != null)    {      icommand.Execute();      undoFunctions.Push(icommand.UnDo);    }  }  /// <summary>  /// 撤銷  /// </summary>  private void OnUnDoBtnClicked()  {    if (undoFunctions.Count > 0)    {      undoFunctions.Pop().Invoke();    }  }}

七、文字加載腳本

public class TextChangeCommand : ICommand{  private Stack<string> lastInfos = new Stack<string>();  private IEnumerator<string> datas;  private TextMesh m_Textmesh;  public TextChangeCommand(TextMesh textMesh,ICollection<string> texts)  {    datas = texts.GetEnumerator();    m_Textmesh = textMesh;  }  public void Execute()  {    if (!datas.MoveNext())    {      datas.Reset();      datas.MoveNext();    }    lastInfos.Push(m_Textmesh.text);    m_Textmesh.text = datas.Current;  }  public void UnDo()  {    m_Textmesh.text = lastInfos.Pop();  }}

僅供參考,謝謝閱讀。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲免费中文字幕| 亚洲一区中文在线| 国产视频三级在线观看播放| 一区在线播放视频| 欧美日韩国产综合视频在线观看中文| 91九色在线看| 九九精品调教| 黄色片网站在线| 91久久精品网| wwwww亚洲| 精品不卡一区二区| 日韩不卡在线播放| 日韩专区视频网站| 日韩欧美在线1卡| 欧美日韩在线播放三区四区| 欧美一级免费观看| 九九九精品视频| 最近中文av字幕在线中文| 在线国产日本| 国产欧美综合在线观看第十页 | 午夜av一区二区| 日韩专区中文字幕| 日韩精品视频网| 日韩精品视频免费看| 亚洲视频色图| 欧美,日韩,国产在线| 亚洲高清免费一级二级三级| 欧美啪啪一区| 欧洲一级精品| 欧美日韩尤物久久| 欧美日韩在线观看首页| 国内精品99| av三级在线观看| 亚洲中文字幕一区| 亚洲高清视频在线| 99中文字幕一区| 欧美日韩在线视频免费观看 | 欧美日韩激情一区| 欧美日韩激情一区二区三区| 日韩wumaV| 在线国产日本| 中文字幕精品在线播放| 97国产视频| 中文字幕亚洲区| 精品国产乱码久久久久久蜜臀| 亚洲黄色在线观看| 久久精品网站免费观看| 中文字幕在线国产| 欧美日韩精品综合| 在线观看一区| 久久久精品国产免费观看同学| 欧美日韩在线观看一区| 91久久大香伊蕉在人线| 91色在线看| 午夜一区二区三区| 日韩精品在线免费观看| 91精品国产日韩91久久久久久| 色偷偷一区二区三区| 中文国产字幕在线观看| 中文亚洲免费| 伊人国产视频| 欧美日韩三级在线| 亚洲综合在线电影| 国产欧美 在线欧美| 黄色精品在线观看| 日韩欧美国产成人精品免费| 在线综合 亚洲 欧美中文字幕| 免费国产h视频在线观看86| 欧美 日韩 国产 高清| 中文字幕日韩高清| 美日韩精品免费视频| 久久久99久久| 99这里有精品视频| 日本亚洲欧美天堂免费| 中文字幕日韩欧美在线| 欧美国产亚洲一区| 久久香蕉精品| 91精品xxx在线观看| 日韩欧美亚洲日产国| 欧美日韩综合视频| 久久香蕉一区| 日韩精品一区二区三区视频播放| 欧美日韩中文字幕在线| 亚洲国产www| 欧美日韩中文字幕精品| 深夜福利一区| 日韩国产一区| 日本a口亚洲| 欧美.日韩.国产.一区.二区| 欧美三级日韩在线| 精品日韩在线观看| 69免费视频| 欧美亚洲另类制服自拍| 精品视频国产| 亚洲黄在线观看| 国产网站欧美日韩免费精品在线观看| 欧美日韩视频免费播放| 在线中文免费视频| 精品熟女一区二区三区| 国产在线精品日韩| 欧美日韩高清| 九色蝌蚪视频在线| 中文字幕日韩视频| 久久69成人| 亚洲第一福利视频在线| 国产高清精品在线| 国产xxx在线| 欧美日韩乱国产| 亚洲乱码在线观看| 国产日韩av一区二区| 国产最顶级的黄色片在线免费观看| 91九色精品视频| 日韩精品视频免费| 中文字幕最新精品| 在线观看一区日韩| 久久久久久欧美| 日韩欧美视频一区二区三区四区| 久精品在线观看| www.eeuss影院| 日韩欧美国产黄色| 国产亚洲污的网站| 欧美 亚洲 精品 三区| 欧美日韩免费不卡视频一区二区三区| 亚洲第一视频| 国产婷婷色一区二区三区| 国产中文伊人| 在线视频不卡一区二区| 99精品一级欧美片免费播放| 91精品国产全国免费观看| 久久精品99国产国产精| 中文天堂在线一区| 韩国v欧美v日本v亚洲| 国产一区在线不卡| 日韩欧美国产高清| 亚洲第一精品在线| 国产资源中文字幕| 欧美日韩国产免费观看| 欧美日韩中文字幕在线观看| 中文字幕 乱码 中文乱码91| 99在线精品视频免费观看20| 中文字幕在线视频久| 欧美色欧美亚洲高清在线视频| 欧美一级免费在线观看| 欧美在线日韩| 欧美日韩中文字幕精品| 欧美乱大交xxxxx免费| 国产一区三区三区| 亚洲 欧美 中文字幕| 中文字幕日韩精品在线| 国产95在线|亚洲| av中文资源在线| 91精品国产亚洲| 蜜桃视频一日韩欧美专区| 日韩欧美中文字幕在线播放| 日韩在线三区| 国产123在线| 91精品日本| 亚州福利视频| 国产卡1卡2卡三卡在线| 国产字幕在线看| 国产免费久久久| 日韩精品在线网站| 黄色国产网站在线观看| 顶级网黄在线播放| 在线国产99| 成人精品国产福利| 成人久久在线| 91精品国产综合久久福利| 一区二区精品区| www.中文字幕在线观看| 国产精品一区二三区| av免费在线观看网址| 日韩欧美亚洲国产| 91精品网站| 国产一卡二卡3卡4卡四卡在线| 一级免费a一片| 91精品国产综合久久精品| 亚洲a一级视频| 日本精品二区| 亚洲免费精品视频| 欧美日韩国产一二| 99在线精品视频免费观看20| 精品视频三区| 国产激情99| 日韩精品―中文字幕| 亚亚洲欧洲精品| 日韩欧美国产黄色| 自拍日韩亚洲一区在线| 亚洲免费观看视频| 一区二区在线观| 日韩中文字幕观看| 你懂的亚洲视频 | 婷婷综合福利| 中文字幕亚洲区| 影音先锋一区二区资源站| 黄色在线播放网站| 欧美日韩国产中文精品字幕自在自线| 精品亚洲国内自在自线福利| 一二三区精品视频| 精品一区二区三区中文字幕| 国产欧美综合在线| 国产羞羞视频在线播放| 国产精久久久久| 久久99精品久久久久久青青日本| 日韩精品―中文字幕| 1区2区在线| 精品一二线国产| 日韩欧美中文在线| 不卡福利视频| 最近中文av字幕在线中文 | 亚洲女人天堂a在线播放| 久99久视频| 精品欧美不卡一区二区在线观看| 精品av中文字幕在线毛片| 亚洲综合在线视频| 精品国产1区二区| 国产在线日韩欧美| 天天综合色天天| 亚洲高清视频在线| 韩国av一区二区| 欧美日韩国产黄色| 在线日韩欧美| 欧美午夜精品在线| 亚洲欧洲综合另类| 亚洲福利在线视频| 在线免费播放av| 久久精品一级爱片| 日韩一级中文字幕| 亚洲一区在线观看网站| 国产h片在线观看| 中文字幕在线精品| 国产三级精品网站| 一区二区三区在线|网站| 日韩免费视频一区二区| 国产偷国产偷亚洲清高网站| 久久精品人妻一区二区三区| 国产在线日韩精品| 国产网站欧美日韩免费精品在线观看| 三级精品视频| 亚洲一区在线观看网站| 亚洲成a人片在线www| 91精品国产乱码久久蜜臀| 国产不卡的av| 欧美变态tickling挠脚心| 亚洲一区导航| 国内精品露脸在线视频播放| 欧美日韩中国免费专区在线看| 在线国产1区| 国产福利免费观看| 国产黄色一区| 一区二区91| 中文字幕在线观看视频www| 一区在线播放视频| 亚洲一区视频在线观看视频| 色综合天天性综合| 91日韩欧美| 久久久99精品久久| 亚洲三级av| 亚洲开心激情| 中文字幕在线视频日韩| av三级在线观看| 日韩免费精品| 色综合天天综合网天天狠天天 | 中文在线日韩| 91精品国产自产观看在线| 99精品在线播放| 综合图区亚洲白拍在线| 久久99精品久久久久婷婷| 日韩视频在线免费播放| 亚洲日本欧美日韩高观看| 欧美日韩中文字幕综合视频| 欧美日韩精品是欧美日韩精品| 91xxx在线观看| 一区二区三区免费看视频| 国产欧美日韩综合精品| 日韩精品在线视频观看| 欧美国产亚洲一区| 亚洲 欧美综合在线网络| 欧美日韩在线不卡视频| 在线视频1区2区| 日韩中文字幕视频在线| 日韩中文欧美在线| 中文字幕国产欧美| 日韩中文字幕亚洲| 亚洲羞羞网站| 亚洲影视资源网| 不卡视频一区二区| 日韩在线观看视频一区二区| 午夜国产福利一区二区| 日韩在线观看视频一区| 日韩欧美999| 欧美不卡视频| 一区二区不卡视频在线观看| 国产黄色在线观看| 日韩精品在线免费观看| 欧美色视频一区二区三区在线观看| 一二三区精品视频| 亚洲大片精品永久免费| 日韩三级视频在线播放| 亚洲深夜福利| 久久91精品国产91久久小草| 一区二区高清视频| 久久精品国产成人一区二区三区| 欧洲精品二区| 麻豆一区二区99久久久久| 天堂在线中文| 99精品一级欧美片免费播放| 国产福利久久| 欧美日韩在线观看首页| 免费在线视频一区二区| 一级片免费在线播放| 欧美日韩一级视频| 亚州福利视频| 欧美日韩亚洲视频| 精品视频在线导航| 日本亚洲欧美| 99综合精品久久| 九一久久久久久| 欧美日韩一区二区在线视频| 国产一级片在线| 日韩亚洲不卡在线| 中文字幕在线视频网| 日韩精品在线网站| 中文字幕精品在线视频| 国产精久久久久| 久久人人88| 国产福利精品导航| wwwww亚洲| 91九色精品视频| 日韩精品手机在线| 中文av字幕一区| 国产一区在线不卡| 国产在线第一页| 九九精品调教| 亚洲福利一区二区三区| 亚洲开心激情| 91欧美日韩在线| 欧美日韩在线播放一区| 日韩视频在线免费播放| 中文字幕第一页在线播放| 国产不卡的av| 亚洲 欧美 中文字幕| 精品久久九九| av三级在线播放| 国产日产一区二区| 欧美日韩午夜在线| 中文字幕在线高清| 国产福利在线导航| 在线精品观看| 久久久99久久| 欧美三级在线视频| 在线三级av| 91精品国产综合久久香蕉最新版 | 亚洲免费观看在线观看| 亚洲欧美中文字幕| 日本黄色一区二区三区| 欧美日韩国产大片| 国产一区激情在线| 日韩国产一区久久| 欧美日韩第一区日日骚| 亚洲一级特黄| 亚洲.国产.中文慕字在线| 天天综合日日夜夜精品| 精品成人久久久| 日韩av一区二| 日韩在线视频在线观看| 国产婷婷色一区二区三区在线| 久久视频免费看| 欧美日韩视频免费播放| 国产在线拍偷自揄拍精品| 日韩 欧美 中文| 色欧美日韩亚洲| 日韩欧美国产不卡| 91久久精品在线| 欧美三级日韩三级| 91精品在线观看国产| 欧美另类专区| 国产婷婷色一区二区三区| 国产欧美日韩综合精品| 国产黄色片大全| 国产免费一级| 不卡视频一区二区| 一区二区三区在线播放视频| 一区二区三区在线免费| 中文字幕精品视频| 中文字幕视频在线观看| 91精品国产高清| 亚洲第一中文字幕在线观看| 日韩欧美中文字幕在线播放| 黄污视频在线看| 国产乱一区二区| 亚洲日本精品视频| 欧美日韩中文| 精品国产99久久久久久| 久久久99久久| 久久精品欧美日韩精品| 在线精品日韩| 黄色欧美日韩| www.尤物.com| 欧美日韩国产综合网|