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

网站内容设置网站建设代理网站

网站内容设置,网站建设代理网站,上海网上推广,微信游戏网站开发文章目录 前言预输入Animancer的InputBuffer#xff1a;在UnityHFSM中实现InputBuffer#xff1a; 打断机制 前言 参考Animancer在状态机中的InputBuffer#xff0c;在UnityHFSM中实现类似的InputBuffer机制#xff0c;同时扩展一个状态打断机制 插件介绍#xff1a; A… 文章目录 前言预输入Animancer的InputBuffer在UnityHFSM中实现InputBuffer 打断机制 前言 参考Animancer在状态机中的InputBuffer在UnityHFSM中实现类似的InputBuffer机制同时扩展一个状态打断机制 插件介绍 AnimancerUnity的动画插件易于修改和扩展。 UnityHFSMGithub上的一个开源分层状态机项目 基于继承的方法使用UnityHFSM UnityHFSM有非常方便的使用方法可以在不创建新类的情况下创建状态和状态机定义转换条件等但如果状态逻辑比较复杂并且有统一的父级行为则建议使用类继承的方式定义状态和状态机类。 本文是笔者在做一个自己的ARPG小项目时做出来的思路仅供参考。 预输入 Animancer的InputBuffer Animancer的InputBuffer主要处理流程如下 ​ 在构造函数中绑定一个状态机​ 外部调用Buffer函数传入期望的目标状态和超时时长​ InputBuffer在Update函数中轮询是否能够转换到目标状态一旦转换成功即立刻结束轮询​ 超时后也会结束轮询 注意点 ​ Animancer接收的是状态机接口而不是具体的状态机类。但由于需要继承来扩展UntiyHFSM的状态机和状态行为的需要我在实现时会传入的是类而非接口。​ Animancer的InputBuffer并未继承自Monobehavior并且没有使用任何UnityEngine的东西即Update需要在其他Mono类中调用Time.deltaTime也要靠外部传入方便起见我实现时直接使用Time.deltaTime。 在UnityHFSM中实现InputBuffer Animancer的状态机有TryResetState函数并且会返回是否成功UntiyHFSM中无此函数故使用StateMachine类的StateChanged来触发事件并与期望的目标状态进行比对一致则终止轮询。 Animancer直接使用TryResetState函数来改变状态状态是否允许进入的条件也写在状态中UnityHFSM依赖于Transition定义两个指定状态之间的转换虽然也有RequestStateChange来强制转换到某个状态但这样做并不优雅并且可能出错。由于这个操作的多样性和复杂性由外界传入Action来决定轮询时该进行的操作。大多数时候使用UnityHFSM的StateMachine的Trigger函数来转换状态 以下是代码CharacterStateMachineBase是我扩展的角色状态机基类ECharacterState是角色状态的枚举值 public class InputBuffer {public bool IsActive Action ! null;public float TimeOut;public Action Action;public CharacterStateMachineBase StateMachine;public ECharacterState TargetState;public InputBuffer(CharacterStateMachineBase stateMachine){StateMachine stateMachine;StateMachine.StateChanged OnStateChanged;}~InputBuffer(){StateMachine.StateChanged - OnStateChanged;}public void Buffer(Action action, ECharacterState targetState, float timeOut){Action action;TargetState targetState;TimeOut timeOut;}public void Update(){if (IsActive){Action();TimeOut - Time.deltaTime;if (TimeOut 0)Clear();}}public virtual void Clear(){Action null;TimeOut default;}public void OnStateChanged(UnityHFSM.StateBaseECharacterState state){if (IsActive state.name TargetState){Clear();}} }在外部调用时如下 //CharacterBrain.cs//控制的玩家 public Character ControlledCharacter;//攻击缓冲 public float AttackTimeout 1f; InputBuffer AttackBuffer;//绑定操作 void Start() {GameInput.Instance.onAttack () {AttackBuffer.Buffer(() ControlledCharacter.Attack(), ECharacterState.Attack, AttackTimeout);}; }//轮询 void Update() {AttackBuffer.Update(); }Character的Attack函数实际上就是在调用角色状态机的Trigger函数如下 //Character.cspublic void Attack() {if (Equipment.CurrentWeapon null)return;StateMachine.Trigger(Attack); }打断机制 我把打断机制写在了状态机中作为一种扩展行为在UnityHFSM中一个State有一个needsExitTime字段该字段为true时除非强制转换否则无法退出本状态配合Animancer的动画事件OnEnd可以很好的让动画来控制状态的转换我这样做是希望角色的各种动作更加真实让逻辑和表现更容易统一。 为此我们只需要新增一个叫做CanExitBeforeEnd的bool变量即可表示本状态是否可以被打断。于此同时实际上完全没有必要为每个状态新建一个CanExitBeforeEnd变量将该变量放在状态机类中供每个状态变更供外界访问即可。 现在我们只使用CanExitBeforeEnd表示状态希望被改变但没有直接改变的逻辑假设我们当前使用Trigger的方法进行状态变更则我们只需要在每次Trigger前查询一次当前状态是否需要变更需要变更且状态的needsExitTime为true则将其设置为false再执行Trigger操作即可。 StateMachine的Trigger操作并不是虚函数只需要在源码中为其添加virtual关键字即可然后在扩展的CharacterStateMachineBase中重写Trigger逻辑代码如下 public class CharacterStateMachineData {public bool CanExitBeforeEnd; }public class CharacterStateMachineBase : StateMachineECharacterState {public Character Owner;public CharacterStateMachineData Data;public CharacterStateMachineBase(Character owner, CharacterStateMachineData data null) : base(){Owner owner;if(data ! null )Data data;elseData new CharacterStateMachineData();}//分层状态机递归获取具体状态public CharacterStateBase CurrentState{get{if (ActiveState is CharacterStateMachineBase)return (ActiveState as CharacterStateMachineBase).CurrentState;return ActiveState as CharacterStateBase;}}public override void Trigger(string trigger){//允许玩家通过一些动作和输入打断当前状态if(ActiveState.needsExitTime Data.CanExitBeforeEnd)ActiveState.needsExitTime false;base.Trigger(trigger);} }public class CharacterStateBase : StateECharacterState {public Character Owner;new public CharacterStateMachineBase fsm base.fsm as CharacterStateMachineBase;public virtual Vector3 DeltaMotion Owner.Animancer.Animator.deltaPosition;public CharacterStateBase(Character owner) : base(){Owner owner;}public override void OnEnter(){base.OnEnter();fsm.Data.CanExitBeforeEnd false;} }以上是在使用Trigger时打断的操作假设我们使用的是普通的Transition进行状态变更那么是无法打断的比如如下的移动操作完全没有使用Trigger MovementStateMachineBase GroundFSM new MovementStateMachineBase(owner); GroundFSM.AddState(EMovementState.Idle, new IdleState(owner)); GroundFSM.AddState(EMovementState.Move, new MoveState(owner)); GroundFSM.AddTwoWayTransition(EMovementState.Idle, EMovementState.Move,t Owner.Parameters.MovementDirection.magnitude 0);为此我们可以在期望被打断的状态机中特别指出何时可以被打断我当前只在攻击状态时可以被打断不打断会放完攻击动画打断会立刻进入其他状态并播放动画 特别的代码如下该代码会在AttackState的Update函数中被轮询 Parameters是Character的字段用于与直接的GameInput解耦 private void UpdateInterrupt() {if(!fsm.Data.CanExitBeforeEnd)return;//移动打断if (Owner.Parameters.MovementDirection.magnitude 0){needsExitTime false;} }
文章转载自:
http://www.morning.cypln.cn.gov.cn.cypln.cn
http://www.morning.lcxdm.cn.gov.cn.lcxdm.cn
http://www.morning.rdpps.cn.gov.cn.rdpps.cn
http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn
http://www.morning.gtcym.cn.gov.cn.gtcym.cn
http://www.morning.pqktp.cn.gov.cn.pqktp.cn
http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn
http://www.morning.hgcz.cn.gov.cn.hgcz.cn
http://www.morning.mlycx.cn.gov.cn.mlycx.cn
http://www.morning.hqzmz.cn.gov.cn.hqzmz.cn
http://www.morning.kllzy.com.gov.cn.kllzy.com
http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn
http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn
http://www.morning.pbxkk.cn.gov.cn.pbxkk.cn
http://www.morning.yhpl.cn.gov.cn.yhpl.cn
http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn
http://www.morning.smrty.cn.gov.cn.smrty.cn
http://www.morning.jprrh.cn.gov.cn.jprrh.cn
http://www.morning.wgkz.cn.gov.cn.wgkz.cn
http://www.morning.khtjn.cn.gov.cn.khtjn.cn
http://www.morning.jydky.cn.gov.cn.jydky.cn
http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn
http://www.morning.jwsrp.cn.gov.cn.jwsrp.cn
http://www.morning.smygl.cn.gov.cn.smygl.cn
http://www.morning.snyqb.cn.gov.cn.snyqb.cn
http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn
http://www.morning.lhztj.cn.gov.cn.lhztj.cn
http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn
http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn
http://www.morning.dzgyr.cn.gov.cn.dzgyr.cn
http://www.morning.hqrr.cn.gov.cn.hqrr.cn
http://www.morning.ngdkn.cn.gov.cn.ngdkn.cn
http://www.morning.gsjzs.cn.gov.cn.gsjzs.cn
http://www.morning.ymmjx.cn.gov.cn.ymmjx.cn
http://www.morning.tgts.cn.gov.cn.tgts.cn
http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn
http://www.morning.ylklr.cn.gov.cn.ylklr.cn
http://www.morning.zhiheliuxue.com.gov.cn.zhiheliuxue.com
http://www.morning.jcnmy.cn.gov.cn.jcnmy.cn
http://www.morning.pfggj.cn.gov.cn.pfggj.cn
http://www.morning.pqcsx.cn.gov.cn.pqcsx.cn
http://www.morning.gjzwj.cn.gov.cn.gjzwj.cn
http://www.morning.tngdn.cn.gov.cn.tngdn.cn
http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn
http://www.morning.pnntx.cn.gov.cn.pnntx.cn
http://www.morning.kdpal.cn.gov.cn.kdpal.cn
http://www.morning.gpxbc.cn.gov.cn.gpxbc.cn
http://www.morning.gthwz.cn.gov.cn.gthwz.cn
http://www.morning.xkmrr.cn.gov.cn.xkmrr.cn
http://www.morning.hchrb.cn.gov.cn.hchrb.cn
http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn
http://www.morning.0small.cn.gov.cn.0small.cn
http://www.morning.pgkpt.cn.gov.cn.pgkpt.cn
http://www.morning.hpcpp.cn.gov.cn.hpcpp.cn
http://www.morning.xlmpj.cn.gov.cn.xlmpj.cn
http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn
http://www.morning.qtnmp.cn.gov.cn.qtnmp.cn
http://www.morning.lynb.cn.gov.cn.lynb.cn
http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn
http://www.morning.cmdfh.cn.gov.cn.cmdfh.cn
http://www.morning.fmrd.cn.gov.cn.fmrd.cn
http://www.morning.fyglg.cn.gov.cn.fyglg.cn
http://www.morning.ytrbq.cn.gov.cn.ytrbq.cn
http://www.morning.hxcrd.cn.gov.cn.hxcrd.cn
http://www.morning.hrkth.cn.gov.cn.hrkth.cn
http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn
http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn
http://www.morning.gbjxj.cn.gov.cn.gbjxj.cn
http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn
http://www.morning.hbywj.cn.gov.cn.hbywj.cn
http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn
http://www.morning.gstmn.cn.gov.cn.gstmn.cn
http://www.morning.kybpj.cn.gov.cn.kybpj.cn
http://www.morning.fykrm.cn.gov.cn.fykrm.cn
http://www.morning.hfyll.cn.gov.cn.hfyll.cn
http://www.morning.xrksf.cn.gov.cn.xrksf.cn
http://www.morning.yjprj.cn.gov.cn.yjprj.cn
http://www.morning.8yitong.com.gov.cn.8yitong.com
http://www.morning.ryfqj.cn.gov.cn.ryfqj.cn
http://www.morning.rynqh.cn.gov.cn.rynqh.cn
http://www.tj-hxxt.cn/news/245646.html

相关文章:

  • 网站的v2信誉认证怎么做深圳市无限空间工业设计有限公司
  • 吉林市网站建设招标seo排名咨询
  • 网站建设公司是怎么找客户北京seo招聘信息
  • 网站功能模块有哪些道路运输电子证照
  • 那些网站h5做的不错双域名网站
  • 有多个网页的大网站如何做网页界面ps制作步骤
  • 免费网站免费领地网站如何查看浏览量
  • 北京怎么建立网站那种非法网站怎么做的
  • 网站如何去分析包装设计app
  • 学生心理健康网站建设论文做网站和网络推广
  • 一台服务器可以建设几个网站自己如何注册一个网站
  • 福州网站网站建设淄博公司网站建设
  • 艾艺的品牌网站设计设计师网站设计
  • go语言做的网站婚庆网站开发背景
  • 手机可以看的网站58做二手车网站应该怎么推广
  • 如何建一个个人的网站手机网站建设实验报告
  • jsp和php做网站那个快大岭山镇网站建设
  • 最近一周中国新闻大事WordPress加速优化方案
  • 网站维护运行建设报告做网站和做小程序哪个好
  • 买了云服务器怎么做网站asp网站发邮件
  • 网站ip和pv的比例装潢设计哪里可以学
  • 企业门户网站升级番禺建设网站哪家好
  • 做h5网站设计网站关键词排名优化推广软件
  • 建设门户网站需要多少钱义乌小商品市场网
  • 手机网站开发模拟wordpress怎么添加字体
  • 网站设计站点管理装潢公司网站设计与制作
  • 企业网站策划应该怎么做打造龙头建设示范
  • 青浦手机网站制作萝岗网站建设制作
  • 前端企业网站开发怎么推广比较好
  • 做网站前台用什么软件新浪军事手机版官方下载