【Unity2DMobileGame_PirateBomb14】—— 设置敌人的技能攻击

269 阅读4分钟

文章目录

1.技能分析

在前面的文章中,一直都制作的是怪物黄瓜,每一个怪物都有普攻和技能攻击,他们的普攻是一样的,可以写在父类中,但是技能攻击每一个怪物都有可能不同。这一章节延续第13节对敌人黄瓜怪的技能攻击进行完善。

黄瓜怪拥有可以把炸弹吹灭的技能,在黄瓜怪吹气的瞬间需要把炸弹从点燃变成熄灭状态,也就是说播放敌人技能攻击的过程中,在黄瓜怪作出吹灭动作的那一帧需要把炸弹从点燃变成熄灭。也就是说需要使用到事件方法。

炸弹的动画有三种形态,默认的是on,即玩家丢出去的点燃状态,此外还有爆炸和熄灭状态。这里当黄瓜怪吹了一下发动技能,炸弹需要从on变为off。同时,如果吹灭的炸弹旁边有炸弹爆炸的时候还应该把炸弹变回on状态。

2.炸弹被吹灭

吹灭炸弹的事件方法应该是执行在黄瓜怪的技能动画里,判断吹灭的前提是当前敌人的目标targetPoint已经是炸弹了,只需要在炸弹里设置炸弹的TurnOff()方法即可。

 /// 炸弹被吹灭的方法
public void TurnOff()
{
    anim.Play("bomb_off");
    // 炸弹被吹灭从攻击列表中移除,只需要更改炸弹吹灭后的层级
    gameObject.layer = LayerMask.NameToLayer("NPC");
}

gameObject.layer = LayerMask.NameToLayer("NPC");将吹灭后的炸弹修改了层级使它从敌人的攻击列表中移除,并且需要在Bomb_off的动画中录制关键帧并把它层级在NPC层中靠后,我这里设置的是0,保证熄灭后的炸弹成为背景不覆盖其他物体。

接下来,在cucumber中设置动画并在skill的动画中吹灭那一帧添加SetOff事件方法

/// 事件方法执行在吹灭动画里
public void SetOff()
{
    targetPonit.GetComponent<Bomb>().TurnOff();
}

有了上面的代码并不能实现这一技能,还需要注意的是当炸弹熄灭后但还是会爆炸的问题,这需要在Bomb中修改Update(),先判断动画的状态。

void Update()
{
    if (!anim.GetCurrentAnimatorStateInfo(0).IsName("bomb_off"))
    {
        // 如果当前的游戏时间大于开始时间+等待时间
        if (Time.time > startTime + waitTime)
            anim.Play("bomb_explosion");
    }
}

3.炸弹再次爆炸

熄灭的炸弹当旁边有炸弹爆炸的时候,它可以重新被点燃爆炸。

在炸弹中,在写一个点燃炸弹的方法TurnOn(),这里的计时器也需要进行相应的修改,此时计时器的设置当游戏一开始炸弹生成的时候就开始计算了,如果是off的话还是没有更改StartTime,仍然记录的是炸弹出生的那一刻被释放到场景中的那一刻时间,一旦被改为播放成on的时候就会瞬间爆炸。这里希望熄灭再次被点燃的时候startTime重新开始计算,让它再次等于被启动那一刻。

/// 炸弹被重新点燃的方法
public void TurnOn()
{
	startTime = Time.time;
    anim.Play("bomb_on");
    gameObject.layer = LayerMask.NameToLayer("Bomb");
}

turnOn的函数方法在判断周围碰撞体的时候进行运行。如果判断炸弹爆照范围中的这些物体的tag是炸弹就执行turnOn方法。无论周围的这个炸弹是熄灭状态还是点燃状态都不影响将该炸弹重新设置为On的状态,但是如果有一颗炸弹A是点燃状态,此时另一个炸弹B发生爆炸同时还可以引燃炸弹A,这时候炸弹A会的引爆时间会发生重置。所以需要判断周围的炸弹播放的当前动画如果是off的话才需要重新点燃。

// 判断周围的是否是炸弹并且处于熄灭状态把熄灭的那颗炸弹点燃
if (i.CompareTag("Bomb")&& i.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("bomb_off")) 
{
    i.GetComponent<Bomb>().TurnOn();
}

防止敌人吹灭炸弹后一直攻击炸弹播放skill的动画,此时的攻击目标应该已经转移。所以在敌人的攻击状态下需要对敌人攻击列表内的物体进行判断,如果是1个目标,直接进行追踪攻击就可以了。

if (enemy.attackList.Count == 0)
    enemy.TransitionToState(enemy.patrolState);
else if (enemy.attackList.Count > 1)
{
    for (int i = 0; i < enemy.attackList.Count; i++)
    {
        // 修改距离最近的点作为目标点
        if (Mathf.Abs(enemy.transform.position.x - enemy.attackList[i].position.x) <
            Mathf.Abs(enemy.transform.position.x - enemy.targetPonit.position.x))
            enemy.targetPonit = enemy.attackList[i];
    }
}
else enemy.targetPonit = enemy.attackList[0];

实现效果如下图所示
炸弹爆炸重新引燃了炸弹,怪物吹灭炸弹后继续寻找新的目标点进行巡逻或攻击。
在这里插入图片描述