Unity3D应用有限状态机

  1 using GDGeek;
  2 using System.Collections;
  3 using UnityEngine;
  4 
  5 public class Ctrl : MonoBehaviour {
  6 
  7     /*
  8     有限状态机
  9     有限状态机是可以把游戏划分成很多状态,这些状态可以在耦合度很低的状态下各自切换,
 10     如:
 11      1、游戏接入时的状态;
 12      2、游戏玩的时候的状态;
 13      3、游戏结束时候的状态;
 14      * 
 15      * 这三个状态可以分别去控制他们,
 16      * 他是最简单而又使用广泛的人工智能基础组件之一,
 17      * 基本上所有的游戏都是可以用有限状态机来调度他们的逻辑和人工智能的
 18      */
 19 
 20 
 21      /*     
 22            MVC最重要的一点
 23     
 24      控制层可以调用显示层和模型层
 25      但是模型层和显示层不能互相调用
 26      */
 27 
 28 
 29     //创建一个有限状态机的工具
 30     private FSM fsm_ = new FSM();
 31 
 32     public View _view = null;
 33 
 34     //发一个字符串给有限状态机
 35     //begin 和 end 都会给有限状态机发送消息
 36 
 37     public void fsmPost(string msg) {
 38         fsm_.post(msg);
 39     
 40     }
 41 
 42     void Start () {
 43         fsm_.addState ("begin",beginState());
 44         fsm_.addState ("play",playState());
 45         fsm_.addState ("end",endState());
 46         fsm_.init("begin");
 47     }
 48 
 49     //登录的状态
 50     State beginState()
 51     {
 52         StateWithEventMap state = new StateWithEventMap();
 53         state.onStart += delegate
 54         {
 55             _view.begin.gameObject.SetActive(true);
 56         };
 57 
 58         state.onOver += delegate
 59         {
 60             _view.begin.gameObject.SetActive(false);
 61         };
 62 
 63         //接收到状态,打开第二个界面
 64         state.addEvent("begin","play");
 65 
 66 
 67         return state;
 68     }
 69 
 70 
 71     //游戏状态
 72     State playState()
 73     {
 74 
 75         //StateWithEventMap state = new StateWithEventMap();
 76 
 77         //异步系统,可以理解为一个异步处理工具
 78 
 79         //state 状态
 80         StateWithEventMap state = TaskState.Create(delegate
 81         {
 82             TaskWait tw = new TaskWait();
 83             //等待3秒钟
 84             tw.setAllTime(3f);
 85             //切换到
 86             return tw;
 87             //return new Task();
 88             }, fsm_,"end");
 89 
 90 
 91 
 92         state.onStart += delegate
 93         {
 94             _view.play.gameObject.SetActive(true);
 95         };
 96 
 97         state.onOver += delegate
 98         {
 99             _view.play.gameObject.SetActive(false);
100         };
101         return state;
102     }
103 
104 
105     //游戏结束状态
106     State endState()
107     {
108         StateWithEventMap state = new StateWithEventMap();
109         state.addEvent("end", "begin");
110 
111 
112 
113         state.onStart += delegate
114         {
115             _view.end.gameObject.SetActive(true);
116         };
117 
118         state.onOver += delegate
119         {
120             _view.end.gameObject.SetActive(false);
121         };
122 
123         return state;
124     }
125 
126     
127     void Update () {
128         
129     }
130 }
 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class View : MonoBehaviour {
 6 
 7 
 8     //开始界面
 9     public GameObject begin = null;
10     //游戏界面
11     public GameObject play = null;
12     //结束界面
13     public GameObject end = null;

有3个Panle的界面来回切换,在begin界面点击开始游戏按钮切换到play界面(3秒后切换到end界面),在end界面单机重新开始按钮回到begin界面

 

这个东西好像很深奥的样子。。。

 

posted @ 2018-01-26 08:48  MESGOD纯贱  阅读(899)  评论(0)    收藏  举报