Unity ObjectPoolManager 对象池

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

public class PoolManager : MonoBehaviour {

    Dictionary<int,Queue<ObjectInstance>> poolDictionary = new Dictionary<int, Queue<ObjectInstance>> ();

    static PoolManager _instance;

    public static PoolManager instance {
        get {
            if (_instance == null) {
                _instance = FindObjectOfType<PoolManager> ();
            }
            return _instance;
        }
    }

    public void CreatePool(GameObject prefab, int poolSize) {
        int poolKey = prefab.GetInstanceID ();

        if (!poolDictionary.ContainsKey (poolKey)) {
            poolDictionary.Add (poolKey, new Queue<ObjectInstance> ());

            GameObject poolHolder = new GameObject (prefab.name + " pool");
            poolHolder.transform.parent = transform;

            for (int i = 0; i < poolSize; i++) {
                ObjectInstance newObject = new ObjectInstance(Instantiate (prefab) as GameObject);
                poolDictionary [poolKey].Enqueue (newObject);
                newObject.SetParent (poolHolder.transform);
            }
        }
    }

    public void ReuseObject(GameObject prefab, Vector3 position, Quaternion rotation) {
        int poolKey = prefab.GetInstanceID ();

        if (poolDictionary.ContainsKey (poolKey)) {
            ObjectInstance objectToReuse = poolDictionary [poolKey].Dequeue ();
            poolDictionary [poolKey].Enqueue (objectToReuse);

            objectToReuse.Reuse (position, rotation);
        }
    }

    public class ObjectInstance {

        GameObject gameObject;
        Transform transform;

        bool hasPoolObjectComponent;
        PoolObject poolObjectScript;

        public ObjectInstance(GameObject objectInstance) {
            gameObject = objectInstance;
            transform = gameObject.transform;
            gameObject.SetActive(false);

            if (gameObject.GetComponent<PoolObject>()) {
                hasPoolObjectComponent = true;
                poolObjectScript = gameObject.GetComponent<PoolObject>();
            }
        }

        public void Reuse(Vector3 position, Quaternion rotation) {
            gameObject.SetActive (true);
            transform.position = position;
            transform.rotation = rotation;

            if (hasPoolObjectComponent) {
                poolObjectScript.OnObjectReuse ();
            }
        }

        public void SetParent(Transform parent) {
            transform.parent = parent;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值