Exemple #1
0
    public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true)//是否跳场景清除
    {
        uint        crc         = Crc32.GetCrc32(path);
        ResourceObj resourceObj = GetObjectFromPool(crc);

        if (resourceObj == null)
        {
            resourceObj           = m_ResourceObjClassPool.Spawn();
            resourceObj.m_Crc     = crc;
            resourceObj.m_bClear  = bClear;
            resourceObj.m_ResItem = null;
            resourceObj           = ResourceMgr.Instance.LoadResoruce(path, resourceObj);
            if (resourceObj.m_ResItem.m_Obj != null)
            {
                resourceObj.m_CloneObj = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject;
            }
        }

        if (setSceneObj)
        {
            resourceObj.m_CloneObj.transform.SetParent(SceneTrs, false);
        }

        int tempID = resourceObj.m_CloneObj.GetInstanceID();

        if (!m_ResourceObjDic.ContainsKey(tempID))
        {
            m_ResourceObjDic.Add(tempID, resourceObj);
        }

        return(resourceObj.m_CloneObj);
    }
Exemple #2
0
    /// <summary>
    /// 清楚资源池缓存
    /// </summary>
    public void ClearCache()
    {
        List <uint> tempList = new List <uint>();

        foreach (uint crc in m_ObjectPoolDic.Keys)
        {
            List <ResourceObj> resObjs = m_ObjectPoolDic[crc];
            for (int i = resObjs.Count - 1; i >= 0; i--)
            {
                ResourceObj item = resObjs[i];
                if (!System.Object.ReferenceEquals(item, null) && resObjs[i].m_bClear)
                {
                    GameObject.Destroy(item.m_CloneObj);
                    m_ResourceObjDic.Remove(item.m_CloneObj.GetInstanceID());
                    item.Reset();
                    m_ResourceObjClassPool.Recycle(item);
                    resObjs.Remove(item);
                }
            }

            if (resObjs.Count <= 0)
            {
                tempList.Add(crc);
            }
        }

        for (int i = 0; i < tempList.Count; i++)
        {
            if (m_ObjectPoolDic.ContainsKey(tempList[i]))
            {
                m_ObjectPoolDic.Remove(tempList[i]);
            }
        }
        tempList.Clear();
    }
Exemple #3
0
    /// <summary>
    /// 清除某个资源在对象池中所有的对象
    /// </summary>
    /// <param name="crc"></param>
    public void ClearPoolObject(uint crc)
    {
        List <ResourceObj> st = null;

        if (!m_ObjectPoolDic.TryGetValue(crc, out st) || st == null)
        {
            return;
        }
        for (int i = st.Count - 1; i >= 0; i--)
        {
            ResourceObj resObj = st[i];
            if (resObj.m_bClear)
            {
                st.Remove(resObj);
                int tempID = resObj.m_CloneObj.GetInstanceID();
                GameObject.Destroy(resObj.m_CloneObj);
                resObj.Reset();
                m_ResourceObjDic.Remove(tempID);
                m_ResourceObjClassPool.Recycle(resObj);
            }
        }
        if (st.Count <= 0)
        {
            m_ObjectPoolDic.Remove(crc);
        }
    }
Exemple #4
0
    /// <summary>
    /// 取消异步加载资源
    /// </summary>
    /// <returns>true为完全取消了,false表示可能还有其他相同操作的异步在进行,并没有取消</returns>
    public bool CancleLoad(ResourceObj resObj)
    {
        AsyncLoadResParam para = null;

        if (m_LoadingAssetDic.TryGetValue(resObj.m_Crc, out para) && m_LoadingAssetList[(int)para.m_Priority].Contains(para))
        {
            for (int i = para.m_CallBackList.Count - 1; i >= 0; i--)
            {
                AsyncCallBack tempCallBack = para.m_CallBackList[i];
                if (tempCallBack != null && resObj == tempCallBack.m_ResObj)
                {
                    tempCallBack.Reset();
                    m_AsyncCallBackPool.Recycle(tempCallBack);
                    para.m_CallBackList.Remove(tempCallBack);
                }
            }
            if (para.m_CallBackList.Count <= 0)
            {
                m_LoadingAssetList[(int)para.m_Priority].Remove(para);
                para.Reset();
                m_AsyncLoadResParamPool.Recycle(para);
                m_LoadingAssetDic.Remove(resObj.m_Crc);
                return(true);
            }
        }
        return(false);
    }
Exemple #5
0
    public void AsyncLoadResource(string path, ResourceObj resObj, OnAsyncFinish dealfinish, LoadResPriority priority)
    {
        ResourceItem item = GetCacheResourceItem(resObj.m_Crc);

        if (item != null)
        {
            resObj.m_ResItem = item;
            if (dealfinish != null)
            {
                dealfinish(path, resObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3);
            }
            return;
        }
        //判断是否在加载中
        AsyncLoadResParam para = null;

        if (!m_LoadingAssetDic.TryGetValue(resObj.m_Crc, out para) || para == null)
        {
            para            = m_AsyncLoadResParamPool.Spwan(true);
            para.m_Crc      = resObj.m_Crc;
            para.m_Path     = path;
            para.m_Priority = priority;
            m_LoadingAssetDic.Add(resObj.m_Crc, para);
            m_LoadingAssetList[(int)priority].Add(para);
        }

        //往回调列表里面加回调
        AsyncCallBack callBack = m_AsyncCallBackPool.Spwan(true);

        callBack.m_DealFinish = dealfinish;
        callBack.m_ResObj     = resObj;
        para.m_CallBackList.Add(callBack);
    }
Exemple #6
0
    /// <summary>
    /// 同步加载
    /// </summary>
    /// <param name="path">路径</param>
    /// <param name="setSceneObj">是否设置父节点为场景节点</param>
    /// <param name="bClear">跳场景是否清楚,默认清除</param>
    /// <returns></returns>
    public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true)
    {
        uint        crc    = Crc.GetCRC32(path);
        ResourceObj resObj = GetObjectFromPool(crc);

        if (resObj == null)
        {
            resObj          = m_ResourceObjClassPool.Spawn();
            resObj.m_Crc    = crc;
            resObj.m_bClear = bClear;
            //resMgr提供加载方法
            resObj = ResourceManger.Instance.LoadResource(path, resObj);
            if (resObj.m_ResourceItem.m_obj != null)
            {
                resObj.m_CloneObj   = GameObject.Instantiate(resObj.m_ResourceItem.m_obj) as GameObject;
                resObj.m_OffineData = resObj.m_CloneObj.GetComponent <OffineData>();
            }
        }

        if (setSceneObj)
        {
            //因为SetParent十分耗费性能,所以加一个开关
            resObj.m_CloneObj.transform.SetParent(SceenTrs, true);
        }

        //resObj.m_OffineData.ResetProp();//还原
        long guid = resObj.m_CloneObj.GetInstanceID();

        if (!m_ResourceObjDic.ContainsKey(guid))
        {
            m_ResourceObjDic.Add(guid, resObj);
        }

        return(resObj.m_CloneObj);
    }
Exemple #7
0
    /// <summary>
    /// 从对象池取对象
    /// </summary>
    /// <param name="crc"></param>
    /// <returns></returns>
    protected ResourceObj GetObjectFromPool(uint crc)
    {
        List <ResourceObj> st = null;

        if (m_ObjectPoolDic.TryGetValue(crc, out st) && st != null && st.Count > 0)
        {
            ResourceManager.Instance.IncreaseResourceRef(crc);
            ResourceObj resObj = st[0];
            st.RemoveAt(0);
            GameObject obj = resObj.m_CloneObj;
            if (!System.Object.ReferenceEquals(obj, null))
            {
                if (!System.Object.ReferenceEquals(resObj.m_OfflineData, null))
                {
                    resObj.m_OfflineData.ResetProp();
                }
                resObj.m_Already = false;
#if UNITY_EDITOR
                if (obj.name.EndsWith("(Recycle)"))
                {
                    obj.name = obj.name.Replace("(Recycle)", "");
                }
#endif
            }
            return(resObj);
        }
        return(null);
    }
Exemple #8
0
    /// <summary>
    /// 同步加载
    /// </summary>
    /// <param name="path"></param>
    /// <param name="bClear"></param>
    /// <returns></returns>
    public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true)
    {
        uint        crc         = CRC32.GetCRC32(path);
        ResourceObj resourceObj = GetObjectFromPool(crc);

        if (resourceObj == null)
        {
            resourceObj          = m_ResourceObjClassPool.Spwan(true);
            resourceObj.m_Crc    = crc;
            resourceObj.m_bClear = bClear;
            resourceObj          = ResourceManager.Instance.LoadResource(path, resourceObj);
            if (!System.Object.ReferenceEquals(resourceObj.m_ResItem.m_Obj, null))
            {
                resourceObj.m_CloneObj    = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject;
                resourceObj.m_OfflineData = resourceObj.m_CloneObj.GetComponent <OfflineData>();
            }
        }
        if (setSceneObj)
        {
            resourceObj.m_CloneObj.transform.SetParent(SceneTrs);
        }
        int tempID = resourceObj.m_CloneObj.GetInstanceID();

        if (!m_ResourceObjDic.ContainsKey(tempID))
        {
            m_ResourceObjDic.Add(tempID, resourceObj);
        }
        return(resourceObj.m_CloneObj);
    }
Exemple #9
0
    /// <summary>
    /// 清空对象池
    /// </summary>
    public void ClearCache()
    {
        List <uint> tempList = new List <uint>();

        foreach (uint key in m_ObjectPoolDic.Keys)
        {
            List <ResourceObj> st = m_ObjectPoolDic[key];
            for (int i = st.Count - 1; i >= 0; i--)
            {
                ResourceObj resObj = st[i];
                if (!System.Object.ReferenceEquals(resObj.m_CloneObj, null) && resObj.m_bClear)
                {
                    GameObject.Destroy(resObj.m_CloneObj);
                    m_ResourceObjDic.Remove(resObj.m_CloneObj.GetInstanceID());
                    resObj.Reset();
                    m_ResourceObjClassPool.Recycle(resObj);
                }
            }
            if (st.Count <= 0)
            {
                tempList.Add(key);
            }
        }
        for (int i = 0; i < tempList.Count; i++)
        {
            uint temp = tempList[i];
            if (m_ObjectPoolDic.ContainsKey(temp))
            {
                m_ObjectPoolDic.Remove(temp);
            }
        }
        tempList.Clear();
    }
Exemple #10
0
 public override void Reset()
 {
     foreach (var ResourceObj in ActiveResources) //this will clear all the instances: TODO: possibly implement new method on modules to free memory (if needed)
     {
         ResourceObj.Reset();
     }
 }
Exemple #11
0
    public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destroyCache = false,
                              bool recycleParent = true)
    {
        if (obj == null)
        {
            return;
        }

        ResourceObj resObj = null;
        int         tempID = obj.GetInstanceID();

        if (!m_ResourceObjDic.TryGetValue(tempID, out resObj))
        {
            Debug.LogError("对象不是ObjMgr创建的");
            return;
        }

        if (resObj == null)
        {
            Debug.LogError("缓存的resObj为空");
        }


        if (resObj.m_Already)
        {
            Debug.LogError("对象已被放回对象池,是否清除引用");
            return;
        }
    }
Exemple #12
0
 public void Reset()
 {
     m_DealObjFinish = null;
     m_Param1        = null;
     m_Param2        = null;
     m_Param3        = null;
     m_ResObj        = null;
 }
Exemple #13
0
    /// <summary>
    /// 同步加载资源 针对给ObjectManager的接口
    /// </summary>
    /// <param name="path"></param>
    /// <param name="resObj"></param>
    /// <returns></returns>
    public ResourceObj LoadResource(string path, ResourceObj resObj)
    {
        if (resObj == null)
        {
            return(null);
        }
        uint         crc  = resObj.m_Crc == 0 ? CRC32.GetCRC32(path) : resObj.m_Crc;
        ResourceItem item = GetCacheResourceItem(crc);

        if (item != null)
        {
            resObj.m_ResItem = item;
            return(resObj);
        }

        Object obj = null;

#if UNITY_EDITOR
        if (!m_LoadFromAssetBundle)
        {
            item = AssetBundleManager.Instance.FindResourceItem(resObj.m_Crc);
            if (item != null && item != null)
            {
                obj = item.m_Obj as Object;
            }
            else
            {
                if (item == null)
                {
                    item       = new ResourceItem();
                    item.m_Crc = crc;
                }
                obj = LoadAssetByEditor <Object>(path);
            }
        }
#endif
        if (obj == null)
        {
            item = AssetBundleManager.Instance.LoadResouceAssetBundle(crc);
            if (item != null && item.m_AssetBundle != null)
            {
                if (item.m_Obj != null)
                {
                    obj = item.m_Obj as Object;
                }
                else
                {
                    obj = item.m_AssetBundle.LoadAsset <Object>(item.m_AssetName);
                }
            }
        }

        CacheResouce(path, ref item, crc, obj);
        resObj.m_ResItem = item;
        item.m_Clear     = resObj.m_bClear;

        return(resObj);
    }
Exemple #14
0
    /// <summary>
    /// 获得这个游戏对象的离线数据,(getCompute耗时)
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public OffineData FindOffineData(GameObject obj)
    {
        ResourceObj resObj = null;

        if (m_ResourceObjDic.TryGetValue(obj.GetInstanceID(), out resObj) && resObj != null)
        {
            return(resObj.m_OffineData);
        }

        return(null);
    }
Exemple #15
0
    /// <summary>
    /// 取消异步加载
    /// </summary>
    /// <param name="guid"></param>
    public void CancleLoad(long guid)
    {
        ResourceObj resObj = null;

        if (m_AsyncResObjs.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancleLoad(resObj))
        {
            m_AsyncResObjs.Remove(guid);
            resObj.Reset();
            m_ResourceObjClassPool.Recycle(resObj);
        }
    }
Exemple #16
0
    /// <summary>
    /// 根据实例化对象直接获取离线数据
    /// </summary>
    /// <param name="obj">GameObject</param>
    /// <returns></returns>
    public OfflineData FindOfflineData(GameObject obj)
    {
        OfflineData data   = null;
        ResourceObj resObj = null;

        m_ResourceObjDic.TryGetValue(obj.GetInstanceID(), out resObj);
        if (resObj != null)
        {
            data = resObj.m_OfflineData;
        }
        return(data);
    }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            var temp = new ResourceObj();

            temp.Desciption = tbxDescription.Text;
            temp.Type       = cbxType.SelectedValue.ToString();
            temp.Name       = tbxName.Text;



            Resource     = temp;
            DialogResult = System.Windows.Forms.DialogResult.Yes;
        }
 public virtual void FetchCamera()
 {
     if (ResourcePrefab.IsInv())
     {
         ResourceObj = CameraObj.GO;
     }
     if (ResourceObj != null)
     {
         MainCamera        = ResourceObj.GetComponent <Camera>();
         MainCameraTrans   = MainCamera.transform;
         PostProcessVolume = MainCamera.GetComponentInChildren <PostProcessVolume>();
         Callback_OnFetchCamera?.Invoke(MainCamera);
     }
 }
Exemple #19
0
    /// <summary>
    /// 对象池中取出obj,没有就新例化一个 同步加载
    /// </summary>
    /// <param name="path">资源路径</param>
    /// <param name="setSceneObj">是否设置到场景对象池管理位置</param>
    /// <param name="bClear"></param>
    /// <param name="targetTransform">实例化到此tranform下</param>
    /// <returns></returns>
    public GameObject SpwanObjFromPool(string path, bool setSceneObj = false, bool bClear = true, Transform targetTransform = null)
    {
        uint        crc         = CRC32.GetCRC32(path);
        ResourceObj resourceObj = GetObjectFromPool(crc);

        if (resourceObj == null)
        {
            resourceObj          = m_ResourceObjClassPool.Spawn(true);
            resourceObj.m_Crc    = crc;
            resourceObj.m_bClear = bClear;
            //ResourceManager提供加载方法
            resourceObj = ResourceManager.Instance.LoadResource(path, resourceObj);

            if (resourceObj.m_ResItem.m_Obj != null)
            {
                resourceObj.m_CloneObj = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject;
                if (resourceObj.m_CloneObj.GetComponent <OfflineData>() != null)
                {
                    resourceObj.m_OfflineData = resourceObj.m_CloneObj.GetComponent <OfflineData>();
                }
            }
        }
        if (targetTransform != null)
        {
            resourceObj.m_CloneObj.transform.SetParent(targetTransform, true);
            if (resourceObj.m_OfflineData)
            {
                resourceObj.m_OfflineData.ResetProp();
            }
        }
        else
        {
            if (setSceneObj)
            {
                resourceObj.m_CloneObj.transform.SetParent(SceneTrs, false);
            }
        }

        int tempID = resourceObj.m_CloneObj.GetInstanceID();

        if (!m_ResourceObjDic.ContainsKey(tempID))
        {
            m_ResourceObjDic.Add(tempID, resourceObj);
        }

        return(resourceObj.m_CloneObj);
    }
Exemple #20
0
    /// <summary>
    ///  不需要实例化的资源的卸载,根据 ResouceObj
    /// </summary>
    /// <param name="resObj"></param>
    /// <param name="destoryObj"></param>
    /// <returns></returns>
    public bool ReleaseResouce(ResourceObj resObj, bool destoryObj = false)
    {
        if (resObj == null)
        {
            return(false);
        }
        ResourceItem item = null;

        if (!AssetDic.TryGetValue(resObj.crc, out item) || null == item)
        {
            Debug.LogError("AssetDic 里不存在该资源:" + resObj.cloneObj.name + "  可能释放了多次");
        }
        GameObject.Destroy(resObj.cloneObj);
        item.RefCount--;
        DestoryResouceItme(item, destoryObj);
        return(true);
    }
Exemple #21
0
    /// <summary>
    /// 根据ResourceObj卸载资源
    /// </summary>
    /// <param name="resObj"></param>
    /// <param name="destroyObj"></param>
    /// <returns></returns>
    public bool ReleaseResource(ResourceObj resObj, bool destroyObj = false)
    {
        if (resObj == null)
        {
            return(false);
        }
        //return ReleaseResource(resObj.m_CloneObj, destroyObj);
        ResourceItem item = null;

        if (!AssetDic.TryGetValue(resObj.m_Crc, out item) || item == null)
        {
            Debug.LogError("AssetDic里不存在该资源:" + resObj.m_CloneObj.name);
        }
        //?
        GameObject.Destroy(resObj.m_CloneObj);
        item.RefCount--;
        DestroyResourceItem(item, destroyObj);
        return(true);
    }
Exemple #22
0
    /// <summary>
    /// 资源加载完成回调
    /// </summary>
    /// <param name="path">路径</param>
    /// <param name="resObj">中间类</param>
    /// <param name="param1">参数1</param>
    /// <param name="param2">参数2</param>
    /// <param name="param3">参数3</param>
    void OnLoadResourceObjFinish(string path, ResourceObj resObj, object param1 = null, object param2 = null, object param3 = null)
    {
        if (resObj == null)
        {
            return;
        }

        if (resObj.m_ResItem.m_Obj == null)
        {
#if UNITY_EDITOR
            Debug.LogError("异步资源加载的资源为空:" + path);
#endif
        }
        else
        {
            resObj.m_CloneObj    = GameObject.Instantiate(resObj.m_ResItem.m_Obj) as GameObject;
            resObj.m_OfflineData = resObj.m_CloneObj.GetComponent <OfflineData>();
        }

        //加载完成就从正在加载的异步中移除
        if (m_AsyncResObjs.ContainsKey(resObj.m_Guid))
        {
            m_AsyncResObjs.Remove(resObj.m_Guid);
        }

        if (resObj.m_CloneObj != null && resObj.m_SetSceneParent)
        {
            resObj.m_CloneObj.transform.SetParent(SceneTrs, false);
        }

        if (resObj.m_DealFinis != null)
        {
            int tempID = resObj.m_CloneObj.GetInstanceID();
            if (!m_ResourceObjDic.ContainsKey(tempID))
            {
                m_ResourceObjDic.Add(tempID, resObj);
            }

            resObj.m_DealFinis(path, resObj.m_CloneObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3);
        }
    }
Exemple #23
0
    /// <summary>
    /// 异步对象加载
    /// </summary>
    /// <param name="path"></param>
    /// <param name="fealFinish"></param>
    /// <param name="priority"></param>
    /// <param name="setSceneObject"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    /// <param name="bClear"></param>
    public long InstantiateObjectAsync(string path, OnAsyncObjFinish dealFinish, ELoadResPriority priority, bool setSceneObject = false, object param1 = null, object param2 = null, object param3 = null, bool bClear = true)
    {
        if (string.IsNullOrEmpty(path))
        {
            return(0);
        }
        uint        crc    = CRC32.GetCRC32(path);
        ResourceObj resObj = GetObjectFromPool(crc);

        if (resObj != null)
        {
            if (setSceneObject)
            {
                resObj.m_CloneObj.transform.SetParent(SceneTrs, false);
            }
            if (dealFinish != null)
            {
                dealFinish(path, resObj.m_CloneObj, param1, param2, param3);
            }

            return(resObj.m_Guid);
        }

        long guid = ResourceManager.Instance.CreateGuid();

        m_AsyncResObjs.Add(guid, resObj);

        resObj                  = m_ResourceObjClassPool.Spawn(true);
        resObj.m_Crc            = crc;
        resObj.m_SetSceneParent = setSceneObject;
        resObj.m_bClear         = bClear;
        resObj.m_DealFinis      = dealFinish;
        resObj.m_Param1         = param1;
        resObj.m_Param2         = param2;
        resObj.m_Param3         = param3;

        //调用ResourceManager的异步加载接口
        ResourceManager.Instance.AsyncLoadResource(path, resObj, OnLoadResourceObjFinish, priority);
        return(guid);
    }
Exemple #24
0
    /// <summary>
    /// resobj加载完成后回调
    /// </summary>
    /// <param name="path">路径</param>
    /// <param name="resObj">中间类</param>
    /// <param name="param1">参数1</param>
    /// <param name="param2">参数2</param>
    /// <param name="param3">参数3</param>
    protected void OnLoadResourceObjFinish(string path, ResourceObj resObj)
    {
        if (resObj == null)
        {
            return;
        }
        if (resObj.m_ResourceItem.m_obj == null)
        {
#if UNITY_EDITOR
            Debug.Log("异步加载的资源为空!" + path);
#endif
        }
        else
        {
            resObj.m_CloneObj   = GameObject.Instantiate(resObj.m_ResourceItem.m_obj) as GameObject;
            resObj.m_OffineData = resObj.m_CloneObj.GetComponent <OffineData>();
        }

        //加载完成后就可以从正在加载列表移除
        if (m_AsyncResObjs.ContainsKey(resObj.m_Guid))
        {
            m_AsyncResObjs.Remove(resObj.m_Guid);
        }

        if (resObj.m_SetSceneParent)
        {
            resObj.m_CloneObj.transform.SetParent(SceenTrs, false);
        }
        //resObj.m_OffineData.ResetProp();//还原
        //调回调
        if (resObj.m_DealFinish != null)
        {
            long tempID = resObj.m_CloneObj.GetInstanceID();
            if (!m_ResourceObjDic.ContainsKey(tempID))
            {
                m_ResourceObjDic.Add(tempID, resObj);
            }
            resObj.m_DealFinish(path, resObj.m_CloneObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3);
        }
    }
Exemple #25
0
    /// <summary>
    /// 异步加载
    /// </summary>
    /// <param name="path"></param>
    /// <param name="dealFinish"></param>
    /// <param name="priority"></param>
    /// <param name="setSceneObject"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    /// <param name="bClear"></param>
    public long InstantiateObject(string path, OnAsyncObjFinish dealFinish, LoadResPriority priority,
                                  bool setSceneObject = false, object param1 = null, object param2 = null, object param3 = null, bool bClear = true)
    {
        if (string.IsNullOrEmpty(path))
        {
            return(0);
        }
        uint        crc    = Crc.GetCRC32(path);
        ResourceObj resObj = GetObjectFromPool(crc);//检查缓存中是否存在

        if (resObj != null)
        {
            if (setSceneObject)
            {
                resObj.m_CloneObj.transform.SetParent(SceenTrs);
            }
            if (dealFinish != null)
            {
                dealFinish(path, resObj.m_CloneObj, param1, param2, param3);
            }
            return(resObj.m_Guid);
        }

        long guid = ResourceManger.Instance.CreatGuid();

        //不存在则创建
        resObj                  = m_ResourceObjClassPool.Spawn();
        resObj.m_Crc            = crc;
        resObj.m_DealFinish     = dealFinish;
        resObj.m_bClear         = bClear;
        resObj.m_SetSceneParent = setSceneObject;
        resObj.m_Param1         = param1;
        resObj.m_Param2         = param2;
        resObj.m_Param3         = param3;
        //resMgr异步加载
        ResourceManger.Instance.AsyncLoadResource(path, resObj, OnLoadResourceObjFinish, priority);
        return(guid);
    }
Exemple #26
0
    /// <summary>
    /// 查询资源池中是否有对应资源,取得对象
    /// </summary>
    /// <param name="crc"></param>
    /// <returns></returns>
    protected ResourceObj GetObjectFromPool(uint crc)
    {
        //查询是否已经缓存了资源,如果有直接返回
        List <ResourceObj> resourceObjs = null;

        if (m_ObjectPoolDic.TryGetValue(crc, out resourceObjs) && resourceObjs != null && resourceObjs.Count > 0)
        {
            //resMgr引用计数
            ResourceManger.Instance.IncreaseResourceRef(crc);
            //取得缓存的obj
            ResourceObj resObj = resourceObjs[0];
            resourceObjs.RemoveAt(0);
            GameObject obj = resObj.m_CloneObj;
            //校验是否为null,比obj == null还快。
            if (!System.Object.ReferenceEquals(obj, null))
            {
                resObj.m_Already = false;
                if (resObj.m_OffineData != null)
                {
                    resObj.m_OffineData.ResetProp();//还原
                }
                //if(!obj.activeSelf)
                //    obj.SetActive(true);
#if UNITY_EDITOR
                //编辑器模式下为了方便查看,改个名,如果是实机模式下改名消耗gc,所以不改名。
                if (obj.name.EndsWith("(Recycle)"))
                {
                    obj.name = obj.name.Replace("(Recycle)", "");
                }
#endif
            }

            return(resObj);
        }
        return(null);
    }
Exemple #27
0
    protected ResourceObj GetObjectFromPool(uint crc)
    {
        List <ResourceObj> st = null;

        if (m_ObjectPoolDict.TryGetValue(crc, out st) && st != null && st.Count > 0)
        {
            ResourceObj resObj = st[0];
            st.RemoveAt(0);
            GameObject obj = resObj.m_CloneObj;
            if (!System.Object.ReferenceEquals(obj, null))//这个比==快
            {
#if UNITY_EDITOR
                if (obj.name.EndsWith("(Recycle)"))
                {
                    obj.name = obj.name.Replace("(Recycle)", "");
                }
#endif
            }

            return(resObj);
        }

        return(null);
    }
Exemple #28
0
    /// <summary>
    /// 资源释放
    /// </summary>
    /// <param name="obj">释放对象</param>
    /// <param name="maxCacheCount">最大缓冲数量,默认-1无限数量</param>
    /// <param name="destroyCache">是否清理掉缓存,默认否</param>
    /// <param name="recycleParent">是否重新放回到回收节点下</param>
    public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destroyCache = false, bool recycleParent = true)
    {
        if (System.Object.ReferenceEquals(obj, null))
        {
            return;
        }
        ResourceObj resObj = null;
        int         tempID = obj.GetInstanceID();

        if (!m_ResourceObjDic.TryGetValue(tempID, out resObj))
        {
            Debug.Log(obj.name + "对象不是ObjectManager创建的!");
            return;
        }
        if (resObj == null)
        {
            Debug.LogError("缓存的Resourceobj为空");
        }
        if (resObj.m_Already)
        {
            Debug.LogError("该对象已经放回对象池了,检查自己是否清空引用!");
            return;
        }
#if UNITY_EDITOR
        obj.name += "(Recycle)";
#endif

        List <ResourceObj> st = null;
        if (maxCacheCount == 0)
        {
            m_ResourceObjDic.Remove(tempID);
            ResourceManager.Instance.ReleaseResource(resObj, destroyCache);
            resObj.Reset();
            m_ResourceObjClassPool.Recycle(resObj);
        }
        else
        {
            if (!m_ObjectPoolDic.TryGetValue(resObj.m_Crc, out st) || st == null)
            {
                st = new List <ResourceObj>();
                m_ObjectPoolDic.Add(resObj.m_Crc, st);
            }
            if (resObj.m_CloneObj)
            {
                if (recycleParent)
                {
                    resObj.m_CloneObj.transform.SetParent(RecyclePoolTrs);
                }
                else
                {
                    resObj.m_CloneObj.SetActive(false);
                }
            }
            if (maxCacheCount < 0 || st.Count < maxCacheCount)
            {
                st.Add(resObj);
                resObj.m_Already = true;
                ResourceManager.Instance.DecreaseResourceRes(resObj);
            }
            else
            {
                m_ResourceObjDic.Remove(tempID);
                ResourceManager.Instance.ReleaseResource(resObj, destroyCache);
                resObj.Reset();
                m_ResourceObjClassPool.Recycle(resObj);
            }
        }
    }
Exemple #29
0
    /// <summary>
    /// 该对象是否是对象池创建的
    /// </summary>
    /// <returns></returns>
    public bool IsObjectManagerCreate(GameObject obj)
    {
        ResourceObj resObj = m_ResourceObjDic[obj.GetInstanceID()];

        return(resObj == null ? false : true);
    }
Exemple #30
0
    /// <summary>
    /// 异步加载
    /// ?一直在运行
    /// </summary>
    /// <returns></returns>
    IEnumerator AsyncLoadCor()
    {
        long lastYiledTime             = System.DateTime.Now.Ticks;
        List <AsyncCallBack> callBacks = null;
        bool hadYiled = false;

        while (true)
        {
            //上一次yield的时间
            for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++)
            {
                List <AsyncLoadResParam> loadingList = m_LoadingAssetList[i];
                if (loadingList.Count <= 0)
                {
                    continue;
                }
                AsyncLoadResParam loadingItem = loadingList[0];
                loadingList.RemoveAt(0);
                callBacks = loadingItem.m_CallBackList;

                Object       obj  = null;
                ResourceItem item = null;
#if UNITY_EDITOR
                if (!m_LoadFromAssetBundle)
                {
                    obj = LoadAssetByEditor <Object>(loadingItem.m_Path);
                    //模拟异步加载
                    yield return(new WaitForSeconds(0.5f));

                    item = AssetBundleManager.Instance.FindResourceItem(loadingItem.m_Crc);
                }
#endif
                if (obj == null)
                {
                    item = AssetBundleManager.Instance.LoadResourceAssetBundle(loadingItem.m_Crc);
                    if (item != null && item.m_AssetBundle)
                    {
                        AssetBundleRequest abRequest = null;
                        if (loadingItem.m_Sprite)
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync <Sprite>(item.m_AssetName);
                        }
                        else
                        {
                            abRequest = item.m_AssetBundle.LoadAssetAsync(item.m_AssetName);
                        }
                        yield return(abRequest);

                        if (abRequest.isDone)
                        {
                            obj = abRequest.asset;
                        }
                        lastYiledTime = System.DateTime.Now.Ticks;
                    }
                }

                CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBacks.Count);

                for (int j = 0; j < callBacks.Count; j++)
                {
                    AsyncCallBack callBack = callBacks[j];
                    if (callBack != null && callBack.m_DealFinish != null && callBack.m_ResObj != null)
                    {
                        ResourceObj tempResObj = callBack.m_ResObj;
                        tempResObj.m_ResItem = item;
                        callBack.m_DealFinish(loadingItem.m_Path, tempResObj, tempResObj.m_Param1, tempResObj.m_Param2, tempResObj.m_Param3);
                        callBack.m_DealFinish = null;
                        tempResObj            = null;
                    }

                    if (callBack != null && callBack.m_DealObjFinish != null)
                    {
                        callBack.m_DealObjFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2, callBack.m_Param3);
                        callBack.m_DealObjFinish = null;
                    }
                    callBack.Reset();
                    m_AsyncCallBackPool.Recycle(callBack);
                }
                obj = null;
                callBacks.Clear();
                m_LoadingAssetDic.Remove(loadingItem.m_Crc);

                loadingItem.Reset();
                m_AsyncLoadResParamPool.Recycle(loadingItem);

                if (System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME)
                {
                    yield return(null);

                    lastYiledTime = System.DateTime.Now.Ticks;
                    hadYiled      = true;
                }
            }

            if (hadYiled || System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME)
            {
                lastYiledTime = System.DateTime.Now.Ticks;
                yield return(null);
            }
        }
    }