欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity3D撤回命令開發(fā)詳解

 更新時(shí)間:2019年03月07日 08:35:42   作者:JayW就是我吖  
這篇文章主要為大家詳細(xì)介紹了Unity3D撤回命令開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Unity3D撤回命令功能開發(fā),供大家參考,具體內(nèi)容如下

在類似操作考核的項(xiàng)目中我們經(jīng)常會(huì)遇到回到上一步的需求。所以我們有必要對(duì)每一個(gè)狀態(tài)點(diǎn)的所有參與交互的物體的狀態(tài)進(jìn)行記錄。好了,下面就是代碼的實(shí)現(xiàn):

首先肯定要?jiǎng)?chuàng)建命令的基類,

public class BaseCommand
{
 
 //執(zhí)行命令
 public virtual void ExcuteCommand() { }
 
 
 //撤銷命令
 public virtual void RevocationCommand() { }
 
}

因?yàn)槲覀兛刂莆矬w的類似移動(dòng)改變方式不同,有可能是直接移動(dòng)的,有可能是用的dotween來(lái)操作移動(dòng),所以我們的執(zhí)行命令函數(shù)可能對(duì)于我們沒有實(shí)現(xiàn)的必要。下面我們要?jiǎng)?chuàng)建一個(gè)用來(lái)管理命令的腳本,供我們添加和移除命令,同時(shí)這個(gè)腳本我們給設(shè)置為單例,可供全局調(diào)用。如下:

public class CommandManager : MonoBehaviour
{
 public static CommandManager Instance = null;
 //管理命令
 private Stack<BaseCommand> commandStack = new Stack<BaseCommand>();
 
 private void Awake()
 {
  Instance = this;
 }
 
 
 //增加命令 
 public void AddCommand(BaseCommand baseCommand)
 {
  commandStack.Push(baseCommand);
 }
 
 
 //移除命令 并且撤銷一步操作
 public void RemoveCommand()
 {
  if(commandStack.Count>0)
  {
   BaseCommand baseCommand = commandStack.Pop();
   baseCommand.RevocationCommand();
  }
 }
}

有個(gè)命令基類,有了管理類,下面我們就要對(duì)不同命令進(jìn)行專門的功能實(shí)現(xiàn)了。

一.移動(dòng)類命令

//保存模型的位置 角度 大小信息
public class TransformCommand : BaseCommand
{
 private Transform target;
 private Vector3 pos;
 private Vector3 rota;
 private Vector3 scale;
 private Transform parent;
//我們?cè)跇?gòu)造函數(shù)里直接傳進(jìn)來(lái)我們改變狀態(tài)前的Transform信息
 public TransformCommand(Transform target, Vector3 pos, Vector3 rota, Vector3 scale,Transform parent)
 {
  this.target = target;
  this.pos = pos;
  this.rota = rota;
  this.scale = scale;
  this.parent = parent;
 }
 
 public override void ExcuteCommand()
 {
  base.ExcuteCommand();
 }
 
 public override void RevocationCommand()
 {
  target.SetParent(parent);
  target.transform.localPosition = pos;
  target.transform.localEulerAngles = rota;
  target.transform.localScale = scale;
 }
}

下面是我們寫的測(cè)試腳本掛在到攝像頭上,

public class CameraMove : MonoBehaviour {
 
 
 // Update is called once per frame
 void Update ()
 {
  if(Input.GetKeyDown(KeyCode.W))
  {
   TransformCommand cmd = new TransformCommand(transform,transform.localPosition,
    transform.localEulerAngles,transform.localScale,null);
   CommandManager.Instance.AddCommand(cmd);
   transform.Translate(Vector3.forward,Space.Self);
  }
 }
}

還需要寫一個(gè)輸入的類來(lái)調(diào)用撤退命令,代碼如下:

public class Test : MonoBehaviour {
 
 private void Update()
 {
  if(Input.GetKeyDown(KeyCode.Escape))
  {
   CommandManager.Instance.RemoveCommand();
  }
 }
}

二.UI類用戶控制改變狀態(tài)

下面以InputField為例,介紹UI交互類的撤退命令,這個(gè)要比普通的麻煩一些。我找了官方文檔好久也沒發(fā)現(xiàn)值改變前得回掉函數(shù),所以只能自己來(lái)實(shí)現(xiàn)了。首先我們要自己寫一個(gè)腳本用來(lái)記錄改變之前的值。掛載在場(chǎng)景里的InputField上。代碼如下:

public class MyInputField : MonoBehaviour,IPointerClickHandler
{
 private InputField input;
 private string preString;//用來(lái)記錄改變前得值
 
 private bool IsValueChange = false;//判斷值是否發(fā)生改變
 
 private bool IsClick = false;//用來(lái)判斷InputField是否被選中交互
 
 
 
 private void Awake()
 {
  input = GetComponent<InputField>();
  input.onValueChanged.AddListener(delegate { IsValueChange=true; });
  input.onEndEdit.AddListener(OnEndEditCallBck);
 }
 
 //結(jié)束編輯得回調(diào)函數(shù)
 void OnEndEditCallBck(string content)
 {
  IsClick = false;
  //如果值沒變 直接返回 沒必要增加命令
  if (IsValueChange == false) return;
  InputFieldCommand cmd = new InputFieldCommand(input,preString);
  CommandManager.Instance.AddCommand(cmd);
 }
 
 //當(dāng)被點(diǎn)擊時(shí),我們的UI組件被交互 有被更改值得可能 所以要記錄當(dāng)前值
 public void OnPointerClick(PointerEventData eventData)
 {
  Debug.Log("點(diǎn)擊");
  if (IsClick) return;
  preString = input.text;
  IsClick = true;
 }
}
public class InputFieldCommand : BaseCommand
{
 private InputField targetInput;
 private string content;
 
 
 public InputFieldCommand(InputField inputField,string content)
 {
  this.targetInput = inputField;
  this.content = content;
 }
 
 
 public override void RevocationCommand()
 {
  base.RevocationCommand();
  targetInput.text = content;
 }
}

上面就是在用戶對(duì)InputField輸入內(nèi)容改變時(shí)自動(dòng)記錄上一步得命令。對(duì)于其他得UI組件類似Toggle Slider同樣適用。

三.銷毀生成的物體

我們?cè)诋?dāng)前一步實(shí)例化很多物體,返回上一步就需要銷毀所有實(shí)例化的物體。這里我們不建議直接銷毀,而是利用對(duì)象池技術(shù)進(jìn)行回收,還節(jié)約性能。對(duì)象池技術(shù)博客地址:點(diǎn)擊打開鏈接  代碼如下:

public class DestoryCommand : BaseCommand
{
 private List<GameObject> objects;
 
 public DestoryCommand(List<GameObject> objects)
 {
  this.objects = objects;
 }
 
 public override void RevocationCommand()
 {
  for(int i=0;i< objects.Count;i++)
  {
   //利用對(duì)象池技術(shù)回收物體 這里就不寫了 因?yàn)檫€要把對(duì)象池的腳本添加進(jìn)來(lái)
  }
 }
}

這個(gè)命令是在我們實(shí)例化物體后才能增加。其實(shí)就是把實(shí)例化的物體加入到List數(shù)組然后傳入一個(gè)新聲明的DestoryCommand構(gòu)造函數(shù)中。以上效果圖如下:

希望本博客對(duì)你有幫助!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • C#模板方法模式(Template Method Pattern)實(shí)例教程

    C#模板方法模式(Template Method Pattern)實(shí)例教程

    這篇文章主要介紹了C#模板方法模式(Template Method Pattern),以實(shí)例形式講述了C#抽象類模板方法的用法,具有很高的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • 基于Unity編寫一個(gè)九宮格抽獎(jiǎng)軟件

    基于Unity編寫一個(gè)九宮格抽獎(jiǎng)軟件

    這篇文章主要為大家介紹了如何利用Unity編寫一個(gè)年會(huì)抽獎(jiǎng)軟件,還能設(shè)置中獎(jiǎng)概率。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-03-03
  • C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C#如何正確實(shí)現(xiàn)一個(gè)自定義異常Exception

    C#如何正確實(shí)現(xiàn)一個(gè)自定義異常Exception

    這篇文章主要為大家詳細(xì)介紹了C#如何正確實(shí)現(xiàn)一個(gè)自定義異常Exception,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • C#多線程的Join()方法

    C#多線程的Join()方法

    這篇文章介紹了C#多線程的Join()方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)的示例詳解

    C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#形狀原點(diǎn)變換的方法

    C#形狀原點(diǎn)變換的方法

    這篇文章主要介紹了C#形狀原點(diǎn)變換的方法,涉及C#圖形繪制中原點(diǎn)變換的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#導(dǎo)出Excel的方法

    C#導(dǎo)出Excel的方法

    本文給大家分享的是基于.net 1.0開發(fā)的程序如何實(shí)現(xiàn)導(dǎo)出Excel的方法和示例,使用的是UltraWebGrid自帶導(dǎo)出Excel的控件,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-06-06
  • C#5.0中的異步編程關(guān)鍵字async和await

    C#5.0中的異步編程關(guān)鍵字async和await

    這篇文章介紹了C#5.0中的異步編程關(guān)鍵字async和await,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#訪問SQLServer增刪改查代碼實(shí)例

    C#訪問SQLServer增刪改查代碼實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C#訪問SQLServer增刪改查代碼實(shí)例,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論