状态机用法

作者: 我家菇凉 | 来源:发表于2019-08-14 21:26 被阅读0次

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    //状态抽象类 -- 由各个状态继承该状态类,衍生出各种状态

    public abstract class StateBase  {

        //当前状态所对应的的ID号 --

        //比如继承自该状态衍生出来的IDLE状态,ID为2,则在判断是否为该状态时提供依据

        abstract public int ID { get; }

        //抽象函数,由继承自该类的其他状态重写

        //在第一次进入的时候运行该函数,该函数在改状态第一次运行的时候,只运行一次

        abstract public void Enter(StateEventData stateData);

        //当状态一直停留在该状态的时候,每帧都会运行一次该函数

        abstract public void Execute(StateEventData stateData);

        //当该状态运行完毕,离开之前,运行一次该函数

        abstract public void Exit(StateEventData stateData);

    }



    //*****************************************************************************************//

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    /// <summary>

    /// 单例

    /// </summary>

    /// <typeparam name="T"></typeparam>

    public class SingleTon<T> where T :class ,new()

    {

        private static T instance;

        public static T GetT

        {

            get

            {

                if (instance == null)

                {

                    instance = new T();

                }

                return instance;

            }

        }

    }


    //**********************

    /// <summary>

    /// 单例

    /// </summary>

    /// <typeparam name="T"></typeparam>

    public class SingleTon<T> where T :class ,new()

    {

        private static T instance;

        public static T GetT

        {

            get

            {

                if (instance == null)

                {

                    instance = new T();

                }

                return instance;

            }

        }

    }

    //*****************************************************************************************//

    /// <summary>

    /// 状态执行机

    /// </summary>

    public class FsmCore

    {

        //当前状态

        public StateBase CurrentState = null;

        ///上一个状态

        public StateBase PrevState = null;

        //携带的数据体/内容

        public StateEventData Data = null;

        //设置状态机题主运行的标志位

        //是否让该状态机停止

        public bool IsStop = false;

        public StateBase GetStateByPlayerBattle(PlayerBattle plBattleIndex)

        {

            switch (plBattleIndex)

            {///让每个状态对应自己的状态类

                case PlayerBattle.Idle:

                    return new Stationary_state();

                case PlayerBattle.Wath:

                    return new Random_movement_state();

                case PlayerBattle.Run:

                    return new Follow_state();

                case PlayerBattle.Attack:

                    return new Attack_state();

                case PlayerBattle.Death:

                    return new Death_state();

                default:

                    return new Stationary_state();

            }

        }

        //改变当前状态机运行的状态

        public void ChangeState(

            //当前要变成的具体状态

            StateBase state,

            //当前状态所携带的数据

            StateEventData paramData,

            //上一个状态推出时应该携带的数据

            StateEventData prevData)

        {

            if (paramData == null && state.ID == CurrentState.ID)

            {//如果数据为空  如果当前状态等于当于当前状态

                return;

            }

            if (PrevState != null)

            {

                PrevState.Exit(paramData);//传进来的上一个数据给上一个数据

            }

            PrevState = CurrentState;//当前状态赋值给上一个状态

            CurrentState = state;//当前状态变成当前状态

            Data = paramData;//传进来的数据附给现在的数据

            CurrentState.Enter(Data);

        }

        public void UpdateState()

        {

            if (CurrentState == null) { return; }

            else

            {

                CurrentState.Execute(Data);

            }

        }

        public void Start(StateBase state, StateEventData paramData, StateEventData prevData)

        {

            ChangeState(state, paramData, prevData);

        }

    }

    public enum PlayerBattle

    {

        Idle,

        Wath,

        Run,

        Attack,

        Death

    }

    相关文章

      网友评论

        本文标题:状态机用法

        本文链接:https://www.haomeiwen.com/subject/awqnjctx.html