Unity运行游戏中的对象池实现(重用)

时间:2017-05-16 19:44:41

标签: c# unity3d object-pooling unity3d-5

我有我的第一场比赛。一切正常。所以,这个问题是关于优化。

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

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

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

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

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

1 个答案:

答案 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以及如何使用它。

相关问题