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

1,前言

参考自–b站视频

2,步骤

2.1,粒子效果

爆炸的粒子效果可以去Asset Store搜索Explosion进行下载导入。
我下载的粒子效果的Prefab名为:BigExplosion(后续会用到)
在这里插入图片描述

2.2,触发器与标签

接下来需要做一些小的调整:
当炮弹碰撞时需要执行一些脚本,这些脚本在炮弹与某些物体发生碰撞的时候就会被触发执行。所以打开Shell1,然后将isTrigger勾选上
在这里插入图片描述然后
新建两个标签–Player和Enemy
再点击PlayerTank,让PlayerTank的标签为Player
在这里插入图片描述打开敌方坦克的预制体EnemyTank,让EnemyTank的标签为Enemy

在这里插入图片描述后续的脚本编写我们需要这两个标签来判断炮弹打中的是玩家坦克还是敌方坦克又或者是地形

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不用理会,因为我对文章所写的脚本进行了小修改。
在这里插入图片描述这样当炮弹碰撞到其他物体的时候就会发生爆炸,并销毁自身。

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

    }


}

在这里插入图片描述因为还没有制作敌方坦克的武器系统,所以还暂时没办法测试坦克的生命值
这个到后面再进行测试

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进行挂载
在这里插入图片描述
接下来可以进行测试,玩家通过攻击敌方坦克,测试脚本是否能正常运行

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)上
在这里插入图片描述这样爆炸效果持续1.5秒之后就会消失

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
所上传的为Eclipse工作空间 在一片广阔的草地上。。。被无数的树精入侵。。。 而出生在这片草地的你。。必然要拯救这片草地^^ 哈哈。。。我也会编泡菜剧情拉。。。。 这个。。测试版地游戏。。。 只有这一个地图。。。再加上BOSS和其他的地图。。就可以成为一款完整的游戏了 在游戏中数字键1使用火球术 数字键2使用抗拒火环(如果已经习得的话),该技能攻击人物附近的所有敌人,并推开敌人,随着等级的增长攻击力越高,对于这个之后树精的地图。。我特别推荐这个技能。。吼吼 数字键3使用雷电术(如果已经习得的话),该技能攻击屏幕内的3个敌人,并使其晕悬1秒,随着等级的增长攻击的人数越多,攻击力也越高,晕悬时间越长。。。在未来的地图中。。大量的远程怪。。这个技能就显的很有用拉。。。而在这个地图上。。。呵呵。。。一点用处没有-- 按F1键 使用气血丹,补充气血(如果有的话) 按F2键 使用凝神丹,补充技力(如果有的话) 按F3键。。。哈哈。。。。当地图上的所有怪都杀光之后你是否觉得没杀够呢。。不要紧。。按F3键就会重新再刷出一地图的树精!!!哈哈哈。。 ESC键可以查看人物属性 和使用道具 嘿嘿。。道具是如何获得的呢。。。每杀死一个怪物就会得到2G。。。。而所有的道具都是在NPC那买地 NPC在哪呢???在地图的中央 。。自己去找吧。。。哦。。对。。。站在NPC的身上 按空格键。。就可以购买物品拉。。。。。ESC键退出和NPC的对话。。。 恩。。。已经介绍的差不多拉。。。。 本引擎是完全由本人制作。。。。一点点的摸索。。花了尽1个月的时间哦。。。 接受高手的批评。。。QQ89631718,群18978079 喜欢用JAVA做游戏的朋友+我的QQ,或者群大家一起讨论。。。自己摸索实在摸索不出个所以然来。。更欢迎高手光临指导~~~ (提醒。。。本游戏为javaApplet,bin目录下start.html执行游戏。。。。没有JAVA平台和浏览器支持是运行不了的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值