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 里也要添加一下

解决蜗牛恢复的时候也在移动

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240226_1035

posted @ 2024-02-26 10:55  hellozjf  阅读(74)  评论(0编辑  收藏  举报