Unity3d Unity 3D:检测其他碰撞参与者已处理碰撞的正确方法是什么?

Unity3d Unity 3D:检测其他碰撞参与者已处理碰撞的正确方法是什么?,unity3d,collision-detection,collision,Unity3d,Collision Detection,Collision,我有一个类CollisionHandler,它有OnCollisionCenter方法。游戏中的每个可碰撞实体都有CollisionHandler作为一个组件。因此,当两个对象发生碰撞时,onCollisionCenter方法会被调用两次,这是正常的,因为损伤和其他东西是由对象“a”接触对象“B”而处理的,反之亦然 此外,每次碰撞都会产生闪光效果并播放撞击声,当然,每次碰撞也会播放两次这些效果。虽然这对玩家来说不是不可察觉的,但它似乎并不正确。为了防止它,我提出了以下解决方案:我将当前帧号保存在

我有一个类
CollisionHandler
,它有
OnCollisionCenter
方法。游戏中的每个可碰撞实体都有
CollisionHandler
作为一个组件。因此,当两个对象发生碰撞时,
onCollisionCenter
方法会被调用两次,这是正常的,因为损伤和其他东西是由对象“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的新手)它是否是最佳实践,如果是,请建议其他可能的解决方案


注意,我没有问。我知道为什么会这样。我的问题是关于另一个,虽然它确实提到了同一个函数的名称,但它仍然没有提出相同的要求。

您可以使用一个脚本(或同一脚本)在另一个对象上执行GetComponent,并将RecentCollisionObject设置为当前脚本或游戏对象(可能是给定的时间范围,只是为了额外的安全)(如果只有一个触发了它,但另一个由于某种原因没有触发)

每次碰撞时,检查RecentCollisionObject是否为另一个对象(如果经过的时间不超过~0.01秒)。如果为true,则您知道该特定碰撞必须已由另一个对象刚刚处理,因此请重置该另一个对象的所有值,而不执行其他操作。因此,发生的下一次碰撞(无论多么快)将重新执行此循环并按预期工作


这样,您只允许触发碰撞代码的第一个执行您的代码(像声音一样)。关键是两个碰撞事件都在同一帧中运行,因此无论哪个先触发,都可以阻止第二个运行。

您可以使用Unity标记系统,标记与特定标记对象碰撞时发生的动作

例如:

internal void OnTriggerEnter(Collider other)    {

        if (other.gameObject.tag == "Oject Tag") {
            this.GetComponent<AudioSource> ().PlayOneShot (objectTagSoundClip);
        }
内部无效对撞机(对撞机其他){
if(other.gameObject.tag==“项目标记”){
this.GetComponent().PlayOneShot(objectTagSoundClip);
}

只需在游戏对象中放置一个音频即可播放。

也许您有两个碰撞器。如果是这样,您可以检查boxcollider是否仅用于碰撞。您也可以在碰撞离开时尝试。希望能有所帮助。

我在5分钟内决定的所有解决方案都包括一些标志或值,我会阅读并比较,以便了解其他人已经处理了此冲突。存储当前时间/帧数听起来更符合逻辑!因此我想说,如果这已经起作用,很好的解决方案;)如果您的代码被调用了两次,请检查调用的位置。您不必处理两个不同对象与两个对象的冲突。将冲突代码放在“更聪明"在我的例子中,每个物体都应该在撞击时播放音频。我喜欢你关于物体的想法,但我认为依靠0.01秒是没有意义的。为什么精确到0.01秒?它应该在没有任何计时的情况下工作。这只是一个安全机制,在两个碰撞物体中只有一个没有碰撞的情况下操纵他们的碰撞事件。我不确定这种情况是否存在,但如果存在,则有必要这样做-否则在后续碰撞中会出现奇怪的行为。当然,您也可以选择下一个更新时间范围,而不是0.01秒。