方法完成时清除Unity C#列表 - 对象池

时间:2018-02-02 14:48:14

标签: c# unity3d object-pooling

我正在尝试在c#中为Unity创建一个简单的对象池。 到目前为止,我已经使用过这个类:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ObjectPool : MonoBehaviour
{

    public static ObjectPool ShareInstance;
    public List<GameObject> pooledObjects;
    public GameObject objectToPool;
    public int amountToPool;

    // Use this for initialization
    void Start()
    {
        pooledObjects = new List<GameObject>();

        for (int i = 0; i < amountToPool; i++)
        {
            GameObject obj = (GameObject)Instantiate(objectToPool);
            obj.SetActive(false);
            pooledObjects.Add(obj);
        }
    }

    void Awake()
    {
        ShareInstance = this;
    }

    public GameObject GetPooledObject()
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy)
            {
                return pooledObjects[i];
            }
        }
        return null;
    }
}

start方法正确地使我的预制件的非活动实例。但是,当我使用此代码调用GetPooledObject时,我发现错误:

    GameObject optionTile = ObjecdtPooler.ShareInstance.GetPooledObject();
    if (optionTile != null)
    {
        optionTile.SetActive(true);
    }

GetPooledObject方法似乎认为列表(pooledObjects)为空。这意味着只跳过此方法中的for循环,并返回null。我使用了debug.log,列表正确填充了我的预制件实例。但是当我调用GetPooledObject方法时,该列表被认为是空的。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

我希望amountToPool的初始值为0,或者如果它大于0,则所有对象都在使用中。 因此,当所有对象都在使用时,您应该扩展池以增加给定值。