我想要统一维护一个GameObjects列表。
在每个帧中使用type mem_array is array(0 to 7) of STD_LOGIC_VECTOR (31 downto 0);
方法之一是昂贵的,所以有没有任何方法来监视GameObject.Find
的销毁和实例化,就像回调一样?
答案 0 :(得分:1)
所以有任何方法来监视破坏和实例化 GameObjects喜欢回调?
没有。没有回调函数。
一个技巧和我这样做的方法是针对Instantiate
和Destroy
函数创建一个包装器,然后使用这些包装器来创建和销毁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的破坏和实例化,比如回调?
不,没有。
即使有,在垃圾收集者之外,追踪每个物体的实例化和/或破坏(处置)无论如何都是个坏主意。
您想要的只是管理您需要管理的对象,在这种情况下,Factory
和Disposable
模式的简单组合就可以。
在网络上查看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...
}