16.Unity3D商业游戏源码研究-变身吧主公-战斗-IState,StateMachine
来源:互联网 发布:c#,json的类子 编辑:程序博客网 时间:2024/05/27 21:03
本文固定链接:http://blog.csdn.net/u013108312/article/details/70313116
using UnityEngine;using System.Collections;public interface IState { /// <summary> /// 获取这个状态机的状态 /// </summary> /// <returns></returns> uint GetStateID(); /// <summary> /// 进入这个状态 /// </summary> /// <param name="machine">状态机</param> /// <param name="prevState">上一个状态</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> void OnEnter(StateMachine machine, IState prevState, object param1, object param2); /// <summary> /// 离开当前这个状态 /// </summary> /// <param name="nextState">下一个要进入的状态</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> void OnLeave(IState nextState, object param1, object param2); void OnUpate(); void OnFixedUpdate(); void OnLeteUpdate();}
using UnityEngine;using System.Collections;using System.IO;using System.Collections.Generic;public class StateMachine { /// <summary> /// 所有的状态集合 /// </summary> private Dictionary<uint, IState> mStateDic = null; /// <summary> /// 当前状态 /// </summary> private IState mCurrentState = null; /// <summary> /// 当前状态 /// </summary> public IState CurrentState { get { return mCurrentState; } } /// <summary> /// 当前状态id /// </summary> public uint CurrentID { get { return mCurrentState == null ? 0 : mCurrentState.GetStateID(); } } public StateMachine() { mStateDic = new Dictionary<uint, IState>(); mCurrentState = null; } /// <summary> /// 注册一个状态 /// </summary> /// <param name="state">状态对象</param> /// <returns>成功还是失败</returns> public bool RegisterState(IState state) { if (state == null) { Debug.LogError("StateMachine.RegisterState state is Null !"); return false; } if (mStateDic.ContainsKey(state.GetStateID())) { Debug.LogError("StateMachine.RegisterState mStateDic hava this key key = " + state.GetStateID()); return false; } mStateDic.Add(state.GetStateID(), state); return true; } /// <summary> /// 移除一个状态 /// </summary> /// <param name="stateId">状态Id</param> /// <returns>当状态不存在或者状态正在运行那么返回失败</returns> public bool RemoveState(uint stateId) { if (!mStateDic.ContainsKey(stateId)) { return false; } if (mCurrentState != null && mCurrentState.GetStateID() == stateId) { return false; } mStateDic.Remove(stateId); return true; } /// <summary> /// 获取一个状态 /// </summary> /// <param name="stateId">状态id</param> /// <returns></returns> public IState GetState(uint stateId) { IState stste = null; mStateDic.TryGetValue(stateId, out stste); return stste; } /// <summary> /// 停止当前状态 /// </summary> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> public void StopState(object param1,object param2) { if (null == mCurrentState) { return; } mCurrentState.OnLeave(null, param1, param2); mCurrentState = null; } /// <summary> /// 切换状态的回调 /// </summary> public BetweenSwitchState BetweenSwitchStateCallBack = null; /// <summary> /// 切换状态回调委托 /// </summary> /// <param name="from">当前状态</param> /// <param name="to">要跳转的状态</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> public delegate void BetweenSwitchState(IState from, IState to, object param1, object param2); /// <summary> /// 切换状态 /// </summary> /// <param name="newSatetId">要切换的状态id</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> /// <returns>如果不存在这个状态或者当前状态等于要切换的状态 那么返回失败</returns> public bool SwitchState(uint newSatetId, object param1, object param2) { if (mCurrentState != null && mCurrentState.GetStateID() == newSatetId) { return false; } IState newState = null; mStateDic.TryGetValue(newSatetId, out newState); if (newState == null) { return false; } if (mCurrentState != null) { mCurrentState.OnLeave(newState, param1, param2); } IState oldState = mCurrentState; mCurrentState = newState; if (BetweenSwitchStateCallBack != null) { BetweenSwitchStateCallBack(oldState, mCurrentState, param1, param2); } newState.OnEnter(this, oldState, param1, param2); return true; } /// <summary> /// 判断当前状态是否是摸个状态 /// </summary> /// <param name="stateId">状态Id</param> /// <returns>是?不是</returns> public bool IsInState(uint stateId) { return mCurrentState == null ? false : mCurrentState.GetStateID() == stateId; } public void OnUpate() { if (mCurrentState != null) { mCurrentState.OnUpate(); } } public void OnFixedUpdate() { if (mCurrentState != null) { mCurrentState.OnFixedUpdate(); } } public void OnLeteUpdate() { if (mCurrentState != null) { mCurrentState.OnLeteUpdate(); } }}
0 0
- 16.Unity3D商业游戏源码研究-变身吧主公-战斗-IState,StateMachine
- 17.Unity3D商业游戏源码研究-变身吧主公-战斗-StateBase,PlayerBase
- 18.Unity3D商业游戏源码研究-变身吧主公-战斗-MainPlayerStateAttack
- 19.Unity3D商业游戏源码研究-变身吧主公-战斗-MainPlayerStateHit
- 20.Unity3D商业游戏源码研究-变身吧主公-战斗-MainPlayerStateIdle
- 21.Unity3D商业游戏源码研究-变身吧主公-战斗-MonsterPlayerState,Attack,Hit,Idle
- 1.Unity3D商业游戏源码研究-变身吧主公-ResourcesMgr
- 2.Unity3D商业游戏源码研究-变身吧主公-SceneMgr
- 3.Unity3D商业游戏源码研究-变身吧主公-SceneBase
- 4.Unity3D商业游戏源码研究-变身吧主公-UIBase
- 5.Unity3D商业游戏源码研究-变身吧主公-TestSeneceMgr
- 6.Unity3D商业游戏源码研究-变身吧主公-SceneLogin
- 7.Unity3D商业游戏源码研究-变身吧主公-SceneLoding
- 8.Unity3D商业游戏源码研究-变身吧主公-PanelMgr
- 9.Unity3D商业游戏源码研究-变身吧主公-PanelBase
- 10.Unity3D商业游戏源码研究-变身吧主公-PanelPlayInfo
- 11.Unity3D商业游戏源码研究-变身吧主公-SceneChat
- 12.Unity3D商业游戏源码研究-变身吧主公-层级管理-LayerMgr
- 换工作有感
- 巧用CAS解决数据一致性问题
- 解决手机上页面返回但是页面js没有刷新的痛点(BFcache)
- flume
- meta总结
- 16.Unity3D商业游戏源码研究-变身吧主公-战斗-IState,StateMachine
- 测试套件edit里的名称含义
- Maven中使用本地JAR包
- 江城的面试-----不放弃
- 利用DBLink+JOB实现两个Oracle数据库之间的数据同步
- 天局
- opencv 图像直方图绘制
- Angular2源码解读之Component
- 字符串中改变任意字的颜色和字体大小