3-7. 蜗牛 - 特殊技能状态的实现
动画
增加一个叫 skill 的 Trigger,以及一个叫 hide 的 bool 变量
当 skill 触发,并且 hide = true 的时候,立马进入 snailHide 状态
snailHide 完整播放完一帧,并且 hide = true 的时候,进入 snailHideIdle 状态
当 hide = false 的时候,从 snailHideIdle 状态变为 snailRecover 状态
当 snailRecover 完整播放完一次之后,退出状态
当 hurt 触发的时候,立马进入 snailHurt 状态,snailHurt 完整播放一次之后进入 snailHide 状态
当 dead = true 的时候,立马进入 snailDead 状态,记得在 snailDead 的最后一帧添加动画帧事件 Enemy.DestroyAfterAnimation()
代码
添加 SnailSkillState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnailSkillState : BaseState
{
public override void OnEnter(Enemy enemy)
{
currentEnemy = enemy;
currentEnemy.currentSpeed = 0;
currentEnemy.anim.SetBool("hide", true);
currentEnemy.anim.SetTrigger("skill");
// 进入缩壳状态的时候变无敌
currentEnemy.GetComponent<Character>().invulnerable = true;
currentEnemy.GetComponent<Character>().invulnerableCounter = currentEnemy.GetComponent<Character>().invulnerableDuration;
}
public override void LogicUpdate()
{
if (currentEnemy.lostTimeCounter <= 0)
{
currentEnemy.SwitchState(NPCState.Patrol);
}
// 为了防止退出 invulnerble 状态,需要重置 invulnerableCounter
currentEnemy.GetComponent<Character>().invulnerableCounter = currentEnemy.GetComponent<Character>().invulnerableDuration;
}
public override void PhysicsUpdate()
{
}
public override void OnExit()
{
// 退出缩壳状态的时候取消无敌
currentEnemy.GetComponent<Character>().invulnerable = false;
currentEnemy.anim.SetBool("hide", false);
}
}
当进入 skill 状态的时候,首先播放缩壳动画,然后设置为无敌。
在逻辑更新代码里,如果玩家消失,则回到巡逻状态;为了防止蜗牛退出无敌状态,还需要不停重置 invulerableCounter
当退出 skill 状态的时候,invulnerable 设置为 false,并且不播放 hide 动画
在 Snail 的代码的 Awake 里添加这个状态
从 patrol 切换到 skill
需要在 NPCState 里添加 Skill
在 Enemy 里也要添加一下