当前位置: 首页 > news >正文

app手机端电子商务网站功能静安网站建设公司

app手机端电子商务网站功能,静安网站建设公司,wordpress 内存溢出,黄冈网站推广代运营http://coder.beitown.com/archives/592 在之前的文章里介绍了一个基础U3D状态机框架#xff08;Unity3D游戏开发之状态流框架#xff09;即大Switch的枚举状态控制。这种方法虽然容易理解#xff0c;编程方法也相对简单#xff0c;但是弊端是当状态变得复杂之后#xff0… http://coder.beitown.com/archives/592 在之前的文章里介绍了一个基础U3D状态机框架Unity3D游戏开发之状态流框架即大Switch的枚举状态控制。这种方法虽然容易理解编程方法也相对简单但是弊端是当状态变得复杂之后或需要添加一种新的状态时会显得非常混乱并且难以下手。故我们需要引进一种更高级的状态机技术来避免这些问题。网上有一些讲述U3D-FSM状态机的文章但都不针对基础讲解而且大多带有冗余的与状态机不相关的代码基础不好的读者容易看不清FSM状态机的核心所在。这里针对网上的一些文章和代码做了一个整理意图使之简单易懂。 这里关于FSM有限状态机这类名词的解释这里就不再说明了感兴趣的朋友可以自己去百度下度娘链接本文只说重点。 首先是状态机基类State.cs /*** 状态基类 */ public class State[entity_type {public entity_type Target;//Enter state public virtual void Enter (entity_type entityType){}//Execute statepublic virtual void Execute (entity_type entityType){}//Exit statepublic virtual void Exit (entity_type entityType){}} 基类之所以设计成含有3个小的状态方法是因为通常在游戏中有些行为都只是在进入或退出某个状态时出现的并不会发生在通常的更新步骤中。这样设计就可以有效的将持续性调用语句和一次性调用语句有效的区分开来。举例发送技能时的特效有些是持续性而有些又是一次性的 接下来我们编写状态机代码来使直接的这个基类的各个方法运作起来 using UnityEngine; using System.Collections;public class StateMachine[entity_type {private entity_type m_pOwner;private State[entity_type m_pCurrentState;//当前状态private State[entity_type m_pPreviousState;//上一个状态private State[entity_type m_pGlobalState;//全局状态/*状态机构造函数*/public StateMachine (entity_type owner){m_pOwner owner;m_pCurrentState null;m_pPreviousState null;m_pGlobalState null;}/*进入全局状态*/public void GlobalStateEnter(){m_pGlobalState.Enter(m_pOwner);}/*设置全局状态*/public void SetGlobalStateState(State[entity_type GlobalState){m_pGlobalState GlobalState;m_pGlobalState.Target m_pOwner;m_pGlobalState.Enter(m_pOwner);}/*设置当前状态*/public void SetCurrentState(State[entity_type CurrentState){m_pCurrentState CurrentState;m_pCurrentState.Target m_pOwner;m_pCurrentState.Enter(m_pOwner);}/*Update*/public void SMUpdate (){if (m_pGlobalState ! null)m_pGlobalState.Execute (m_pOwner);if (m_pCurrentState ! null)m_pCurrentState.Execute (m_pOwner);}/*状态改变*/public void ChangeState (State[entity_type pNewState){if (pNewState null) {Debug.LogError (cant find this state);}//触发退出状态调用Exit方法m_pCurrentState.Exit(m_pOwner);//保存上一个状态 m_pPreviousState m_pCurrentState;//设置新状态为当前状态m_pCurrentState pNewState;m_pCurrentState.Target m_pOwner;//进入当前状态调用Enter方法m_pCurrentState.Enter (m_pOwner);}public void RevertToPreviousState (){//切换到前一个状态ChangeState (m_pPreviousState);}public State[entity_type CurrentState (){//返回当前状态return m_pCurrentState;}public State[entity_type GlobalState (){//返回全局状态return m_pGlobalState;}public State[entity_type PreviousState (){//返回前一个状态return m_pPreviousState;}} 这个状态机其实还不是最简的全局和上一个状态的相关部分都可以去掉但同时功能上就会被削减故这里将其保留。 现在状态基类和状态机类都有了我们可以开始编写游戏对象的独立状态类先编写游戏的总流程状态类这里命名为MainState.cs /*** 全局状态*/ public class MainState : State[Main {public static MainState instance;/*构造函数单例化*/public static MainState Instance(){if (instance null)instance new MainState();return instance;}public override void Enter(Main Entity){//这里添加进入此状态时执行的代码}public override void Execute(Main Entity){//这里添加持续此状态刷新代码}public override void Exit(Main Entity){//这里添加离开此状态时执行代码}}/*** Ready状态*/ public class MainState_Ready : State[Main {public static MainState_Ready instance;/*构造函数单例化*/public static MainState_Ready Instance(){if (instance null)instance new MainState_Ready();return instance;}public override void Enter(Main Entity){//这里添加进入此状态时执行的代码}public override void Execute(Main Entity){//这里添加持续此状态刷新代码//这里是重点 当满足某条件后 我们可以进行状态切换 执行如下代码 切换到 Run状态Entity.GetFSM().ChangeState(MainState_Run.Instance()); }public override void Exit(Main Entity){//这里添加离开此状态时执行代码} }/*** Run状态*/ public class MainState_Run : State[Main {public static MainState_Run instance;/*构造函数单例化*/public static MainState_Run Instance(){if (instance null)instance new MainState_Run();return instance;}public override void Enter(Main Entity){//这里添加进入此状态时执行的代码}public override void Execute(Main Entity){//这里添加持续此状态刷新代码//当满足某条件后 我们可以继续进行状态切换 执行如下代码 切换到 Over状态Entity.GetFSM().ChangeState(MainState_Over.Instance()); }public override void Exit(Main Entity){//这里添加离开此状态时执行代码} }/*** Over状态*/ public class MainState_Over : State[Main {public static MainState_Over instance;/*构造函数单例化*/public static MainState_Over Instance(){if (instance null)instance new MainState_Over();return instance;}public override void Enter(Main Entity){//这里添加进入此状态时执行的代码}public override void Execute(Main Entity){//这里添加持续此状态刷新代码//如之前两个状态类一样 同理 当满足一定状态后 可以切换回Ready状态Entity.GetFSM().ChangeState(MainState_Ready.Instance()); }public override void Exit(Main Entity){//这里添加离开此状态时执行代码} } 代码有点长主要是为了让大家能够看清楚如何进行一个状态的编写其实基类都是一样的都是重复内容。 这里我们看到除了定义一个全局的状态类之外我们还添加了Ready、Run、Over三个状态。重点注意一下Execute函数这里是状态切换的关键当带此状态绑定的对象Update时就在不停的执行Execute里的代码段当满足一定条件后即达成状态的切换。 这里我们看一下之前的状态机代码里的ChangeState方法就知道整个状态切换是如何工作的了: /*状态改变*/public void ChangeState (State[entity_type pNewState){if (pNewState null) {Debug.LogError (cant find this state);}//触发退出状态调用Exit方法m_pCurrentState.Exit(m_pOwner);//保存上一个状态 m_pPreviousState m_pCurrentState;//设置新状态为当前状态m_pCurrentState pNewState;m_pCurrentState.Target m_pOwner;//进入当前状态调用Enter方法m_pCurrentState.Enter (m_pOwner);} 可以看到当状态切换时会自动触发当前状态的Exit方法和目标状态的Enter方法。这样就完成了一整个状态的切换过程。 到这里整个有限状态机体系基本就算完工了剩下的是如何在Main里进行MainState类的创建及使用Main.cs代码如下: using UnityEngine; using System.Collections;public class Main : MonoBehaviour{StateMachine[Main m_pStateMachine;//定义一个状态机void Start () {m_pStateMachine new StateMachine[Main(this);//初始化状态机m_pStateMachine.SetCurrentState(MainState_Ready.Instance()); //设置一个当前状态m_pStateMachine.SetGlobalStateState(MainState.Instance());//设置全局状态}void Update (){ m_pStateMachine.SMUpdate();}/*返回状态机*/public StateMachine[Main GetFSM (){return m_pStateMachine;}} 写到这里我们整个状态机的框架及使用流程就基本结束了这里要注意几个问题 ①不要在SetCurrentState()方法调用前调用ChangeState()方法否则会出现null对象错误具体原因很简单看一下ChangeState()里的代码调用了哪些变量就知道了。 ②状态间的通信这个状态机其实还是有未完善的地方的目前状态间的通知是通过直接调用其他状态机的ChangeState()方法实现的这样势必要先获取该对象的脚本这个功能待完善吧。 ③在U3D里每个游戏对象初始化并调用Start()方法的时机是不一样的所以要注意开始游戏时不要直接进入开始状态而是要有一个等待态来让所有的游戏对象完成Start()方法后再调用这些对象的状态机。 另外多个状态机间的通信就像上文②中所述那样仅仅是通过调用ChangeState()方法来实现并不是非常完善所以暂时不做讲解以免误导大家待日后有较好解决方案再另行开篇。 此FSM状态机仅为一个雏形还有很多功能及优化要做但对于入门FSM有限状态机来说已经实现了其最主要的功能。不足之处欢迎大家提出讨论并帮助加以完善。 谢谢关注。 转载于:https://www.cnblogs.com/softimagewht/p/4042431.html
http://www.sadfv.cn/news/36693/

相关文章:

  • 做团购网站需要多少钱开发一个网站要多久
  • 营销型网站一套h5制作平台是什么意思
  • 怎么使用vs2017做网站最美情侣免费观看视频在线
  • div布局在线音乐网站设计华为官方手表网站
  • 成都专业网站营销99到家微网站什么做的
  • dw网站log怎么做wordpress主题商品展示
  • 计算机软件包含网站开发网站的服务器和空间
  • 安徽建站模板阿里云域名注册新人
  • 挖矿网站开发wordpress 性能
  • 杭州开发网站的公司哪家好wordpress个人博客前台模板
  • 青岛网站开发设计制作音乐排行榜html5
  • 药品网站建设存在的问题网站建设目标与期望
  • 制作网站找哪个公司好免费设计手写签名
  • 时尚大气的网站设计wordpress加载模板文件路径
  • 专做情侣装网站巴顿品牌设计
  • 网站服务器在哪租网站源码大全最新
  • 做自媒体都有什么网站百度付费推广有几种方式
  • 受欢迎的广州网站设计网站建设培训视频教程
  • 怎样设置自己的网站办公室装修费怎么做账
  • 宜昌企业网站建设哈尔滨网站开发方案
  • 手机网站快速建站有关网站建设合同
  • 哪个网站做黑色星期五订酒店活动东莞千寻电子科技有限公司
  • c2c网站建设策划书福州网站建设出格网络
  • 玉泉路做网站wordpress 数据库填写
  • 做网站快速排名公司注册核名查询官网
  • 大连企业招聘网站河北网络公司招聘
  • 北京如何建设网站淘客推广怎么样
  • 做化工的外贸网站都有什么如何申请免费域名做网站
  • 手机网站微信支付接口开发教程私人找人做网站
  • 网站规划与网页设计第四版电子书wordpress手机站模板