Exemplo n.º 1
0
        /// <summary>
        /// 事前にプールする
        /// </summary>
        /// <param name="prefab"></param>
        public void InstantiateSleapPool(GameObject prefab)
        {
            // プレハブのインスタンスIDをkeyとする
            int key = prefab.GetInstanceID();

            // Dictionaryにkeyが存在しなければ作成
            if (_pool.ContainsKey(key) == false)
            {
                DictionaryAdd(key);
            }

            //新たに生成する
            GameObject     go         = Instantiate(prefab);
            ObjectPoolItem itemScript = go.GetComponent <ObjectPoolItem>();

            itemScript.LinkedListRoot = _pool[key];
            itemScript.PrefabID       = key;

            //エディタではテストしやすいようにObjectPoolの子にしておく
#if UNITY_EDITOR
            go.transform.parent = gameObject.transform;
#endif

            SleepGameObject(itemScript);//非アクティブ化
        }
Exemplo n.º 2
0
        /// <summary>
        /// プールして非アクティブにする。
        /// </summary>
        /// <param name="item"></param>
        public void SleepGameObject(ObjectPoolItem item)
        {
            if (item == null)
            {
                Debug.Log("ObjectPoolItem is null");
                return;
            }
            if (item.LinkedListRoot == null)
            {
                //シーンに直接置いた時など、GetGameObjectしてないのでプール先が無い状態はDestoroy
                Destroy(item._gameObject);
                return;
            }
            if (item._sleep == true)
            {
                return;                     //二度寝防止
            }
            //リンクリストに接続
            item.next = item.LinkedListRoot.next;
            item.LinkedListRoot.next = item;

            //接続数を増やす
            ++_poolCount[item.PrefabID];

            //スリープ処理
            item.OnSleep();
            item._sleep = true;
            item._gameObject.SetActive(false);
        }
Exemplo n.º 3
0
        /// <summary>
        /// プールして非アクティブにする
        /// GetComponentしてSleepGameObject(ObjectPoolItem)をする(速度的に非推奨)
        /// ObjectPoolItemがなければDestoroy
        /// </summary>
        /// <param name="obj"></param>
        public void SleepGameObject(GameObject obj)
        {
            ObjectPoolItem item = obj.GetComponent <ObjectPoolItem>();

            if (item == null)
            {
                Destroy(obj);
            }
            SleepGameObject(item);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 指定フレーム後にプールして非アクティブにする
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="delayFrameCount"></param>
        public void SleepGameObject(GameObject obj, int delayFrameCount)
        {
            ObjectPoolItem item = obj.GetComponent <ObjectPoolItem>();

            if (item == null)
            {
                Debug.LogError("ObjectPoolItemComponent is null");
                Destroy(obj, delayFrameCount);//フレームではなく時間なので注意
            }
            item.DelayPool(delayFrameCount);
            //SleepGameObject(item, delayFrameCount);
        }
Exemplo n.º 5
0
        private Dictionary <int, int> _poolCount       = new Dictionary <int, int>();//プール数管理用

        // ゲームオブジェクトをプールから取得、無ければ生成
        public GameObject GetGameObject(GameObject prefab, Vector3 v3_position, Quaternion qt_rotation)
        {
            // プレハブのインスタンスIDをkeyとする
            int key = prefab.GetInstanceID();

            // Dictionaryにkeyが存在しなければ作成
            if (_pool.ContainsKey(key) == false)
            {
                DictionaryAdd(key);
            }

            ObjectPoolItem item = _pool[key].next;

            // プールにあれば
            if (item != null)
            {
                //2個目を先頭につなぐ
                _pool[key].next = item.next;
                item.next       = null;

                //カウントを減らす
                --_poolCount[key];

                item._transform.position = v3_position;
                item._transform.rotation = qt_rotation;
                item._gameObject.SetActive(true);
                item._sleep = false;
                item.OnWakeUp();//初期化処理
                return(item._gameObject);
            }

            // プールが無いので新たに生成
            GameObject     go         = Instantiate(prefab, v3_position, qt_rotation);
            ObjectPoolItem itemScript = go.GetComponent <ObjectPoolItem>();

            itemScript.LinkedListRoot = _pool[key];
            itemScript.PrefabID       = key;

            //エディタではテストしやすいようにobjectpoolの子にしておく
#if UNITY_EDITOR
            go.transform.parent = gameObject.transform;
#endif

            return(go);
        }
Exemplo n.º 6
0
        /// <summary>
        /// プールからオブジェクトを1つ削除
        /// </summary>
        /// <param name="prefab"></param>
        public void DestroyPool(GameObject prefab)
        {
            int key = prefab.GetInstanceID();

            if (_pool.ContainsKey(key) == false)
            {
                return;                                 //プール無し
            }
            ObjectPoolItem item = _pool[key].next;

            // プールがあれば削除
            if (item != null)
            {
                _pool[key].next = item.next;//2個目を先頭につなぐ
                --_poolCount[key];
                Destroy(item._gameObject);
            }
        }
Exemplo n.º 7
0
 /// <summary>
 /// 指定フレーム後にプールして非アクティブにする
 /// </summary>
 /// <param name="item"></param>
 /// <param name="delayFrameCount"></param>
 public void SleepGameObject(ObjectPoolItem item, int delayFrameCount)
 {
     item.DelayPool(delayFrameCount);
 }