如何在Unity中监视GameObject的破坏和实例化?

时间:2017-09-29 03:38:32

标签: c# unity3d unity5

我想要统一维护一个GameObjects列表。

在每个帧中使用type mem_array is array(0 to 7) of STD_LOGIC_VECTOR (31 downto 0); 方法之一是昂贵的,所以有没有任何方法来监视GameObject.Find的销毁和实例化,就像回调一样?

2 个答案:

答案 0 :(得分:1)

  

所以有任何方法来监视破坏和实例化   GameObjects喜欢回调?

没有。没有回调函数。

一个技巧和我这样做的方法是针对InstantiateDestroy函数创建一个包装器,然后使用这些包装器来创建和销毁GameObjects。在Object实例化或销毁之后,您可以轻松地执行操作。

下面是一个简单的包装器,它分别在实例化或销毁时从List添加和删除GameObject。如果需要,您甚至可以添加一个事件并委托给它。

List<GameObject> objList = new List<GameObject>();

void instantiateObj(GameObject obj)
{
    GameObject newInstance = Instantiate(obj);

    //Add to list
    objList.Add(newInstance);
}

void destroyObj(GameObject obj)
{
    Destroy(obj);

    //Remove from list
    objList.Remove(obj);
}

答案 1 :(得分:1)

  

那么有没有任何方法来监视GameObjects的破坏和实例化,比如回调?

不,没有。

即使有,在垃圾收集者之外,追踪每个物体的实例化和/或破坏(处置)无论如何都是个坏主意。

您想要的只是管理您需要管理的对象,在这种情况下,FactoryDisposable模式的简单组合就可以。

在网络上查看Unity(或任何其他游戏引擎,甚至一般)的Pool模式的实现。他们将提供很好的例子。

或者,作为一个简单的实现,如果解耦不是问题,并且您考虑到特定的MonoBehaviour,则可以使对象自行管理,在类上使用静态list并进行制作对象在OnEnable() + OnDisable()Start() + OnDestroy()上自行添加和自行删除:

public static List<GameObject> spawnedObjects = new List<GameObject>();

void Start()
{
    spawnedObjects.Add(gameObject);
}

void OnDestroy()
{
    spawnedObjects.Remove(gameObject);
}

在其他地方,在另一个班级(或者,很可能是你的GameManager):

foreach(var obj in YourClass.spawnedObjects){
    //Do something with every spawned object with a YourClass component here...
}