unity学习笔记—-游戏练习07

一、僵尸攻击和植物的掉血和销毁

当僵尸接触到植物开始攻击时会持续削减植物的血量,当植物血量为零时就销毁当前植物。

在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;
    }

演示效果如下:

6a70e004fd7141858996509cffb57793.gif

二、豌豆和僵尸的触发检测

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中去做检测。

eafd393498c34631aec9f5e6259f3ed6.png

当其于僵尸发生碰撞要销毁自身,然后让僵尸血量减少。

为了方便子弹的攻击值能通过外界设置,还要为子弹添加一个设置攻击值的方法。

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);

演示效果如下:僵尸会先失去头然后再死去最后消失。

6943b2c7fc924dae9255dd0301867510.gif

三、豌豆的爆裂效果

当豌豆接触到僵尸时对其添加一个爆炸的特效

e19a802317684a4db2630e927a2bb745.png

需要达到的效果是由下到大的方式播放,有因此为其添加一个动画,

打开动画编辑器后,点击录制,在不同的关键去修改豌豆的缩放,达到先变大后减小最后消失的效果

4ae9d1a53bf847e6946dadae0f671ae6.png

在代码中,当子弹接触到僵尸时就播放这个动画,因为这个动画是这个物体的默认动画,将其设置为预制体然后实例化出来就行了。

public GameObject PeaBulletHitPrefab;

GameObject go= GameObject.Instantiate(PeaBulletHitPrefab, transform.position, Quaternion.identity);
Destroy(go, 1);

效果如下:

7b4cb7a232934a718da32f122e2f5acf.gif

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>