一、僵尸攻击和植物的掉血和销毁
当僵尸接触到植物开始攻击时会持续削减植物的血量,当植物血量为零时就销毁当前植物。
在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<PlantManagr>();
 为了防止攻击间隔出现问题,在每次切换到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<Collider2D>().enabled = false;
         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<ZombieControl>().TakeDamage(AKTnumber);
         }
     }
为了避免子弹一值存在,当子弹没有碰撞到物体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);
效果如下:
