我相信我在Unity中遇到过一个错误 . 在带有附加触发器碰撞器的Rigidbody上使用Rigidbody.AddExplosionForce()时,对象感觉到的力受附加触发器的大小影响,这似乎是不现实的 . 我已经对此进行了彻底的测试(请参阅下面的详细信息),但我认为在将其发布到官方问题跟踪器之前我会在此进行讨论,以防这是实际的预期行为 .

SETUP

  • 使用主摄像头和方向光的空场景

  • 为地面添加3x3平面(GameObject> 3D对象>平面)

  • 在原点添加立方体(GameObject> 3D对象>立方体) . 将Rigidbody附加到它并保留所有默认值,但是沿X轴和Z轴将其约束设置为"Freeze Position",并在所有轴上设置冻结旋转 . 附加SphereCollider并设置其"Is Trigger"复选框 . 这个立方体将是我们爆炸的"target" .

  • 在位置(0,-2,0)添加空GameObject . 附加Exploder脚本(参见下面的代码) . 将此Exploder的"Target"属性设置为Cube对象,将Explosion Force设置为2,将UpwardsModifier设置为2.此对象将是我们爆炸的"initiator" .

  • 我们将改变Cube的触发器SphereCollider的半径和Explorator的ExplosionRadius . 每次我们发起爆炸时,我们都会记录多维数据集获得的最高y级别(由Exploder脚本记录到控制台) . 对于每个触发爆炸半径设置,我们记录10次爆炸 . 为了保持一致性,只应记录每次游戏中的第一次爆炸 .

  • 我们的半径设置将是:
    1)Cube - 1,Exploder - 2
    2)Cube - 1,Exploder - 4
    3)Cube - 1,Exploder - 10
    4)Cube - 4,Exploder - 2
    5)Cube - 5,Exploder - 2
    6)Cube - 4,Exploder - 4
    7)Cube - 5,Exploder - 10

  • 以下是我机器上此设置的屏幕截图:
    Exploder scene setup

结果

我在我的机器上运行了上述设置,我的结果报告在下面的图片中 . 该表给出了每个设置获得的最大高度的最小值,中值和最大值,以及第一和第二四分位数,范围和四分位数间距(IQR) . 下面的三个图表是box-and-whisker plots . 左图显示了改变爆炸的效果's radius on the Rigidbody cube' s最大高度,中间的图显示了改变触发器半径的效果,右图显示了改变爆炸/触发球体重叠方式的效果(下面讨论) .

Explosion Results Table

Explosion Radius Chart

Trigger Radius Chart

Sphere Overlap Chart

讨论

上述设置的目的是证明,当在具有附加触发器碰撞器的刚体上使用Rigidbody.AddExplosionForce()时,刚体感受到的爆炸力的大小与该触发器的半径成正比 . 我们可以预期,无论连接触发器体积的大小如何,位于远离爆炸的x单位的刚体将经历相同的力,但事实并非如此 .

上面的 left plot 显示了对Rigidbody 's max height of varying the explosion' s半径的影响 . 这些设置将爆炸半径从1到10个单位变化,最大高度从中位数1.12增加到11.02个单位 . 较大的爆炸明显达到了更高的高度,这是预期的 . 有趣的是,最大高度的变化似乎也随着爆炸的增加而增加,IQR从0.50增加到6.22 .

middle plot 显示了改变连接到刚体的扳机碰撞器半径的最大高度的影响 . 这些高度应该不受触发器半径的影响,因为爆炸半径保持不变 . 然而,当触发器变大时,刚体所达到的高度急剧增加 . 触发半径从1到5个单位不等,最大高度从中位数1.12增加到78.71个单位 . 这种影响甚至比改变爆炸的最大高度还要大,将IQR从0.50提高到20.66 .

根据爆炸's sphere and the trigger'球体的重叠, right plot 组设置1,2,4和6,如下图所示 . 在设置1中,两个球体重叠,但两个球体都没有与另一个球体的中心重叠 . 在设置2(和3)中,爆炸球体与立方体的中心重叠 . 在设置4(和5)中,当任一球体与另一个球体的中心重叠时,立方体's trigger sphere overlapped the center of the explosion. In setup 6 (and 7), both spheres overlapped the center of the other sphere. Clearly, the cube' s最大高度增加 . 这种影响更大当触发器重叠爆炸中心时(当触发器重叠时,最大高度的中位数从1.12增加到15.93单位,但当爆炸重叠时仅增加到5.10) . 当两个球体在设置6中与另一个球体的中心重叠时,最大高度达到与设置4相同的水平(中位数为16.05单位),但变化更大(IQR为15.20对比7.25单位) .

Explosion Trigger Overlaps

总之,增加连接到刚体的触发器体积的大小会增加爆炸力对它的影响 . 对我而言,这似乎是非物质的,错误的行为 . 但是,我没有测试使用除SphereCollider之外的触发器Collider的效果 . 此外,值得注意的是,即使在设置1中,当爆炸球体不与立方体的中心重叠时,立方体也经历了一个力 . 如预期的那样,禁用立方体的SphereCollider会消除这些爆炸影响 . 因此,向刚体添加触发器可以使其感觉到爆炸力,否则它将不会 . 这似乎是非常不切实际的行为!同样令我惊讶的是,在相同的爆炸条件下,我在刚体的最大高度上看到了多少变化 . 我只能猜测Nvidia的PhysX引擎(Unity使用它)为每次物理交互增加了一些随机性 .

EXPLODER CODE

using UnityEngine;

public class Exploder : MonoBehaviour {
// HIDDEN FIELDS
private float _highY = 0f;
private bool _moving;

// INSPECTOR FIELDS
public Rigidbody Target;
public float ExplosionForce;
public float ExplosionRadius;
public float UpwardsModifier;

// EVENT HANDLERS
private void Update() {
    // Explode on click
    bool clicked = Input.GetMouseButton(0);
    if (clicked) {
        if (Target != null)
            Target.AddExplosionForce(ExplosionForce, transform.position, ExplosionRadius, UpwardsModifier, ForceMode.Impulse);
    }

    // Report the object's highest y-level
    if (Target.velocity.sqrMagnitude > 0) {
        _highY = Mathf.Max(_highY, Target.transform.position.y);
        _moving = true;
    }
    else if (_moving) {
        Debug.LogFormat("Highest Y: {0}", _highY);
        _highY = 0f;
        _moving = false;
    }
}
}

EDIT: 用Rigidbody.AddExplosionForce替换了所有Physics.ApplyExplosionForce实例