这节课我们一起来学习如何把play界面过渡到end界面。由于我们现在没有做游戏部分,所以我们暂时设置在play界面3秒钟之后自动进去end界面。
之前一节中,我们在palyState中代码如下:
State playState () { StateWithEventMap state = new StateWithEventMap (); //带消息映射表的状态类 state.onStart += delegate { view.play.gameObject.SetActive(true); }; state.onOver += delegate { view.play.gameObject.SetActive(false); }; return state; }
现在我们修改下:
State playState () { StateWithEventMap state = TaskState.Create (delegate { TaskWait tw =new TaskWait(); tw.setAllTime(3f); return tw; }, fsm, "end"); state.onStart += delegate { view.play.gameObject.SetActive(true); }; state.onOver += delegate { view.play.gameObject.SetActive(false); }; return state; }
三秒之后进入end状态,Create函数的定义如下:
然后我们在Hierarchy面板中新建一个空的GameObject,然后改名为TaskManager,并把GDGeek工具包中的taskmanager.cs脚本拖给它。
运行游戏,我们发现可以跳转。结束时的按钮,重新开始游戏,我们为之添加响应,选中按钮,在右边的面板中增加函数,绑定到Ctrl中的fsmPost中,参数为Restart,如图:
然后我们在endState函数中添加响应:
state.addEvent("Restart","begin"); //得到重新开始按钮电击事件的话,进去begin状态
附上我们修改后的Ctrl.cs的全部代码:
using UnityEngine; using System.Collections; using GDGeek; public class Ctrl : MonoBehaviour { private FSM fsm = new FSM(); public View view=null; public void fsmPost(string msg) { fsm.post (msg); } // Use this for initialization void Start () { fsm.addState ("begin",beginState()); fsm.addState ("play",playState()); fsm.addState ("end",endSdtate()); fsm.init ("begin"); } // Update is called once per frame void Update () { } State beginState () { StateWithEventMap state = new StateWithEventMap (); //带消息映射表的状态类 state.onStart += delegate { view.begin.gameObject.SetActive(true); }; state.onOver += delegate { view.begin.gameObject.SetActive(false); }; state.addEvent("clickStart","play"); //得到开始按钮电击事件的话,进去play状态 return state; } State playState () { StateWithEventMap state = TaskState.Create (delegate { TaskWait tw =new TaskWait(); tw.setAllTime(3f); return tw; }, fsm, "end"); state.onStart += delegate { view.play.gameObject.SetActive(true); }; state.onOver += delegate { view.play.gameObject.SetActive(false); }; return state; } State endSdtate () { StateWithEventMap state = new StateWithEventMap (); //带消息映射表的状态类 state.onStart += delegate { view.end.gameObject.SetActive(true); }; state.onOver += delegate { view.end.gameObject.SetActive(false); }; state.addEvent("Restart","begin"); //得到重新开始按钮电击事件的话,进去begin状态 return state; } }
至于为什么要新建一个TaskManager,暂时先留出空白,咱们稍后解释。
我是orzangleli,谢谢你一直阅读到现在,如果你看到了这篇文章,请麻烦回复我下,给我点动力更新下去,多谢!
原文:http://www.cnblogs.com/orzangleli/p/5003020.html