参考自–b站视频
爆炸的粒子效果可以去Asset Store搜索Explosion进行下载导入。
我下载的粒子效果的Prefab名为:BigExplosion(后续会用到)
接下来需要做一些小的调整:
当炮弹碰撞时需要执行一些脚本,这些脚本在炮弹与某些物体发生碰撞的时候就会被触发执行。所以打开Shell1,然后将isTrigger勾选上
然后
新建两个标签–Player和Enemy
再点击PlayerTank,让PlayerTank的标签为Player
打开敌方坦克的预制体EnemyTank,让EnemyTank的标签为Enemy
后续的脚本编写我们需要这两个标签来判断炮弹打中的是玩家坦克还是敌方坦克又或者是地形
接下来就是进行炮弹爆炸的脚本编写–CommonWeapon
当炮弹发生碰撞时
这里先实现炮弹对象摧毁和播放特效
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不用理会,因为我对文章所写的脚本进行了小修改。
这样当炮弹碰撞到其他物体的时候就会发生爆炸,并销毁自身。
当炮弹命中玩家坦克的时候,除了特效,还应该让玩家坦克的生命值减少
所以编写这么一个脚本叫: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");
}
}
}
因为还没有制作敌方坦克的武器系统,所以还暂时没办法测试坦克的生命值
这个到后面再进行测试
接下来就是进行敌方坦克的脚本编写
当炮弹命中敌方坦克的时候,除了特效,还应该让敌方坦克的生命值减少
所以编写这么一个脚本叫: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进行挂载
接下来可以进行测试,玩家通过攻击敌方坦克,测试脚本是否能正常运行
在制作的时候,发现粒子效果的爆炸特效时间有点长,所以进行了一些细微的调整
打开爆炸的粒子效果的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秒之后就会消失
未完待续…