📜  碰撞时统一销毁对象 - C# (1)

📅  最后修改于: 2023-12-03 14:56:31.493000             🧑  作者: Mango

碰撞时统一销毁对象 - C#

在游戏开发中,经常需要在物体碰撞时将其销毁。如果我们直接在碰撞处理函数中调用 GameObject.Destroy 来销毁物体,会引起以下问题:

  1. 可能同一时刻有多个碰撞事件,在处理某个碰撞事件时,销毁了不该销毁的物体,导致程序出错。

  2. 如果一个物体被多个物体同时碰撞到,每次碰撞事件都会调用销毁函数,造成额外的资源浪费。

要解决这个问题,有一个简单的方法:在每个物体上添加一个标记,表示它是否需要被销毁,然后在所有碰撞处理函数执行完毕后,统一销毁所有需要被销毁的物体。

下面是一个示例代码:

using System.Collections.Generic;
using UnityEngine;

public class DestroyOnCollide : MonoBehaviour
{
    private bool m_shouldDestroy = false;

    // 在此处添加所有需要检测碰撞的物体
    public List<GameObject> m_objectsToCheck;

    private void Update()
    {
        if (m_shouldDestroy)
        {
            // 在下一帧销毁所有需要销毁的物体
            foreach (var obj in m_objectsToCheck)
            {
                if (obj != null)
                {
                    GameObject.Destroy(obj);
                }
            }

            m_objectsToCheck.Clear();
            m_shouldDestroy = false;
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (m_objectsToCheck.Contains(collision.gameObject))
        {
            // 如果碰撞的物体已经被标记为需要销毁,则不再标记
            return;
        }

        // 将需要销毁的物体添加到列表中
        m_objectsToCheck.Add(collision.gameObject);
    }

    private void OnCollisionExit(Collision collision)
    {
        if (m_objectsToCheck.Contains(collision.gameObject))
        {
            // 如果碰撞的物体已经离开碰撞范围,则将其从列表中移除
            m_objectsToCheck.Remove(collision.gameObject);
        }
    }

    // 在其他函数中,如果需要销毁该物体,则调用此函数
    public void DestroyOnNextFrame()
    {
        m_shouldDestroy = true;
    }
}

在这个示例代码中,我们创建了一个脚本 DestroyOnCollide,它被添加到需要检测碰撞的物体上。在这个脚本中,我们添加了一个列表 m_objectsToCheck,用于存储需要检测碰撞的物体。

OnCollisionEnter 函数中,如果碰撞的物体还没有被标记为需要销毁,则将其添加到列表中。

OnCollisionExit 函数中,如果碰撞的物体已经离开碰撞范围,则将其从列表中移除。

Update 函数中,如果标记 m_shouldDestroy 被激活,则遍历列表,销毁所有需要销毁的物体。由于销毁操作需要在下一帧执行,因此我们使用了一个标记变量 m_shouldDestroy 来协调销毁操作的执行时机。

最后,在其他函数中,如果需要销毁该物体,则调用 DestroyOnNextFrame 方法,将标记 m_shouldDestroy 激活。

这个方法不仅可以解决碰撞事件中同时销毁多个物体的问题,还可以避免在每次碰撞事件中都进行销毁操作,从而提高程序的性能。