【发布时间】:2019-07-25 08:08:12
【问题描述】:
我打算创建一个空的游戏对象,并在其中为我的触摸传感器附加一个盒子碰撞器,然后在它里面是另一个带有盒子碰撞器的空游戏对象,用于检测碰撞。这是否会影响游戏性能,因为每次更新都会检测到冲突?请不要说只是移除内部游戏对象然后将碰撞附加到外部游戏对象。
【问题讨论】:
-
应该没什么大不了的。如有疑问 - 基准
标签: c# unity3d game-development
我打算创建一个空的游戏对象,并在其中为我的触摸传感器附加一个盒子碰撞器,然后在它里面是另一个带有盒子碰撞器的空游戏对象,用于检测碰撞。这是否会影响游戏性能,因为每次更新都会检测到冲突?请不要说只是移除内部游戏对象然后将碰撞附加到外部游戏对象。
【问题讨论】:
标签: c# unity3d game-development
虽然确实默认每帧触发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
}
【讨论】:
如果您担心两个碰撞器会在每一帧中相互碰撞,您不必担心。您可以将它们的对象放在两个不同的层上,并以不相互碰撞的方式对其进行配置。无论如何,您都需要这样做,否则您的触摸传感器碰撞器将与游戏世界交互。
你可以在这里了解更多:https://docs.unity3d.com/Manual/LayerBasedCollision.html
【讨论】: