91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity中有哪些常用的命令模式

發布時間:2021-05-17 15:59:25 來源:億速云 閱讀:180 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關Unity中有哪些常用的命令模式,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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

抽象到程序代碼中,這三類成員分別對應于界面上的用戶,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();
  }
}

關于Unity中有哪些常用的命令模式就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四平市| 开原市| 珲春市| 全南县| 咸丰县| 桐梓县| 县级市| 黔西县| 修武县| 南皮县| 定日县| 襄城县| 嘉义市| 唐河县| 秀山| 长沙市| 安西县| 郓城县| 周至县| 鄂托克旗| 织金县| 合水县| 和政县| 孟连| 汝阳县| 阳山县| 蕉岭县| 白朗县| 应城市| 松滋市| 淄博市| 牡丹江市| 锡林浩特市| 香河县| 玉溪市| 凤凰县| 翼城县| 巴塘县| 德兴市| 东乡族自治县| 榕江县|