Unity3D游戏开发

状态机用法

2019-08-14  本文已影响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

}

上一篇下一篇

猜你喜欢

热点阅读