(六)坦克大战--(4)炮弹爆炸与生命值

1,前言

参考自–b站视频

2,步骤

2.1,粒子效果

爆炸的粒子效果可以去Asset Store搜索Explosion进行下载导入。
我下载的粒子效果的Prefab名为:BigExplosion(后续会用到)
(六)坦克大战--(4)炮弹爆炸与生命值_第1张图片

2.2,触发器与标签

接下来需要做一些小的调整:
当炮弹碰撞时需要执行一些脚本,这些脚本在炮弹与某些物体发生碰撞的时候就会被触发执行。所以打开Shell1,然后将isTrigger勾选上
(六)坦克大战--(4)炮弹爆炸与生命值_第2张图片然后
新建两个标签–Player和Enemy
再点击PlayerTank,让PlayerTank的标签为Player
(六)坦克大战--(4)炮弹爆炸与生命值_第3张图片打开敌方坦克的预制体EnemyTank,让EnemyTank的标签为Enemy

(六)坦克大战--(4)炮弹爆炸与生命值_第4张图片后续的脚本编写我们需要这两个标签来判断炮弹打中的是玩家坦克还是敌方坦克又或者是地形

2.3,脚本编写

接下来就是进行炮弹爆炸的脚本编写–CommonWeapon
当炮弹发生碰撞时

  1. 如果命中的是地形,我们只需要摧毁炮弹对象,然后播放爆炸特效即可
  2. 如果命中的是PlayerTank或者EnemyTank,我们需要摧毁炮弹对象,播放特效,然后发送信息给坦克对象,告诉他,你被打中了,你准备掉血了。

这里先实现炮弹对象摧毁和播放特效

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CommonWeapon : MonoBehaviour
{
     
    //给炮弹添加爆炸特效
    public GameObject shellExplosionPrefab;

    
    // Start is called before the first frame update
    void Start()
    {
     
        
    }

    // Update is called once per frame
    void Update()
    {
     

    }
    
    public void OnTriggerEnter(Collider collider)
    {
     
    	//播放特效
        GameObject.Instantiate(shellExplosionPrefab, transform.position, transform.rotation);
        
        //销毁自身
        GameObject.Destroy(this.gameObject);
        
        //当发生碰撞的时候,会检测碰撞到的对象的标签名,如果标签名是Player
        //表示炮弹命中玩家坦克
        //通过collider.SendMessage("TakeDamage");进行相应的方法调用
        if(collider.tag=="Player")
        {
     
            collider.SendMessage("TakeDamage");
        }
        //当发生碰撞的时候,会检测碰撞到的对象的标签名,如果标签名是Enemy
		//表示当炮弹命中敌方坦克
		//通过collider.SendMessage("TakeEnemyDamage");进行相应的方法调用
        if (collider.tag=="Enemy")
        {
     
            collider.SendMessage("TakeEnemyDamage");
        }

    }
    
}



然后将这个脚本挂载到炮弹的Prefab上(我的是Shell1)
并将之前下载的爆炸的粒子效果添加到ShellExplosionPrefab的框中
这里的Time不用理会,因为我对文章所写的脚本进行了小修改。
(六)坦克大战--(4)炮弹爆炸与生命值_第5张图片这样当炮弹碰撞到其他物体的时候就会发生爆炸,并销毁自身。

2.4,玩家坦克生命值

当炮弹命中玩家坦克的时候,除了特效,还应该让玩家坦克的生命值减少
所以编写这么一个脚本叫:MainTankHealth

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MainTankHealth : MonoBehaviour
{
     
    /**
     * 这个是坦克的生命值
     */
    public int hp=1030;

    //这个是坦克血量为0,爆炸的效果
    public GameObject tankExplosion;
    
    // Start is called before the first frame update
    void Start()
    {
     
    }

    // Update is called once per frame
    void Update()
    {
     
    }


    void TakeDamage()
    {
     
        //如果在受到这颗炸弹的伤害之前,hp就已经小于0了。那就不会继续受到伤害了
        if (hp<=0)
        {
     
            return;
        }
        //炮弹造成的伤害在10~20随机浮动
        hp -= Random.Range(10, 20);
        //受到伤害之后血量为0,就应该控制死亡效果
        if (hp<=0)
        {
     
            //制造爆炸效果
            GameObject.Instantiate(tankExplosion, transform.position + Vector3.up, transform.rotation);
            //玩家生命值为0,游戏结束,这里是进行游戏结束界面的跳转。
            //需要自己新建一个场景叫endGame
            Application.LoadLevel("endGame");
        }

    }


}

(六)坦克大战--(4)炮弹爆炸与生命值_第6张图片因为还没有制作敌方坦克的武器系统,所以还暂时没办法测试坦克的生命值
这个到后面再进行测试

2.5,敌方坦克生命值

接下来就是进行敌方坦克的脚本编写
当炮弹命中敌方坦克的时候,除了特效,还应该让敌方坦克的生命值减少
所以编写这么一个脚本叫:EnemyHealth

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyHealth : MonoBehaviour
{
     
    /**
     * 这个类是敌方坦克的生命值
     */
    public int hp = 100;

    //这个是坦克血量为0,爆炸的效果
    public GameObject tankExplosion;
    
    // Start is called before the first frame update
    void Start()
    {
     
        
    }

    // Update is called once per frame
    void Update()
    {
     
        
    }


    void TakeEnemyDamage()
    {
     
        //如果在受到这颗炸弹的伤害之前,hp就已经小于0了。那就不会继续受到伤害了
        if (hp<=0)
        {
     
            return;
        }
        hp -= Random.Range(30, 40);
        //受到伤害之后血量为0,就应该控制死亡效果
        if (hp<=0)
        {
     
            //爆炸特效
            GameObject.Instantiate(tankExplosion, transform.position + Vector3.up, transform.rotation);
            //生命值为0,敌方坦克被销毁
            GameObject.Destroy(this.gameObject);
            
        }

    }
}

编写完脚本之后,打开敌方坦克的Prefab,将EnemyHealth进行挂载
(六)坦克大战--(4)炮弹爆炸与生命值_第7张图片
接下来可以进行测试,玩家通过攻击敌方坦克,测试脚本是否能正常运行

2.6,细节调整

在制作的时候,发现粒子效果的爆炸特效时间有点长,所以进行了一些细微的调整
打开爆炸的粒子效果的Prefab(我的是BigExplosion)
然后编写如下的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WeaponPartical : MonoBehaviour
{
     
    //定义特效持续多久就会被销毁
    public float time;
    
    // Start is called before the first frame update
    void Start()
    {
     
        Destroy(this.gameObject,time);
    }

    // Update is called once per frame
    void Update()
    {
     
        
    }
}

并将该脚本挂载到粒子效果(BigExplosion)上
(六)坦克大战--(4)炮弹爆炸与生命值_第8张图片这样爆炸效果持续1.5秒之后就会消失

未完待续…

你可能感兴趣的:(Unity)