我有我的第一场比赛。一切正常。所以,这个问题是关于优化。
在我的游戏中,有15个平台(播放器运行的道路预制件)。随机出15任何1实例化,这一直在发生。当玩家通过几个平台时,留下的平台会被摧毁。我制作了一个列表来跟踪平台并删除它们最后的平台预制(list [0])。并且新的实例将在未来实例化。
随着游戏的临近,它变得越来越快,这意味着现在更频繁地发生实例化/破坏的操作。
我读到了有关对象池的信息。我理解这个概念,并且我非常强烈地认为我应该在游戏中使用它。我创建了一个对象池。工作良好。现在我的问题 -
问题 - 如何从我创建的池中重用对象?在我的游戏中,我想到的是 - 用户留下的平台应该从后向前改变位置(用户前进的方向)。我怎样才能做到这一点?
我遵循了这些教程 - https://www.youtube.com/playlist?list=PLLH3mUGkfFCXps_IYvtPcE9vcvqmGMpRK
答案 0 :(得分:0)
当玩家通过几个平台时,留下的平台得到了 销毁。我列出了一个列表来跟踪平台并删除它们 最后一个平台预制(列表[0])。并且新的实例将在未来实例化。
有很多方法可以进行对象池化。其中之一包括将对象添加到队列中并在使用时将其删除。当您想要回收/销毁它们时,请将它们添加回List。
我应该如何重用我创建的池中的对象?
这真的很容易。而不是每次都这样做:
Instantiate(prefab, postion, Quaternion.identity);
当游戏在Start函数中开始并存储在Array / List中时,请多次执行:
List<GameObject> pool = new List<GameObject>();
void Start()
{
for (int i = 0; i < 50; i++)
{
GameObject tempObj = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
pool.Add(tempObj);
}
}
当您需要在游戏过程中实例化Object时,只需从List / Array中获取一个:
//Check if object is available in pool
if (pool.Count > 0)
{
//Object is. Return 1
GameObject objFromPool = pool[0];
//Enable the Object
objFromPool.SetActive(true);
}
else
{
//Object is NOT. Instantiate new one
GameObject objFromPool = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
//Enable the Object
objFromPool.SetActive(true);
}
使用完对象后。不要执行Destroy(objFromPool);
,而是重置该GameObject的位置,如果您想将其添加回List
,也可以将其禁用:
//Reset Pos
objFromPool.transform.position = Vector3.zero;
//Disable?
objFromPool.SetActive(false);
//Return back to the array
pool.Add(objFromPool);
最后,最好的方法是将所有对象实例化为数组或列表。使用您递增的整数。整数从0开始递增,直到达到list/array.Length-1
。然后,您可以使用该整数从池中获取Object。
您可以看到此方法的示例已实现为ArrayObjectPooling
here以及如何使用它。