【问题标题】:Box collider inside Box collider affects game performance?Box collider里面的Box collider会影响游戏性能吗?
【发布时间】:2019-07-25 08:08:12
【问题描述】:

我打算创建一个空的游戏对象,并在其中为我的触摸传感器附加一个盒子碰撞器,然后在它里面是另一个带有盒子碰撞器的空游戏对象,用于检测碰撞。这是否会影响游戏性能,因为每次更新都会检测到冲突?请不要说只是移除内部游戏对象然后将碰撞附加到外部游戏对象。

【问题讨论】:

  • 应该没什么大不了的。如有疑问 - 基准

标签: c# unity3d game-development


【解决方案1】:

虽然确实默认每帧触发OnCollisionStay,但您可以使用Layer Collision Matrix为所选图层禁用此行为。

即使您不这样做,性能差异也将是可以忽略的,除非我们谈论的是数千个对象,以及一个真正未优化的 OnCollisionStay 函数。

您可以在物理设置下找到图层碰撞蒙版设置。
(链接:https://docs.unity3d.com/Manual/class-PhysicsManager.html


另一种方法是禁用两个碰撞器的碰撞,如下所示:

void Awake() {
    Collider col = GetComponent<Collider>();
    Collider parentCol = transform.parent.GetComponent<Collider>();
    Physics.IgnoreCollision(col, parentCol, true);
}

https://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html


我通常什至不费心使用上述任何一种方法来禁用非大规模生产的对象的碰撞,而是使用这种逻辑:

void OnCollisionStay(Collision col) {
    // Skip if it's the object we don't care about
    if (col.gameObject == transform.parent.gameObject) { return; }

    // Could also check by layer
    if (col.gameObject.layer == 8) { return; }

    // Rest of the OnCollisionStay function
}

【讨论】:

  • 这行得通。有关其他信息,我使用的是 2D,因此我使用 Physics2D.IgnoreCollision 然后将 Collider 更改为 Collider2D。
【解决方案2】:

如果您担心两个碰撞器会在每一帧中相互碰撞,您不必担心。您可以将它们的对象放在两个不同的层上,并以不相互碰撞的方式对其进行配置。无论如何,您都需要这样做,否则您的触摸传感器碰撞器将与游戏世界交互。
你可以在这里了解更多:https://docs.unity3d.com/Manual/LayerBasedCollision.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多