Unity角色行为状态机框架设计

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

行为状态基类:只提供几个最基本的方法。
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
}

       
       
      
      




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值