美文网首页
Unity 学习笔记

Unity 学习笔记

作者: dyzsoft | 来源:发表于2019-04-25 10:07 被阅读0次

    Unity 对象池实现方案:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Linq;
    
    public class ObjectPool : MonoBehaviour
    {
    
        private List<GameObject> _objectList;
        private GameObject _objectToRecycle;
        private int _defaultPoolSize = 5;
    
        private static Dictionary<int, ObjectPool> _pool = new Dictionary<int, ObjectPool>();
    
        private void Init()
        {
            _objectList = new List<GameObject>(_defaultPoolSize);
            for (int i = 0; i < _defaultPoolSize; i++)
            {
                GameObject go = Instantiate(_objectToRecycle);
                go.transform.SetParent(transform);
                go.SetActive(false);
                _objectList.Add(go);
            }
        }
    
        private GameObject PoolObject(Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
        {
            GameObject freeObject = (from item in _objectList
                                     where item.activeSelf == false
                                     select item
            ).FirstOrDefault();
    
            if (freeObject == null)
            {
                freeObject = Instantiate(_objectToRecycle, position, rotation);
                freeObject.transform.SetParent(transform);
                _objectList.Add(freeObject);
            }
            else
            {
                freeObject.transform.position = position;
                freeObject.transform.rotation = rotation;
                freeObject.SetActive(true);
            }
            return freeObject;
        }
        public static void InitPool(GameObject original, int poolsize = 5)
        {
    
            int _originalID = original.GetInstanceID();
            if (!_pool.ContainsKey(_originalID))
            {
                GameObject objectPoolGameObject = new GameObject("ObjectPool:" + original.name);
                ObjectPool objPool = objectPoolGameObject.AddComponent<ObjectPool>();
                objPool._objectToRecycle = original;
                objPool._defaultPoolSize = poolsize;
                objPool.Init();
                _pool.Add(_originalID, objPool);
            }
        }
        public static GameObject GetInstance(int originalID, Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
        {
            return _pool[originalID].PoolObject(position, rotation);
        }
        public static GameObject GetInstance(GameObject original, Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
        {
            int id = original.GetInstanceID();
            InitPool(original);
            return _pool[id].PoolObject(position, rotation);
        }
    
        public void Release(GameObject obj)
        {
            obj.SetActive(false);
        }
    }
    

    相关文章

      网友评论

          本文标题:Unity 学习笔记

          本文链接:https://www.haomeiwen.com/subject/tnhagqtx.html