首页 > 解决方案 > 使用 OnCollisionEnter 偶尔会应用两次强制

问题描述

我正在创建一个第一人称火箭跳跃游戏,前提是在玩家脚下发射火箭发射器以四处走动。

我的 OnCollisionEnter 函数存在问题,该函数将所有对撞机存储在一个半径内并向它们施加爆炸力。当玩家完全处于爆炸的顶部时,将施加两次力。这是代码:

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            
        }
        else
        {
            GetComponent<AudioSource>().Stop();
            Instantiate(explosionPrefab, transform.position, transform.rotation);
            Vector3 explosionPos = transform.position;
            //Use overlapshere to check for nearby colliders
            Collider[] collidersToDestroy = Physics.OverlapSphere(explosionPos, radius);
            foreach (Collider hit in collidersToDestroy)
            {
                //searches for what needs to be destroyed before applying force, this is for destructable objects
                Destructible dest = hit.GetComponent<Destructible>();
                if (dest != null)
                {
                    dest.DestroyWall();
                }
                ExplosiveBarrel barrel = hit.GetComponent<ExplosiveBarrel>();
                if (barrel != null)
                {
                    barrel.BarrelExplode();
                    
                }
            }
            
            Collider[] collidersToMove = Physics.OverlapSphere(explosionPos, radius);
            foreach (Collider hit in collidersToMove)
            {
                Rigidbody rb = hit.GetComponent<Rigidbody>();
                //Add force to nearby rigidbodies
                if (rb != null)
                {
                    rb.AddExplosionForce(power * 5, explosionPos, radius, 3.0F);
                    if (hit.gameObject.tag == "Player")
                    {
                        //if player is hit
                        UnityEngine.Debug.Log("Hit");
                        

                    }
                }

                Destroy(gameObject);
            }


        }
        
    }

我可以通过使用 UnityEngine.Debug.Log("Hit"); 告诉玩家两次施加了力。,它在控制台中出现两次。此外,我很确定这发生在同一帧上,就像把 Destroy(gameObject); 在 if (player hit) 语句中产生相同的结果。

这只发生在玩家就在爆炸旁边时,如果玩家距离很近,则只施加一次力。我非常想解决这个问题,并且只施加一次力。

非常感谢所有帮助,在此先感谢您。

标签: unity3d

解决方案


我解决了!OnCollisionEnter 被调用了两次,因为我有两个对撞机完美地堆叠在一起,所以射弹在同一时间步击中了 2 个对撞机。


推荐阅读