本文提供了一个简单的角色行为状态机的实现,把角色状态类当成角色类的一个属性来实现,把角色的行为拆分成多个状态子类来实现,降低代码耦合度。

行为状态基类:只提供几个最基本的方法。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class BaseMode
{
    public GAME_MODE_TYPE mModeType;
    protected PlayerController mPlayer;

    //状态初始化
    public virtual void Init(PlayerController player)
    {
        mPlayer = player;
    }

    //状态开始
    public virtual void Begin (object[] mParams)
	{
        Debug.Log(mModeType.ToString() + "|Begin");
	}

    //状态更新
    public virtual void Update()
    {
        Debug.Log(mModeType.ToString() + "|Update");
    }

    //状态结束
    public virtual void End ()
	{
        Debug.Log(mModeType.ToString() + "|End");
    }

    //输入控制
    public virtual void InputHandle()
    {

    }
}

状态机子类:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class RunningMode : BaseMode
{
    public RunningMode()
    {
        mModeType = GAME_MODE_TYPE.Running;
    }

    public override void Begin(object[] mParams)
    {
        base.Begin(mParams);
    }

    public override void Update()
    {
        base.Update();
    }

    public override void End()
    {
        base.End();
    }

    public override void InputHandle()
    {

    }
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class DeathMode : BaseMode
{
    public DeathMode()
    {
        mModeType = GAME_MODE_TYPE.Death;
    }

    public override void Begin(object[] mParams)
    {
        base.Begin(mParams);
    }

    public override void Update()
    {
        base.Update();
    }

    public override void End()
    {
        base.End();
    }

    public override void InputHandle()
    {

    }
}


状态机配置表:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public static class GameModeConfig
{
    public static Dictionary
    
      CreatGameModeDict(PlayerController mPlayer)
    {
        var mDict = new Dictionary
     
      ()
        {
            { GAME_MODE_TYPE.Running,new RunningMode()},
            { GAME_MODE_TYPE.Death,new DeathMode()},
        };

        foreach (var item in mDict)
        {
            item.Value.Init(mPlayer);
        }

        return mDict;
    }
}

public enum GAME_MODE_TYPE
{
    Running,
    Death,
}

     
    

角色控制器
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class PlayerController : MonoBehaviour
{
    private BaseMode mCurGameMode;
    private Dictionary
     
       mGameModeDict = new Dictionary
      
       ();

    void Start()
    {
        //角色初始化应该在角色管理器初始化,此处仅作测试
        Init();
    }

    //角色控制器初始化
    void Init()
    {
        InitMode();
        ChangeMode(GAME_MODE_TYPE.Running);
    }

    void Update()
    {
        //当前状态更新
        if (mCurGameMode != null)
        {
            mCurGameMode.Update();
        }
    }

    //初始化状态
    public void InitMode()
    {
        mGameModeDict.Clear();
        mGameModeDict = GameModeConfig.CreatGameModeDict(this);
    }

    //切换状态
    public void ChangeMode(GAME_MODE_TYPE mType, object[] mParams = null)
    {
        //执行上个状态的结束
        if (mCurGameMode != null)
        {
            mCurGameMode.End();
        }

        mCurGameMode = mGameModeDict[mType];

        //执行当前状态的开始
        mCurGameMode.Begin(mParams);
    }

    //是否是该状态
    public bool IsGameMode(GAME_MODE_TYPE mType)
    {
        if (mCurGameMode != null && mCurGameMode.mModeType == mType)
        {
            return true;
        }

        return false;
    }

    #region 测试代码
    void OnGUI()
    {

        if (GUILayout.Button("ChangeRunning"))
        {
            ChangeMode(GAME_MODE_TYPE.Running);
        }

        if (GUILayout.Button("ChangeDeath"))
        {
            ChangeMode(GAME_MODE_TYPE.Death);
        }
    }
    #endregion
}

      
     




Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐