Practice

public interface IState  

  {       

        string Name { get; }         

     string Tag { set; get; }       

      IStateMachine Parent { get; set; }     

       float Time { get; }      

     ListTransitons { get; }        

        void EnterCallback(IState prev);        

void ExitCallback(IState next);     

   void UpdateCallback(float deltaTime);       

 void LateUpdatecallback(float deltaTime);       

 void FixedUpdateCallback(float deltaTime);      

void AddTransiton(ITransition t);   

 }


public interface IStateMachine

 {

IState CurrentState { get; }

IState DefaultState {set;get; }

void AddState(IState state);

void RemoveState(IState state);

IState GetStateWithTag(string tag);

}



public interface ITransition

 {   

IState From { get; set; }     

   IState To {get; set;}        

string Name { get; set; }      

bool TransitionCallback();    // 过渡时的回调,返回true过渡结束 返回false继续进行过渡  

bool ShouldBengin();    }// 能否开始过渡


实例化FSM

public delegate void LOStateDelegate(); 

public delegate void LOStateDelegateState(IState state);    //Enter,Exit的委托

public delegate void LOStateDelegateFloat(float  f);//Update  LateUpdate  FixedUpdate的委托

    public class LOState : IState  

  {       

 public event LOStateDelegateState OnEnter;       

 public event LOStateDelegateState OnExit;       

 public event LOStateDelegateFloat OnUpdate;        

public event LOStateDelegateFloat OnLateUpdate;       

 public event LOStateDelegateFloat OnFixedUpdate;             

   private string _name;     

   private string _tag;        

private IStateMachine _parent;       

 private float _timer;       

 private List_transitons;//状态过度       

 public string Name        {            get {return _name;}        }       

 public string Tag        {        get { return _tag; }        set { _tag = value;}        }      

public IStateMachine Parent {            get {                return _parent;            }            set {                _parent = value;            }        }

  public float Time {            get { return _timer; }        }           

   public ListTransitons        { get { return _transitons; } }     

   public LOState(string name)        {            _name = name;            _transitons = new List();}

public void AddTransiton(ITransition t)

 {

             if (t!=null&&!_transitons.Contains(t))

            {

                 _transitons.Add(t);

              }

}

public virtual void EnterCallback(IState prev)

{


        _timer = 0f;

       if (OnEnter!=null)

      {

             OnEnter(prev);

     }

}

public virtual void ExitCallback(IState next)

{

             _timer = 0f;

        if (OnExit!=null)

        {

           OnExit(next);

       }

}

public virtual void UpdateCallback(float deltaTime)

{

              _timer += deltaTime;

            if (OnUpdate!=null)

         {

              OnUpdate(deltaTime);

        }

}

public  virtual void LateUpdatecallback(float deltaTime)

{

             if (OnLateUpdate != null)

            {

             OnLateUpdate(deltaTime);

            }

}

public virtual void FixedUpdateCallback(float deltaTime)

{

              if (OnFixedUpdate!=null)

             {

               OnFixedUpdate(deltaTime);

           }

}

}



public class LOStateMachine : LOState, IStateMachine  

  {      

         private IState _currentState;      

          private IState _defaultState;      

           private List_state;//保存状态的容器       

            private bool _isTransition = false;//是否正在过度       

               private ITransition _t;       

            public IState CurrentState        {            get { return _currentState; }        }        

            public IState DefaultState       

            {            get { return _defaultState; }          

                       set {               

                              if (_state.Contains(value))              

                              {                    AddState(value);                    _defaultState = value;                }              }       

           }       

 public LOStateMachine(string name,IState defaultState):base(name)       

 {           

        _state = new List();            

     _defaultState = defaultState;      

  }      

 public void AddState(IState state)    

    {          

                 if (state!=null&&!_state.Contains(state))          

                {                _state.Add(state);                state.Parent = this;              

              if (_defaultState==null)              

                  {                    _defaultState = state;                }                            }        

}       

 public void RemoveState(IState state)        

{            //在状态机运行的过程中,不能删除当前状态           

            if (_currentState==state)          

             {                return;            }          

        if (state!=null&&!_state.Contains(state))            

             {                _state.Remove(state);              

                                 state.Parent = null;              

                    if (_defaultState == state)               

                {                    _defaultState = (_state.Count >= 1) ? _state[0] : null;                }            }       

 }        

public IState GetStateWithTag(string tag)   

     {            return null;        }       

//每帧判断是否需要过渡,如果需要过渡遍历当前状态的过渡条件列表是否达成,达成就实现过渡

 public override void UpdateCallback(float deltaTime)     

  {           

       if (_isTransition)         //是否正在过渡

                 {               

                      if (_t.TransitionCallback())               //判断过渡是否结束

                      {                 

                             DoTransition(_t);                    //如果过度结束了 就执行过渡

                           _isTransition = false;             

                      }                

                      return;           

                 }           

      base.UpdateCallback(deltaTime);          

         if (_currentState == null)         

        {                _currentState = _defaultState;            }           

           List<ITransition> ts=_currentState.Transitions;

         int count = _currentState.Transitons.Count;

      for (int i = 0; i < CurrentState.Transitons.Count; i++)

       {

             ITransition t = ts[i];

             if (t.ShouldBengin())

            {

              _isTransition = true;

              _t = t;

             return;

           }

    }

     _currentState.UpdateCallback(deltaTime);    //如果没有满足过渡条件 那就执行当前状态的回调Update

}

public override void LateUpdatecallback(float deltaTime)

{

   base.LateUpdatecallback(deltaTime);

  _currentState.LateUpdatecallback(deltaTime);

}

public override void FixedUpdateCallback(float deltaTime)

{

   base.FixedUpdateCallback(deltaTime);

  _currentState.FixedUpdateCallback(deltaTime);

}

private void DoTransition(ITransition t)

{

      _currentState.ExitCallback(t.To);

    _currentState = t.To;

   _currentState.EnterCallback(t.From);

}

}



public delegate bool LOTransitionDelegate();    

public class LOTransition : ITransition    

{       

 public event LOTransitionDelegate OnTranesiton;      

  public event LOTransitionDelegate OnCheck;        

private IState _from;      

  private IState _to;        

private string _name;             

   public IState From      

  {            get            {                return _from;            }            set            {                _from = value;            }        }        public IState To     

   {            get            { return _to; }            set { _to = value; }        }       

 public string Name        {            get            {                return _name;            }            set { _name = value; }        }        public LOTransition(string name,IState fromState,IState toState)    

    {            _name = name;            _from = fromState;            _to = toState;        }     

   ////// 检测状态过度是否结束

///public bool TransitionCallback()    

    {            

if (OnTranesiton != null)         

   {                return OnTranesiton();            }            return true;        }    

    public bool ShouldBengin()       

 {           

 if (OnCheck != null)        

    {                return OnCheck();            }       

     return false;        }    

    }



















最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容