一、僵尸攻击和植物的掉血和销毁
当僵尸接触到植物开始攻击时会持续削减植物的血量,当植物血量为零时就销毁当前植物。
在plantManager中,
为植物添加一个血量HP = 100,
public int HP = 100;
在写一个减少血量的方法,来减少血量。
public void LostHP(int attack)
{
HP -= attack;
if(HP< 0)
{
Destroy(gameObject);
}
}
Zombie中需要用到攻击力,时间间隔,计时器
//攻击力
public int AttackNumber = 30;
//时间间隔
private float AktDuration ;
//计时器
public float AktTimer = 2;
TakeDamage方法需要在zombie脚本中调用,当僵尸开始攻击时,调用当前被攻击对象身上的TakeDamage方法。
void EatUpdate()
{
AktTimer += Time.deltaTime;
if (AktTimer > AktDuration&&CurrentEatPlant !=null)
{
CurrentEatPlant.LostHP(AttackNumber);
AktTimer = 0;
}
}
因此需要保存当前的植物
private PlantManagr CurrentEatPlant;
在执行攻击动画时,保存当前的物体
CurrentEatPlant = collision.GetComponent
为了防止攻击间隔出现问题,在每次切换到Eat状态时需要将计时器重置为0.
public void TransitionEat()
{
zombieState = ZombieState.Eat;
AktTimer = 0;
}
演示效果如下:
二、豌豆和僵尸的触发检测
1.僵尸的受伤处理
要为僵尸定义当前血量和最大血量,
//血量
public int HP = 100;
public int currentHP;
在start中让其一开始时相等
currentHP = HP;
还需要一个减少血量的方法,在这个方法里面需要设置一个血量的百分比,是为了当血量低于一定值时,执行特定的动画。当血量小于零时调用dead方法,将僵尸的状态设置为Die
public void TakeDamage(int damage)
{
if (currentHP <= 0)
return;
this.currentHP -= damage;
if (currentHP <= 0)
{
currentHP = -1;
Died();
}
float HpPercent = currentHP * 1f / HP;
animator.SetFloat("HPPercent", HpPercent);
}
当僵尸死亡后将Collider2D禁用掉,避免再次发生碰撞检测,并且在两秒后销毁自身。
private void Died()
{
zombieState = ZombieState.Die;
GetComponent
Destroy(gameObject, 2);
}
为了方便后续的检测给僵尸添加一个 Zombie标签,
2.然后为豌豆添加一个圆形碰撞器组件 Circle Collider 2D ,在BulletControl中去做检测。
当其于僵尸发生碰撞要销毁自身,然后让僵尸血量减少。
为了方便子弹的攻击值能通过外界设置,还要为子弹添加一个设置攻击值的方法。
public void SetAKTnumber(int AKTnumber)
{
this.AKTnumber = AKTnumber;
}
当子弹与敌人发生碰撞时,要得到敌人身上的脚本,调用这个脚本里面减少血量的方法,然后把伤害值传递过去。
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Zmobie")
{
Destroy(gameObject);
collision.GetComponent
}
}
为了避免子弹一值存在,当子弹没有碰撞到物体10s后销毁自身
void Start()
{
Destroy(gameObject, 10);
}
3.在豌豆射手攻击时去设置他的攻击值
go.SetAKTnumber(AKTvalue);
演示效果如下:僵尸会先失去头然后再死去最后消失。
三、豌豆的爆裂效果
当豌豆接触到僵尸时对其添加一个爆炸的特效
需要达到的效果是由下到大的方式播放,有因此为其添加一个动画,
打开动画编辑器后,点击录制,在不同的关键去修改豌豆的缩放,达到先变大后减小最后消失的效果
在代码中,当子弹接触到僵尸时就播放这个动画,因为这个动画是这个物体的默认动画,将其设置为预制体然后实例化出来就行了。
public GameObject PeaBulletHitPrefab;
GameObject go= GameObject.Instantiate(PeaBulletHitPrefab, transform.position, Quaternion.identity);
Destroy(go, 1);
效果如下: