效果:
可以看到,主角碰到我们的巧克力之后,巧克力爆炸,碎片横飞,然后消失。
思路:
1.判断主角与巧克力接触
2.接触到的瞬间删除巧克力(你希望爆炸的物体)。
3.生成巧克力碎片的prefab(多个碎片组合成的一个物体)。给这个物体添加一个爆炸力,让它向四周飞去。一小段时间后删除碎片。
给玩家一种该物体爆炸,变成碎片的感觉。实际上,该物体并没有变化,只是瞬间换成了多个碎块的组合体。这些碎块受力飞走了。
具体实现:
1.判断主角与巧克力接触后,执行相应操作:
- 主角和巧克力(需要爆炸的物体)都要添加碰撞盒。
- 在主角或者巧克力身上的脚本里进行碰撞检测,我是在巧克力的脚本上检测的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Monster : MonoBehaviour { //巧克力身上绑定的脚本:Monster类
public GameObject chips;//碎块prefab,在外部赋值
private void OnCollisionEnter(Collision col)//碰撞检测函数
{
//判断碰撞到物体的layer是否和主角的layer相同。如果相同说明碰到了主角
if (col.gameObject.layer == LayerMask.NameToLayer("wuzei"))
{
SpawnEffects();//生成爆炸特效,不同monster特效可能不同
SpawnChips(chips);//生成碎块物体的prefab
Destroy(gameObject);//删除本物体
}
}
}
2.生成碎块物体的prefab,向它添加爆炸力,让它飞走
- 每个碎块都要添加碰撞盒和刚体,之后才能受力运动
void SpawnChips(GameObject m_chips)
{
if (m_chips != null)
{
//生成prefab
GameObject myChips = Instantiate(m_chips, transform.position, Quaternion.identity);
//1s后删除该物体(爆炸后很快就应该消失)
Destroy(myChips, 1f);
//设置发生爆炸的位置
Vector3 explosionPos = myChips.transform.position;//这里把位置设置为该物体自身位置。可以根据实际情况调整。
//调用Physics类的OverlapSphere方法,选取受到爆炸影响的colliders,确定爆炸范围。
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
//对上一步获取到的所有碰撞体进行操作
foreach (Collider hit in colliders)
{
Rigidbody rb = hit.GetComponent<Rigidbody>();//获取刚体
if (rb != null) {
rb.AddExplosionForce(power, explosionPos, radius, -3f);
//调用函数AddExplosionForce(),向刚体添加爆炸力
}
}
}
}
【注意】:为了效果更明显,可以把rigidbody的mass减小(m减小,a变大),LinerDrag减小(运动阻力)。