
在Unity中不可能简单地在场景中创建自动影响周围物理对象的爆炸,相反,需要直接对爆炸半径内的每个物体施加物理力。
然而…
Unity可能无法创建被动爆炸效果,但有一个内置函数可以在引用对象的刚体时对其施加爆炸力。
那么如何才能获得对爆炸影响区域内所有对象的引用呢?

一种方法是使用Overlap Sphere。
Overlap是一个物理函数,用于查找位于特定区域内部或接触特定区域的碰撞器。
在本例中为球体,由原点和半径指定,它通常返回调用函数时找到的碰撞器数组。
例如:
Collider[] hitColliders = Physics.OverlapSphere(center, radius);
虽然这样可行,但此方法每次都会创建一个新数组,这可能会导致垃圾。其中,如果不断调用该函数,例如通过反复触发爆炸,可能会影响性能。
相反,重叠球体的非分配版本Overlap Sphere Non Alloc可以更有效,因为它不是每次都构建一个新数组,而是填充一个现有的数组,如缓冲区,并返回碰撞器的数量反而被发现了。
例如:
Collider[] colliders = new Collider[20];
[SerializeField] LayerMask layerMask;
void ExplodeNonAlloc()
{
int numColliders = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, colliders, layerMask);
if (numColliders > 0)
{
for (int i = 0; i < numColliders; i++)
{
// Apply force to each collider.
}
}
}
使用此方法时,将只能检测数组所能容纳的尽可能多的碰撞器,那么需要创建一个足够大的数组来存储希望爆炸能够进行的最大对象数影响。
其实使用图层蒙版过滤掉知道不应受到爆炸影响的碰撞器也是一个好主意,这将有助于避免创建对不打算移动的碰撞器的引用,从而节省性能。
一旦获得了每个对撞机的引用,就可以施加一定的力来移动它。为此,对象需要附加一个Rigidbody组件,这允许对象在物理模拟下移动。
可以使用Try Get Component检查与检测到的对撞机关联的对象是否有刚体,如果有则获取对它的引用,它仅在找到特定类型的组件时才返回true。
然后,如果有的话,创建的参考可用于通过使用Add Explosion Force函数向该对象施加爆炸力,并通过传入矢量3位置和半径来确定效果区域,这通常是首先用于检测对撞机的相同值。
例如:
public class Explosion : MonoBehaviour
{
[SerializeField] float explosionForce = 10;
[SerializeField] float explosionRadius = 10;
Collider[] colliders = new Collider[20];
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ExplodeNonAlloc();
}
}
void ExplodeNonAlloc()
{
int numColliders = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, colliders);
if (numColliders > 0)
{
for (int i = 0; i < numColliders; i++)
{
if (colliders[i].TryGetComponent(out Rigidbody rb))
{
rb.AddExplosionForce(explosionForce, transform.position, explosionRadius);
}
}
}
}
}
Add Explosion Force函数会自动应用可变的力,其中离爆炸中心较远的对象比离较近的对象移动得少。
还可以使用可选的向上修改器参数调整施加的力的方向,该参数移动施加的力的位置,就好像它来自对象下方一样。
例如:
// Adjusts the direction of the force applied so that it's 3 units lower.
rb.AddExplosionForce(explosionForce, transform.position, explosionRadius, 3);
这可以使爆炸更加戏剧化和逼真,因为物体会稍微跳起来并且更有可能四处弹跳,而不是仅仅沿着地板滑动。
添加爆炸力功能非常适合在3D中创建爆炸物理,因为它会自动为您计算爆炸对其他对象的影响。
但是,Unity中的3D和2D物理系统是分开的,2D中没有等效的Add Explosion Force功能。
那么如何才能在Unity中进行2D爆炸呢?可以参阅站内下面这篇文章:
…
以上是关于使用3D方面的物理模拟爆炸的全部内容,如果你有任何反馈,请随时在本页面下方留言。