Beispiel #1
0
 /// <summary>
 /// 供ObjectManager使用
 /// </summary>
 /// <param name="objectItem"></param>
 /// <param name="isDestroyCache"></param>
 /// <returns></returns>
 public bool ReleaseObjectResource(ObjectItem objectItem, bool isDestroyCache = false)
 {
     if (objectItem == null)
     {
         return(false);
     }
     Object.Destroy(objectItem.CloneObj);
     objectItem.PrimitiveAssetItem.RefCount--;
     if (isDestroyCache)
     {
         DestroyAsset(objectItem.PrimitiveAssetItem, isDestroyCache);
     }
     return(true);
 }
Beispiel #2
0
 public int DecreaseResourceRef(ObjectItem objectItem, int refCount = 1)
 {
     return(objectItem == null?DecreaseResourceRef(objectItem.Crc, refCount) : 0);
 }
Beispiel #3
0
        /// <summary>
        /// 缓存数不包括预加载的
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="maxCacheCount"></param>
        /// <param name="isDestroyPrimitiveCache"></param>
        /// <param name="recyleParent"></param>
        public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool isDestroyPrimitiveCache = false,
                                  bool recyleParent = true)
        {
            if (obj == null)
            {
                return;
            }
            ObjectItem objectItem = null;
            int        guid       = obj.GetInstanceID();

            if (!ObjectItemsInstanceTempDic.TryGetValue(guid, out objectItem))
            {
                Debug.LogError(obj.name + "创建与回收的id不一致或对象非框架加载");
                return;
            }

            if (objectItem.isAlreadyRelease)
            {
                Debug.LogError(obj.name + "该对象已放入对象池");
                return;
            }
#if UNITY_EDITOR
            obj.name += "(Recycle)";
#endif
            if (maxCacheCount == 0)
            {
                ObjectItemsInstanceTempDic.Remove(guid);
                ResourceManager.Instance.ReleaseObjectResource(objectItem, isDestroyPrimitiveCache);
                objectItem.Reset();
                objectItemNativePool.Recycle(objectItem);
            }
            else //回收到对象池
            {
                if (!objectItemsInstancePoolDic.TryGetValue(objectItem.Crc, out List <ObjectItem> objectItems))
                {
                    objectItems = new List <ObjectItem>(); //TODO
                    objectItemsInstancePoolDic.Add(objectItem.Crc, objectItems);
                }

                if (objectItem.CloneObj)
                {
                    if (recyleParent)
                    {
                        objectItem.CloneObj.transform.SetParent(RecylePoolTrans);
                    }
                    else
                    {
                        objectItem.CloneObj.SetActive(false);
                    }
                }
                //无限缓存
                if (maxCacheCount < 0 || objectItems.Count < maxCacheCount)
                {
                    objectItems.Add(objectItem);
                    objectItem.isAlreadyRelease = true;
                    ResourceManager.Instance.DecreaseResourceRef(objectItem);
                }
                else
                {
                    ObjectItemsInstanceTempDic.Remove(guid);
                    ResourceManager.Instance.ReleaseObjectResource(objectItem, isDestroyPrimitiveCache);
                    objectItem.Reset();
                    objectItemNativePool.Recycle(objectItem);
                }
            }
        }
Beispiel #4
0
        public long AsyncInstantiateObject(string path, OnAsyncFinish outerCallBack, LoadResPriority priority,
                                           bool isSetSceneTrans = false, bool isClear = true, params object[] paramList)
        {
            if (string.IsNullOrEmpty(path))
            {
                return(0);
            }
            uint       crc        = CRC32.GetCRC32(path);
            ObjectItem objectItem = GetCacheObjectItemFromPoolDic(crc);

            if (objectItem != null)
            {
                if (isSetSceneTrans)
                {
                    objectItem.CloneObj.transform.SetParent(SceneTrans, false);
                }
                outerCallBack?.Invoke(path, objectItem.CloneObj, paramList);
                return(objectItem.Guid);
            }

            objectItem = objectItemNativePool.Spawn();
            if (objectItem == null)
            {
                Debug.LogError("null");
            }

            long guid = ResourceManager.Instance.CreateGuid();

            objectItem.Crc = crc;
            objectItem.IsSetSceneParent = isSetSceneTrans;
            objectItem.isClear          = isClear;
            objectItem.outerCallBack    = outerCallBack;
            objectItem.paramList        = paramList;
            //调用ResourceManager异步加载接口

            ResourceManager.Instance.AsyncLoadResource(path, objectItem, (_path, item, plist) =>
            {
                if (item == null)
                {
                    return;
                }
                if (item.PrimitiveAssetItem.AssetObject == null)
                {
#if UNITY_EDITOR
                    Debug.LogError("异步资源加载为空" + _path);
#endif
                }
                else
                {
                    //实例化
                    item.CloneObj          = Object.Instantiate(item.PrimitiveAssetItem.AssetObject) as GameObject;
                    objectItem.OfflineData = item.CloneObj.GetComponent <OfflineData.OfflineData>();
                }

//加载完成移除
                if (asyncLoadingObjectDic.ContainsKey(item.Guid))
                {
                    asyncLoadingObjectDic.Remove(item.Guid);
                }
                if (item.CloneObj != null && item.IsSetSceneParent)
                {
                    item.CloneObj.transform.SetParent(SceneTrans);
                }

                if (item.outerCallBack != null)
                {
                    if (item.CloneObj != null)
                    {
                        int _guid = item.CloneObj.GetInstanceID();
                        if (!ObjectItemsInstanceTempDic.ContainsKey(_guid))
                        {
                            ObjectItemsInstanceTempDic.Add(_guid, item);
                        }
                    }

                    item.outerCallBack?.Invoke(_path, item.CloneObj, plist);
                }
            }, priority);
            return(guid);
        }
Beispiel #5
0
        /// <summary>
        /// 是否该脚本创建
        /// </summary>
        /// <returns></returns>
        public bool IsFrameCreat(GameObject gameObject)
        {
            ObjectItem objectItem = ObjectItemsInstanceTempDic[gameObject.GetInstanceID()];

            return(objectItem != null);
        }