moba类游戏开发日志(五)角色状态机的设计及角色技能动作/特效的制作
在unity中,一个Animator都需要设计对应的Controller,这边的Controller在我的理解中就是对于的一组状态机关系的描述
这里我举一个从Animator播放从“idle”状态到“wak”状态设计的例子
首先我们新建一个state,然后在右侧inspector界面便可以设置状态名及motion播放的动画

如上面的步骤一样我们再建一个walk状态,这样子我们便得到了现在想要的两个动画状态
接下来为了实现状态跳转,我们从idle向walk连一条线,点击线后我们便可以预览状态平滑切换的动画,但是光这样还不行,因为我们没有给状态切换设置条件,在参数界面添加需要的参数之后,我们选中一条状态跳转的transition,之后便可以在右侧设置状态跳转需要满足的条件

具体什么时候设置这个参数为触发时的值这个就看自己需求了,一般我们待机到移动的触发条件就是角色动起来,那么便可以通过摇杆的相关api去修改状态跳转的参数,简单的实现可以参考下面的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using HedgehogTeam.EasyTouch; public class cleric_idletowalk : MonoBehaviour { private Animator anim; // Start is called before the first frame update void Start() { anim = GetComponent<Animator>(); } // Update is called once per frame void Update() { // if (anim == null) return; AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0); if(ETCInput.GetAxisPressedUp("Vertical") || ETCInput.GetAxisPressedDown("Vertical") || ETCInput.GetAxisPressedLeft("Horizontal") || ETCInput.GetAxisPressedRight("Horizontal")) { if(stateInfo.IsName("Idle")) { anim.Play("walk"); anim.SetBool("isWalk",true); } else { if(anim.GetCurrentAnimatorStateInfo(0).normalizedTime>=1.0) anim.Play("walk",0,0f); } } else { if(stateInfo.IsName("walk")) { anim.Play("Idle"); anim.SetBool("isWalk",false); // anim.CrossFade("Idle",0.2f); } else { if(anim.GetCurrentAnimatorStateInfo(0).normalizedTime>=1.0) anim.Play("Idle",0,0f); } } } }
对于按下按钮释放技能播放相关动画其实也是一样的道理,只不过这边我们触发的条件变成了button的一个onClick()事件,我们在button控件下的点击event下添加对于的角色及角色释放技能的函数即可,具体添加是在inspector界面还是代码逻辑层面这个就随意吧,button或者任意其他UGUI的控件的onclick trigger设置可参考下图

角色的技能释放动作是实现了,之后就是释放技能时的粒子特效该如何实现了,这里我采用的是在Animator对应技能状态的timeline上设置event的实现方法
我们将指针移动到你觉得适合播放特效的时间位置,然后在那个时间点添加一个event即可

添加完事件之后我们只需在角色的控制脚本里面添加一个与上面event的名字一样的函数,在函数中控制播放粒子特效即可
发表评论