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的名字一样的函数,在函数中控制播放粒子特效即可