我打算创建一个空的Gameobject并在其中为我的触摸传感器附加一个盒子对撞机,然后在它的内部是另一个带有盒子对撞机的空游戏对象,用于检测碰撞。这是否影响游戏性能,导致每次更新都检测到冲突?请不要只删除内部游戏对象,然后将碰撞附加到外部游戏对象上。
答案 0 :(得分: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
}
答案 1 :(得分:0)
如果您担心两个碰撞器每帧都会相互碰撞,则不必担心。您可以将它们的对象放在两个不同的层上,并进行配置,以使它们不会相互碰撞。无论如何,您都需要这样做,否则您的触摸传感器对撞机将与游戏世界互动。
您可以在此处了解更多信息:https://docs.unity3d.com/Manual/LayerBasedCollision.html