【发布时间】:2019-10-15 02:17:19
【问题描述】:
我有一个类CollisionHandler,它有OnCollisionEnter 方法。游戏中的每个可碰撞实体都有CollisionHandler作为一个组件。因此,当 2 个对象发生碰撞时,OnCollisionEnter 方法被调用两次,这没关系,因为损坏和其他事情是由于对象“A”接触对象“B”而处理的,反之亦然。
此外,每次碰撞都会产生闪光效果并播放撞击声,当然,每次碰撞也会播放两次这些效果。尽管它不会被玩家察觉,但它似乎并不正确。为了防止它,我想出了以下解决方案:我将当前帧号保存在另一个碰撞参与者中,这样它就会知道这些效果已经被第一个参与者播放了。
private void OnCollisionEnter(Collision collision)
{
// Calculate the damage caused by `this.gameObject` to `collision.gameObject`.
// ...
// Play an impact sound and show a visual effect.
if (thisObject.CollisionFrameId != Time.frameCount)
{
otherObject.CollisionFrameId = Time.frameCount;
// play sound
// show hit effect
}
}
虽然它有效,但我不确定(我是 Unity 的新手)这是最佳实践,如果是,请提出其他可能的解决方案。
请注意,我没有问"Why is OnCollisionEnter getting called twice?"。我知道为什么会这样。我的问题是关于另一个的,虽然它确实提到了同一个函数的名称,但它仍然没有问同样的问题。
【问题讨论】:
-
我在 5 分钟内想到的所有解决方案都包含一些我会阅读和比较的标志或值,以便知道其他人已经处理了这个冲突。而是存储当前时间/帧数听起来更合乎逻辑!所以我会说如果这已经可行,很好的解决方案;)
-
如果您的代码被调用两次,请检查从何处调用它。您不必处理来自两个对象的两个不同对象的碰撞。将碰撞代码放在两个对象的“更智能”上,然后从那里开始。
标签: unity3d collision-detection collision