在游戏中,很多时候要用到爆炸这一重要的游戏效果,但是光靠特效是不能实现爆炸的物理特性的
在这篇博客中我将介绍一下 爆炸的制作
我们首先 要下载一个爆炸的粒子系统(官方商店中有免费的)
其次 我们需要对射线相关知识有一些了解 (在我之前的博客有介绍,大家可以去看看)
然后我们就开始吧
1.首先创建场景
这个场景很简单
创建几个Cube即可(加刚体)
2.摄像机脚本
我们给摄像机创建一个脚本就叫做 Bang 吧!
然后开始我们的代码
public float radius = 50f; //定义一个要添加爆炸力的半径
public float power = 6000f; //定义一个爆炸力
public GameObject particle; //得到播放粒子特效的物体
void Update()
{
//当左键按下时
if (Input.GetMouseButtonDown(0))
{
//Camera.main:得到主摄像机
//Input.mousePosition:得到鼠标现在的位置
//我的理解是从主摄像机到鼠标现在的点发射一条射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //光线投射碰撞
RaycastHit hit; //函数是对射线碰撞的检测,当碰撞到物体时,返回一个碰撞信息
if (Physics.Raycast(ray, out hit))
{
Vector3 point = hit.point;//得到碰撞点的坐标
Instantiate(particle, point, Quaternion.identity); //实例化出这个爆炸特效
//Physics.OverlapSphere():球体投射,给定一个球心和半径,返回球体投射到的物体的碰撞器
Collider[] colliders = Physics.OverlapSphere(point, radius);
foreach (Collider hits in colliders) //遍历碰撞器数组
{
//如果这个物体有刚体组件
if (hits.GetComponent<Rigidbody>())
{
//给定爆炸力大小,爆炸点,爆炸半径
//利用刚体组件添加爆炸力AddExplosionForce
hits.GetComponent<Rigidbody>().AddExplosionForce(power, point, radius);
}
}
}
}
}
代码如上 然后在这里特别强调一下 我们在脚本中用到了Camera,main 所以我们必须给我们用到的摄像机改标签为Maincamera
不然会报错 而且是你看不懂的那种(我被这个困扰了很长时间,不想大家走弯路)
然后呢我们在unity中就可以运行了
3.对于爆炸特效的脚本
对于我们下载的特效,一定不是我们想要的时间
我们不能让它在 其他物体都受到爆炸的波及了,他还在爆炸 对吧
所以我们需要写一个协程 来控制爆炸特效进行时间
private void Update()
{
if(Input.GetMouseButton(0))
{
StartCoroutine(Destroy());//开始协程
}
}
IEnumerator Destroy()
{
yield return new WaitForSeconds(1f);//延迟调用1s
Destroy(gameObject);//销毁特效
}
然后就基本完美了
4.制作受到爆炸影响(接着爆炸的油桶)
在这里因为素材还得导入 就用cube代替了(懒死)
这个代码就用到了一个脚本的相互交互
首先给出油桶上的代码
[HideInInspector]
public bool isExplode = false;
public float Force = 200;
public float Radius = 10;
public GameObject Explode;
private void Update()
{
if (isExplode == true)
{
StartCoroutine(Delay());
}
}
IEnumerator Delay()
{
yield return new WaitForSeconds(1f);
GetComponent<Rigidbody>().AddExplosionForce(Force, transform.position, Radius);
Instantiate(Explode, transform.position, transform.rotation);
Destroy(gameObject);
}
然后给出Camera上的代码
就是上边代码中添加一句
`if (hits.GetComponent<Collider>().tag == "Box")
{
hits.gameObject.GetComponent<BoxBnag>().isExplode = true;//设置Boxnag中的isExplode = true
}
运行得到以下效果
如果以上代码 或有知识不懂
可以看之前的博客 基本都有涉及
祝大家工作学习顺利 这篇博客就到这里了