格斗游戏角色控制之U3D状态机的编写

先简单介绍下状态机机的大概工作流程

转载自

一般格斗游戏都是由许多的角色肯定不可能一个脚本控制所有的角色所以每个角色肯定会有相应的角色控制脚本,每个角色都会有很多

转载自

个状态那么自己编写个状态机肯定是很有必要的,那么今天我就给大家分享个状态机玩玩,希望大家相互学习

转载自

状态机一般分为两部分 1.状态总管理 2.状态机接口

转载自

再给大家画个状态机的流程图

每个状态之间是互不影响的 都是靠状态机的管理所有的状态 进入下一个状态 退出当前状态

转载自

好吧上代码

转载自

状态机接口类

IState.cs

///////////////////////////////////////////////////////////////////////////// Author: sheen/// Date: 2015-5-20 13:47:19/// Description: 状态接口//////////////////////////////////////////////////////////////////////////public interface IState{/// <summary>/// 获取状态ID/// </summary>/// <returns></returns>int GetStateID();/// <summary>/// 进入状态回调此方法/// </summary>/// <param name="stateMachine">控制此状态的状态机</param>/// <param name="prevState">进入此状态的前状态</param>void OnEnter(GameStateMachine stateMachine, IState prevState, object param1, object param2);/// <summary>/// 离开状态时回调此方法/// </summary>/// <param name="nextState">离开此状态后的下一状态</param>void OnLeave(IState nextState, object param1, object param2);/// <summary>/// 每帧的OnUpdate方法回调/// </summary>void OnUpdate();/// <summary>/// 每帧的FixedUpdate回调/// </summary>void OnFixedUpdate();/// <summary>/// 每帧的LateUpdate回调/// </summary>void OnLateUpdate();}

转载自

状态管理脚本GameStateMachine.cs

转载自

using UnityEngine;using System.Collections;///////////////////////////////////////////////////////////////////////////// Author: sheen/// Date: 2015-5-20 13:46:51/// Description: 状态机//////////////////////////////////////////////////////////////////////////using System.Collections.Generic;using UnityEngine;public class GameStateMachine {/// <summary>/// 存储所有注册进来的状态。key是状态ID,,value是状态对象/// </summary>private Dictionary<int, IState> m_dictState;/// <summary>/// 当前运行的状态/// </summary>private IState m_curState;public GameStateMachine(){m_curState = null;m_dictState = new Dictionary<int, IState>();}/// <summary>/// 注册一个状态/// </summary>/// <param name="state">要注册的状态</param>/// <returns>成功返回true,如果此状态ID已存在或状态为NULL,则返回false</returns>public bool RegistState(IState state){if (null == state){Debug.LogWarning("StateMachine::RegistState->state is null");return false;}if (m_dictState.ContainsKey(state.GetStateID())){Debug.LogWarning("StateMachine::RegistState->state had exist! state id=" + state.GetStateID());return false;}m_dictState[state.GetStateID()] = state;return true;}/// <summary>/// 尝试获取一个状态/// </summary>/// <param name="iStateId"></param>/// <returns></returns>public IState GetState(int iStateId){IState ret = null;m_dictState.TryGetValue(iStateId, out ret);return ret;}/// <summary>/// 停止当前正在运行的状态, 切换到空状态/// </summary>public void StopState(object param1, object param2){if (null == m_curState){return;}m_curState.OnLeave(null, param1, param2);m_curState = null;}/// <summary>/// 取消状态的注册/// </summary>/// <param name="iStateID">要取消的状态ID</param>/// <returns>如果找不到状态或状态正在运行,则会返回false</returns>public bool CancelState(int iStateID){if (!m_dictState.ContainsKey(iStateID)){return false;}if (null != m_curState && m_curState.GetStateID() == iStateID){return false;}return m_dictState.Remove(iStateID);}public delegate void BetweenSwitchState(IState from, IState to, object param1, object param2);/// <summary>/// 在切换状态之间回调/// </summary>public BetweenSwitchState BetweenSwitchStateCallBack { get; set; }/// <summary>/// 切换状态/// </summary>/// <param name="iNewStateID">要切换的新状态</param>/// <returns>如果找不到新的状态,或者新旧状态一样,返回false</returns>public bool SwitchState(int iNewStateID, object param1, object param2){//状态一样,不做转换//if (null != m_curState && m_curState.GetStateID() == iNewStateID){return false;}IState newState = null;m_dictState.TryGetValue(iNewStateID, out newState);if (null == newState){return false;}IState oldState = m_curState;if (null != oldState){oldState.OnLeave(newState, param1, param2);}if (BetweenSwitchStateCallBack != null) BetweenSwitchStateCallBack(oldState, newState, param1, param2);m_curState = newState;if (null != newState){newState.OnEnter(this, oldState, param1, param2);}return true;}/// <summary>/// 获取当前状态/// </summary>/// <returns></returns>public IState GetCurState(){return m_curState;}/// <summary>/// 获取当前状态ID/// </summary>/// <returns></returns>public int GetCurStateID(){IState state = GetCurState();return (null == state) ? 0 : state.GetStateID();}/// <summary>/// 判断当前是否在某个状态下/// </summary>/// <param name="iStateID"></param>/// <returns></returns>public bool IsInState(int iStateID){if (null == m_curState){return false;}return m_curState.GetStateID() == iStateID;}/// <summary>/// 每帧的更新回调/// </summary>public void OnUpdate(){if (null != m_curState){m_curState.OnUpdate();}}/// <summary>/// 每帧的更新回调/// </summary>public void OnFixedUpdate(){if (null != m_curState){m_curState.OnFixedUpdate();}}/// <summary>/// 每帧的更新回调/// </summary>public void OnLateUpdate(){if (null != m_curState){m_curState.OnLateUpdate();}}}转载自

接下来写个写个使用示例

转载自

先写角色控制脚本

想做你的有缘人,可是我知道结果是惨淡的,但还是心存希望!

格斗游戏角色控制之U3D状态机的编写

相关文章:

你感兴趣的文章:

标签云: