网站建设项目申请书,dw是什么软件,怎么查wordpress主题,google chrome网页版Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim#xff0c;尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的#xff0c;可知Mecanim将会是以后动画播放的趋势#xff01; Mecanim是一种基于状态机的结构#xff0c;不同的… Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim尽管眼下还支持之前的Animation。但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的可知Mecanim将会是以后动画播放的趋势 Mecanim是一种基于状态机的结构不同的状态表示一个动作或者多个动作融合或者一个子状态机。状态之间使用一种称为Transition的组件关联Transition中能够设定一些条件当在Transition“源状态”下。满足其条件之后。将自己主动跳转到Transition“目的状态”详细使用方法请參照Unity3D手冊Mecanim 在一些ARPG的游戏中比方 端游的DNF和闯关类的街机游戏连续按攻击键都会触发一套组合攻击。在这个过程中敌人通常是硬直状态的。并且组合攻击的最后一下通常是重击。这样做既添加了连击带来的爽快感。又促使玩家在攻击时採取一定的攻击策略。 Mecanim的状态机设计就非常方便的使开发人员实现了这一效果。 1.动画状态机 这里仅仅用4个动作描写叙述待命状态Idle。攻击1状态AtkSlice攻击2状态AtkStab攻击3状态AtkCleave3个攻击状态分别表示连续按下“普通攻击键”时触发的状态是有先后顺序关系的。即假设在待命状态下按下“攻击键”则进入攻击1状态。假设在攻击1状态下继续按下“攻击键”。则进入攻击2状态。假设不按下“攻击键”则回到待命状态。攻击2状态到攻击3状态同理。攻击3状态觉得是重击。即连击结束。回到待命状态。 状态图例如以下 我希望能以最少的代码和设置完毕这个功能。所以仅仅加入了一个状态机參数 ActionCMD如果 ActionCMD 1 为进入攻击状态參数 1在随意3种攻击状态下不再继续按下“攻击键”则回到待命状态即上图 3条白色Transition 2在待命。攻击1攻击2状态下继续按下“攻击键”则跳转到连击状态即下一个攻击状态。即上图3条蓝色Transition 2.代码实现 1状态机设置完毕之后要做的就是在代码中完毕对当前状态的推断以及对状态參数的设置。用以完毕动画状态机的切换 [csharp] view plaincopyprint? // 使用字符串变量保存当前状态。避免多处引用写错 private static readonly string IdleState BaseLayer.Idle; private static readonly string AtkSliceState BaseLayer.AtkSlice; private static readonly string AtkStabState BaseLayer.AtkStab; private static readonly string AtkCleave BaseLayer.AtkCleave; // 动画状态机參数Key private static readonly string ActionCMD ActionCMD; private Animator animator null; // 当前连击数即 玩家按下攻击键的次数 private int curComboCount 0; 2在Start() 中获取Animator组件引用 3在Update() 中依据当前状态和输入參数促使状态切换 [csharp] view plaincopyprint? void Update() { AnimatorStateInfo stateInfo this.animator.GetCurrentAnimatorStateInfo(0); if (!stateInfo.IsName(IdleState)) { // 每次设置完參数之后都应该在下一帧開始时将參数设置清空避免连续切换 this.animator.SetInteger(ActionCMD, 0); } if (stateInfo.IsName(AtkSliceState) (stateInfo.normalizedTime 0.6f) (this.curComboCount 2)) { // 当在攻击1状态下而且当前状态执行了0.6正交化时间即动作时长的60%而且用户在攻击1状态下又按下了“攻击键” this.animator.SetInteger(ActionCMD, 1); } if (stateInfo.IsName(AtkStabState) (stateInfo.normalizedTime 0.8f) (this.curComboCount 3)) { // 挡在攻击2状态下同理攻击1状态 this.animator.SetInteger(ActionCMD, 1); } if (Input.GetKeyUp(KeyCode.J)) { // 监听用户输入如果J键为攻击键 Attack(); } } [csharp] view plaincopyprint? void Attack() { AnimatorStateInfo stateInfo this.animator.GetCurrentAnimatorStateInfo(0); if (stateInfo.IsName(IdleState)) { // 在待命状态下按下攻击键进入攻击1状态。并记录连击数为1 this.animator.SetInteger(ActionCMD, 1); this.curComboCount 1; } else if (stateInfo.IsName(AtkSliceState)) { // 在攻击1状态下按下攻击键记录连击数为2切换状态在Update()中 this.curComboCount 2; } else if (stateInfo.IsName(AtkStabState)) { // 在攻击2状态下按下攻击键记录连击数为3切换状态在Update()中 this.curComboCount 3; } } 这里必须注意的是该。在Update() 二手0.6和0.8 分别低于目前的状态应该跳转到待机参数Exit Time这一次也正交 转载于:https://www.cnblogs.com/hrhguanli/p/4752966.html