本次完成盒子僵尸的制作,其特点是该僵尸生命值低于某值的瞬间,有一定几率爆炸,将周围植物和自己炸死.
代码
盒子僵尸
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class BoxZombie : ZombieBase
{
//该僵尸生命值低于某值的瞬间,有一定几率爆炸,将周围植物和自己炸死.
protected override int MaxHP => 570;
protected override float speed => 4;
protected override float attackValue => 100;
protected override GameObject Prefab => GameManager.Instance.GameConf.BoxZombie;
protected override bool isSpecial => false;
private bool isBoom = false;
public override Vector2 offset => new Vector2(-0.58f, -0.38f);
public override void SpecialMove()
{
return;
}
public override void InitZombieHpState()
{
zombieHpState = new ZombieHpState(
0,
new List<int>() { MaxHP,300, 90 },
new List<string>() { "BoxZombie_Walk", "BoxZombie_Walk", "BoxZombie_LostHeadWalk" },
new List<string>() { "BoxZombie-Attack", "BoxZombie-Attack", "BoxZombie_LostHeadAttack" },
new List<UnityAction>() { null,CheckBoom, CheckLostHead }
);
}
public override void OnDead()
{
if (!isSpecialDie) //如果不是特殊死法
{// 创建一个死亡身体
BoxZombie_Diebody body = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.BoxZombie_Diebody).GetComponent<BoxZombie_Diebody>();
body.Init(animator.transform.position);
}
}
private void CheckBoom()
{
if (Random.Range(0, 11) > 4) return; //有一半的概率会爆炸
if (!isBoom)
{
// 已经爆炸
isBoom = true;
// 播放爆炸动画
animator.Play("GoOut");
StartCoroutine(CheckBoomed());
}
}
IEnumerator CheckBoomed()
{
while (true)
{
yield return new WaitForSeconds(0.05f);
if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1)
{
//给周围植物附加爆炸伤害
DoBoomHurt();
AudioManager.Instance.PlayEFAudio(GameManager.Instance.GameConf.Boom); //爆炸音效
BoxZombieBoom boom = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.BoxZombieBoom).GetComponent<BoxZombieBoom>();
boom.Init(transform.position);
//给自己也附加爆炸伤害
BoomHurt(1800, "BoxZombie(Clone)");
}
}
}
private void DoBoomHurt()
{
// 找到可以被我攻击的敌人,并且附加伤害
Vector2 pos = new Vector2(transform.position.x, transform.position.y);
List<Grid> grids = GridManager.Instance.GetGrids(pos, 3.25f);
if (grids == null) return;
for (int i = 0; i < grids.Count; i++)
{
if (!grids[i].HavePlant)
{
continue;
}
else
{
grids[i].CurrPlantBase.Hurt(1800);
}
}
}
/// <summary>
/// 检查掉头
/// </summary>
private void CheckLostHead()
{
if (!isLostHead)
{
// 头需要失去
isLostHead = true;
// 创建一个头
Zombie_Head head = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.Zombie_Head).GetComponent<Zombie_Head>();
head.Init(animator.transform.position);
// 状态检测
CheckState();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BoxZombie_Diebody : BaseEFObj
{
public override string AnimationName => "BoxZombie_DieBody";
public override GameObject PrefabForObjPool => GameManager.Instance.GameConf.BoxZombie_Diebody;
}