1

我有我的第一个亚军游戏。一切正常。所以,这个问题是关于优化的。

在我的游戏中,有 15 个平台(玩家运行的道路预制件)。随机出 15 个任何 1 被实例化,并且这种情况一直在发生。当玩家通过几个平台时,留下的平台被摧毁。我制作了一个列表来跟踪平台并删除它们最后一个平台预制件(列表 [0])。新的会提前实例化。

随着游戏的临近,它变得越来越快,这意味着现在实例化/销毁的操作发生得越来越频繁。

我读到了对象池。我理解这个概念,并且我非常强烈地认为我应该在我的游戏中使用它。我创建了一个对象池。工作正常。现在我的问题 -

问题 - 我应该如何重用我创建的池中的对象?在我的游戏中,我想出的是 - 用户留下的平台应该从后向前改变位置(用户前进的方向)。我怎样才能做到这一点?

我遵循了这些教程 - https://www.youtube.com/playlist?list=PLLH3mUGkfFCXps_IYvtPcE9vcvqmGMpRK

4

1 回答 1

1

当玩家通过几个平台时,留下的平台被摧毁。我制作了一个列表来跟踪平台并删除它们最后一个平台预制件(列表 [0])。新的会提前实例化。

有很多方法可以使对象池化。其中之一包括将对象添加到队列并在使用时将其删除。当您想回收/销毁它们时,请将它们添加回列表中。


我应该如何重用我创建的池中的对象?

这真的很容易。而不是每次都这样做:

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);
}

当你完成使用 Object. 而不是这样做 Destroy(objFromPool);,重置那个游戏对象的位置,如果你想也可以禁用它,然后将它添加回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。然后,您可以使用该整数从池中获取对象。

您可以在ArrayObjectPooling 此处查看此方法的示例以及如何使用它。

于 2017-05-16T20:19:35.843 回答