예제 #1
0
        bool TryGetObjectInfo(out PooledObjectInfo info)
        {
            info = null;
            var pool = m_Pool;

            if (pool == null)
            {
                return(false);
            }
            if (pool.InactiveCount > 0)
            {
                info = pool.TakeFromInactiveObjs();
            }
            else
            {
                var beh = m_IfPoolEmpty;
                if (beh == PoolBehaviour.CreateNew)
                {
                    var refer = m_Reference;
                    if (refer == null)
                    {
                        return(false);
                    }
                    var newInf = new PooledObjectInfo(CreateObject(refer), Deactive);
                    m_InfoDict.Add(newInf.Obj, newInf);
                    newInf.SetParent(m_Container);
                    pool.Add(newInf);
                    info = pool.TakeFromInactiveObjs();
                }
                else if (beh == PoolBehaviour.ReuseActive)
                {
                    info = pool.TakeFromActiveObjs();
                }
            }
            return(info != null);
        }
예제 #2
0
        public void Awake()
        {
            if (m_IsInited)
            {
                return;
            }
            if (!ValidKey)
            {
                return;
            }
            if (!m_CashedInEditor)
            {
                CreateCashedObjects();
            }
            if (!ValidObjects)
            {
                return;
            }
            var dict    = m_InfoDict;
            var objs    = m_Objs;
            int count   = objs.Count;
            var objInfs = new PooledObjectInfo[count];

            for (int i = 0; i < count; ++i)
            {
                objInfs[i] = new PooledObjectInfo(objs[i], Deactive);
                dict.Add(objInfs[i].Obj, objInfs[i]);
            }
            var pool = new Pool <PooledObjectInfo>(objInfs);

            m_PoolCount          = pool.TotalCount;
            pool.OnDeactivation += OnDeactivationEvent;
            m_Pool     = pool;
            m_Objs     = null;
            m_IsInited = true;
        }
예제 #3
0
 void Deactive(PooledObjectInfo objInfo)
 {
     objInfo.OnDeactivation();
     m_Pool.ReturnToPool(objInfo);
 }
예제 #4
0
 private void OnDeactivationEvent(PooledObjectInfo objInfo)
 {
     objInfo?.SetParent(m_Container);
 }