标签:积分 code 引入 yield eid 资源 小游戏 www 复杂
Github项目地址:Hero - SouthBegonia
游戏试玩下载(提取码:wekp):
本例中的Hero攻击动作分为地面三连击和空中三连击,实现多连击的过渡,关键在于动画判定、切换条件、切换时机
//创建动画机状态信息器
private AnimatorStateInfo stateInfo;
//Update内更新取得当前动画信息
stateInfo = animator.GetCurrentAnimatorStateInfo(0);
//判断正在播放的动画是否为attack_1,返回bool
stateInfo.IsName("attack_1")
//表示当前动画已经播放了多少进度,float型,范围 (0~1],例如0.5表示播放了一半
stateInfo.normalizedTime
//项目示例:
//判断当某一攻击动画播放完毕,则重置攻击参数attack为0
if ((stateInfo.IsName("attack_1") || stateInfo.IsName("attack_2") || stateInfo.IsName("attack_3")) && stateInfo.normalizedTime > 1f)
{
count = 0;
animator.SetInteger("attack", count);
//...
}
//项目示例:
//多连击切换:
if (count == 0)
{
//攻击阶段一: idle ---> attack_1
count = 1;
animator.SetInteger("attack", count);
}
else if (stateInfo.IsName("attack_1") && count == 1)
{
//攻击阶段二: attack_1 ---> attack_2
count = 2;
animator.SetInteger("attack", count);
}
else if (stateInfo.IsName("attack_2") && count == 2 && stateInfo.normalizedTime > 0.2f)
{
//攻击阶段三: attack_2 ---> attack_3
count = 3;
animator.SetInteger("attack", count);
}
//各类状态的结构体:
public struct PlayerState
{
public bool canInput; //是否能输入
public bool canTurn; //是否能转向
public bool canAttackAgain; //是否能再次攻击
public bool canJump; //是否能跳跃
public bool canSlide; //是否能滑铲
public bool isAttacking; //是否处于攻击状态
public bool isOnGround; //是否在地面上
}
本项目中硬直的主要体现在hero的空中三连击,最后一击为向下劈斩动作(attack_air_3),接触地面后再播放范围攻击特效(attack_air_4)。普通情况下hero跳跃到空中然后落地,该过程需要落地后立即切换到idle状态,但区别于普通情况,该空中三连击劈砍到地面后我们要保证该特效播放完整,因此需要引入硬直时间
//项目示例:
if (stateInfo.IsName("attack_air_3") && state.isOnGround)
{
//待attack_air_3持续进行直至接触地面,自动切换到attack_air_4
//对attack_air_4进行动画延时结束,从而实现硬直
StartCoroutine(Attck_3CD());
}
IEnumerator Attck_3CD()
{
//硬直期间禁止Input或其他...
//留给attack_air_4的播放时间 == 硬直时间
yield return new WaitForSeconds(0.5f);
//复位attack,整套动作完毕
count = 0;
animator.SetInteger("attack", count);
}
标签:积分 code 引入 yield eid 资源 小游戏 www 复杂
原文地址:https://www.cnblogs.com/SouthBegonia/p/11872381.html