Beispiel #1
0
        public IRes LoadResSync(ResSearchKeys resSearchKeys)
        {
            Add2Load(resSearchKeys);
            LoadSync();

            var res = ResMgr.Instance.GetRes(resSearchKeys, false);

            if (res == null)
            {
                Log.E("Failed to Load Res:" + resSearchKeys);
                return(null);
            }
            return(res);
        }
Beispiel #2
0
        public static IRes Create(ResSearchKeys resSearchKeys)
        {
            var retRes = mResCreators
                         .Where(creator => creator.Match(resSearchKeys))
                         .Select(creator => creator.Create(resSearchKeys))
                         .FirstOrDefault();

            if (retRes == null)
            {
                Log.E("Failed to Create Res. Not Find By ResSearchKeys:" + resSearchKeys);
                return(null);
            }

            return(retRes);
        }
Beispiel #3
0
        public void Add2Load(List <string> list)
        {
            if (list == null)
            {
                return;
            }

            for (var i = list.Count - 1; i >= 0; --i)
            {
                var resSearchRule = ResSearchKeys.Allocate(list[i]);

                Add2Load(resSearchRule);

                resSearchRule.Recycle2Cache();
            }
        }
Beispiel #4
0
        // Use this for initialization
        void Start()
        {
            // 添加创建器
            ResFactory.AddResCreator <MyResCreator>();

            var resLoader = ResLoader.Allocate();

            var resSearchKeys = ResSearchKeys.Allocate("myres://hello_world");

            var myRes = resLoader.LoadResSync(resSearchKeys);

            resSearchKeys.Recycle2Cache();

            Debug.Log(myRes.AssetName);
            Debug.Log(myRes.State);
        }
        public AssetData GetAssetData(ResSearchKeys resSearchRule)
        {
            AssetData result = null;

            if (resSearchRule.OwnerBundle != null && mUUID4AssetData != null)
            {
                return(mUUID4AssetData.TryGetValue(resSearchRule.OwnerBundle + resSearchRule.AssetName, out result) ? result : null);
            }

            if (resSearchRule.OwnerBundle == null && mAssetDataMap != null)
            {
                return(mAssetDataMap.TryGetValue(resSearchRule.AssetName, out result) ? result : null);
            }

            return(result);
        }
        public AssetData  GetAssetData(ResSearchKeys resSearchKeys)
        {
            if (mAssetDataTable == null)
            {
                mAssetDataTable = new AssetDataTable();

                for (var i = mAllAssetDataGroup.Count - 1; i >= 0; --i)
                {
                    foreach (var assetData in mAllAssetDataGroup[i].AssetDatas)
                    {
                        mAssetDataTable.Add(assetData);
                    }
                }
            }

            return(mAssetDataTable.GetAssetDataByResSearchKeys(resSearchKeys));
        }
Beispiel #7
0
        private void Add2Load(ResSearchKeys resSearchKeys, Action <bool, IRes> listener = null,
                              bool lastOrder = true)
        {
            var res = FindResInArray(mResList, resSearchKeys);

            if (res != null)
            {
                if (listener != null)
                {
                    AddResListenerRecord(res, listener);
                    res.RegisteOnResLoadDoneEvent(listener);
                }

                return;
            }

            res = ResMgr.Instance.GetRes(resSearchKeys, true);

            if (res == null)
            {
                return;
            }

            if (listener != null)
            {
                AddResListenerRecord(res, listener);
                res.RegisteOnResLoadDoneEvent(listener);
            }

            //无论该资源是否加载完成,都需要添加对该资源依赖的引用
            var depends = res.GetDependResList();

            if (depends != null)
            {
                foreach (var depend in depends)
                {
                    var searchRule = ResSearchKeys.Allocate(depend, null, typeof(AssetBundle));

                    Add2Load(searchRule);

                    searchRule.Recycle2Cache();
                }
            }

            AddRes2Array(res, lastOrder);
        }
Beispiel #8
0
        private static IRes FindResInArray(List <IRes> list, ResSearchKeys resSearchKeys)
        {
            if (list == null)
            {
                return(null);
            }

            for (var i = list.Count - 1; i >= 0; --i)
            {
                if (resSearchKeys.Match(list[i]))
                {
                    return(list[i]);
                }
            }

            return(null);
        }
Beispiel #9
0
        public void ReleaseRes(string resName)
        {
            if (string.IsNullOrEmpty(resName))
            {
                return;
            }

#if UNITY_EDITOR
            if (AssetBundleSettings.SimulateAssetBundleInEditor)
            {
                if (mCachedSpriteDict.ContainsKey(resName))
                {
                    var sprite = mCachedSpriteDict[resName];
                    GameObject.Destroy(sprite);
                    mCachedSpriteDict.Remove(resName);
                }
            }
#endif
            var resSearchRule = ResSearchKeys.Allocate(resName);

            var res = ResMgr.Instance.GetRes(resSearchRule);
            resSearchRule.Recycle2Cache();

            if (res == null)
            {
                return;
            }

            if (mWaitLoadList.Remove(res))
            {
                --mLoadingCount;
                if (mLoadingCount == 0)
                {
                    mListener = null;
                }
            }

            if (mResList.Remove(res))
            {
                res.UnRegisteOnResLoadDoneEvent(OnResLoadFinish);
                res.Release();
                ResMgr.Instance.ClearOnUpdate();
            }
        }
Beispiel #10
0
        public void ReleaseRes(string resName)
        {
            if (string.IsNullOrEmpty(resName))
            {
                return;
            }

            if (FromUnityToDll.Setting.SimulationMode)
            {
                if (mCachedSpriteDict.ContainsKey(resName))
                {
                    var sprite = mCachedSpriteDict[resName];
                    Object.Destroy(sprite);
                    mCachedSpriteDict.Remove(resName);
                }
            }

            var resSearchRule = ResSearchKeys.Allocate(resName);

            var res = ResMgr.Instance.GetRes(resSearchRule);

            resSearchRule.Recycle2Cache();

            if (res == null)
            {
                return;
            }

            if (mWaitLoadList.Remove(res))
            {
                --mLoadingCount;
                if (mLoadingCount == 0)
                {
                    mListener = null;
                }
            }

            if (mResList.Remove(res))
            {
                res.UnRegisteOnResLoadDoneEvent(OnResLoadFinish);
                res.Release();
                ResMgr.Instance.ClearOnUpdate();
            }
        }
        public IRes GetResBySearchKeys(ResSearchKeys resSearchKeys)
        {
            var assetName = resSearchKeys.AssetName;

            var reses = NameIndex
                        .Get(assetName);

            if (resSearchKeys.AssetType != null)
            {
                reses = reses.Where(res => res.AssetType == resSearchKeys.AssetType);
            }

            if (resSearchKeys.OwnerBundle != null)
            {
                reses = reses.Where(res => res.OwnerBundleName == resSearchKeys.OwnerBundle);
            }

            return(reses.FirstOrDefault());
        }
Beispiel #12
0
        public AsyncOperation LoadAsync(string sceneName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, System.Action listener = null)
        {
            mListener = listener;

            var resSearchRule = ResSearchKeys.Allocate(sceneName);

            if (ResFactory.AssetBundleSceneResCreator.Match(resSearchRule))
            {
                //加载的为场景
                IRes res = ResFactory.AssetBundleSceneResCreator.Create(resSearchRule);
#if UNITY_EDITOR
                if (FromUnityToDll.Setting.SimulationMode)
                {
                    string path = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle((res as AssetBundleSceneRes).AssetBundleName)[0];
                    if (!path.IsNullOrEmpty())
                    {
                        LoadSceneParameters sceneParameters = new LoadSceneParameters();
                        sceneParameters.loadSceneMode = loadSceneMode;
                        tempDepends.Clear();
                        return(UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(path, sceneParameters));
                    }
                }
                else
                {
                    DoLoadAsync();
                    tempDepends.Clear();
                    return(SceneManager.LoadSceneAsync(sceneName, loadSceneMode));
                }
#else
                DoLoadAsync();
                tempDepends.Clear();
                return(SceneManager.LoadSceneAsync(sceneName, loadSceneMode));
#endif
            }
            else
            {
                Log.E("场景名称错误!请检查名称是否正确或资源是否被标记!AssetName:" + sceneName);
            }


            return(null);
        }
Beispiel #13
0
        public IRes LoadResSync(ResSearchKeys resSearchKeys)
        {
            Add2Load(resSearchKeys);
            LoadSync();

            var res = ResMgr.Instance.GetRes(resSearchKeys, false);

            if (res == null)
            {
                Log.E("Failed to Load Res:" + resSearchKeys);
                return(null);
            }
            else
            {
                //清理缓存的依赖资源名称
                tempDepends.Clear();
            }

            return(res);
        }
        public ABUnit GetABUnit(string assetName)
        {
            var resSearchRule = ResSearchKeys.Allocate(assetName);

            AssetData data = GetAssetData(resSearchRule);

            resSearchRule.Recycle2Cache();

            if (data == null)
            {
                return(null);
            }

            if (mABUnitArray == null)
            {
                return(null);
            }

            return(mABUnitArray[data.AssetBundleIndex]);
        }
Beispiel #15
0
        protected void UnHoldDependRes()
        {
            var depends = GetDependResList();

            if (depends == null || depends.Length == 0)
            {
                return;
            }

            for (var i = depends.Length - 1; i >= 0; --i)
            {
                var resSearchRule = ResSearchKeys.Allocate(depends[i]);
                var res           = ResMgr.Instance.GetRes(resSearchRule, false);
                resSearchRule.Recycle2Cache();

                if (res != null)
                {
                    res.Release();
                }
            }
        }
Beispiel #16
0
        public bool IsDependResLoadFinish()
        {
            var depends = GetDependResList();

            if (depends == null || depends.Length == 0)
            {
                return(true);
            }

            for (var i = depends.Length - 1; i >= 0; --i)
            {
                var resSearchRule = ResSearchKeys.Allocate(depends[i]);
                var res           = ResMgr.Instance.GetRes(resSearchRule, false);
                resSearchRule.Recycle2Cache();

                if (res == null || res.State != ResState.Ready)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #17
0
        public IRes GetRes(ResSearchKeys resSearchKeys, bool createNew = false)
        {
            var res = mTable.GetResBySearchKeys(resSearchKeys);

            if (res != null)
            {
                return(res);
            }

            if (!createNew)
            {
                Log.I("createNew:{0}", createNew);
                return(null);
            }

            res = ResFactory.Create(resSearchKeys);

            if (res != null)
            {
                mTable.Add(res);
            }

            return(res);
        }
Beispiel #18
0
 /// <summary>
 /// ID:RKRL003 只通过资源名字进行同步加载 ResLoader.LoadSync<T>(string assetName)
 /// </summary>
 /// <param name="assetName">资源名字</param>
 /// <typeparam name="T"></typeparam>
 /// <returns></returns>
 public T LoadSync <T>(string assetName) where T : Object
 {
     if (typeof(T) == typeof(Sprite))
     {
         if (FromUnityToDll.Setting.SimulationMode)
         {
             return(LoadSprite(assetName) as T);
         }
         else
         {
             var resSearchKeys = ResSearchKeys.Allocate(assetName, null, typeof(T));
             var retAsset      = LoadResSync(resSearchKeys);
             resSearchKeys.Recycle2Cache();
             return(retAsset.Asset as T);
         }
     }
     else
     {
         var resSearchKeys = ResSearchKeys.Allocate(assetName, null, typeof(T));
         var retAsset      = LoadResSync(resSearchKeys);
         resSearchKeys.Recycle2Cache();
         return(retAsset.Asset as T);
     }
 }
Beispiel #19
0
 public bool Match(ResSearchKeys resSearchKeys)
 {
     return(resSearchKeys.AssetName.StartsWith("localimage:"));
 }
Beispiel #20
0
 public T GetRes <T>(ResSearchKeys resSearchKeys) where T : class, IRes
 {
     return(GetRes(resSearchKeys) as T);
 }
 public IRes Create(ResSearchKeys resSearchKeys)
 {
     return(AssetBundleRes.Allocate(resSearchKeys.AssetName));
 }
 public bool Match(ResSearchKeys resSearchKeys)
 {
     return(resSearchKeys.AssetType == typeof(AssetBundle));
 }
Beispiel #23
0
        public override bool LoadSync()
        {
            if (!CheckLoadAble())
            {
                return(false);
            }

            if (string.IsNullOrEmpty(AssetBundleName))
            {
                return(false);
            }


            Object obj = null;

            if (FromUnityToDll.Setting.SimulationMode && !string.Equals(mAssetName, "assetbundlemanifest"))
            {
                var resSearchKeys = ResSearchKeys.Allocate(AssetBundleName, null, typeof(AssetBundle));

                var abR = ResMgr.Instance.GetRes <AssetBundleRes>(resSearchKeys);
                resSearchKeys.Recycle2Cache();

                var assetPaths = FromUnityToDll.Setting.GetAssetPathsFromAssetBundleAndAssetName(abR.AssetName, mAssetName);
                if (assetPaths.Length == 0)
                {
                    Log.E("Failed Load Asset:" + mAssetName);
                    OnResLoadFaild();
                    return(false);
                }

                HoldDependRes();

                State = ResState.Loading;

                if (AssetType != null)
                {
                    obj = FromUnityToDll.Setting.LoadAssetAtPath(assetPaths[0], AssetType);
                }
                else
                {
                    obj = FromUnityToDll.Setting.LoadAssetAtPath <Object>(assetPaths[0]);
                }
            }
            else
            {
                var resSearchKeys = ResSearchKeys.Allocate(AssetBundleName, null, typeof(AssetBundle));
                var abR           = ResMgr.Instance.GetRes <AssetBundleRes>(resSearchKeys);
                resSearchKeys.Recycle2Cache();


                if (abR == null || !abR.AssetBundle)
                {
                    Log.E("Failed to Load Asset, Not Find AssetBundleImage:" + AssetBundleName);
                    return(false);
                }

                HoldDependRes();

                State = ResState.Loading;

                if (AssetType != null)
                {
                    obj = abR.AssetBundle.LoadAsset(mAssetName, AssetType);
                }
                else
                {
                    obj = abR.AssetBundle.LoadAsset(mAssetName);
                }
            }

            UnHoldDependRes();

            if (obj == null)
            {
                Log.E("Failed Load Asset:" + mAssetName + ":" + AssetType + ":" + AssetBundleName);
                OnResLoadFaild();
                return(false);
            }

            mAsset = obj;

            State = ResState.Ready;
            return(true);
        }
Beispiel #24
0
 public IRes Create(ResSearchKeys resSearchKeys)
 {
     return(new MyRes(resSearchKeys.AssetName));
 }
Beispiel #25
0
 public IRes Create(ResSearchKeys resSearchKeys)
 {
     return(NetImageRes.Allocate(resSearchKeys.AssetName, resSearchKeys.OriginalAssetName));
 }
Beispiel #26
0
 public bool Match(ResSearchKeys resSearchKeys)
 {
     return(resSearchKeys.AssetName.StartsWith("myres://"));
 }
Beispiel #27
0
 public IRes Create(ResSearchKeys resSearchKeys)
 {
     return(LocalImageRes.Allocate(resSearchKeys.AssetName));
 }
Beispiel #28
0
        public override IEnumerator DoLoadAsync(System.Action finishCallback)
        {
            if (RefCount <= 0)
            {
                OnResLoadFaild();
                finishCallback();
                yield break;
            }


            //Object obj = null;
            var resSearchKeys = ResSearchKeys.Allocate(AssetBundleName, null, typeof(AssetBundle));
            var abR           = ResMgr.Instance.GetRes <AssetBundleRes>(resSearchKeys);

            resSearchKeys.Recycle2Cache();

            if (FromUnityToDll.Setting.SimulationMode && !string.Equals(mAssetName, "assetbundlemanifest"))
            {
                var assetPaths = FromUnityToDll.Setting.GetAssetPathsFromAssetBundleAndAssetName(abR.AssetName, mAssetName);
                if (assetPaths.Length == 0)
                {
                    Log.E("Failed Load Asset:" + mAssetName);
                    OnResLoadFaild();
                    finishCallback();
                    yield break;
                }

                //确保加载过程中依赖资源不被释放:目前只有AssetRes需要处理该情况
                HoldDependRes();
                State = ResState.Loading;

                // 模拟等一帧
                yield return(new WaitForEndOfFrame());

                UnHoldDependRes();

                if (AssetType != null)
                {
                    mAsset = FromUnityToDll.Setting.LoadAssetAtPath(assetPaths[0], AssetType);
                }
                else
                {
                    mAsset = FromUnityToDll.Setting.LoadAssetAtPath <Object>(assetPaths[0]);
                }
            }
            else
            {
                if (abR == null || abR.AssetBundle == null)
                {
                    Log.E("Failed to Load Asset, Not Find AssetBundleImage:" + AssetBundleName);
                    OnResLoadFaild();
                    finishCallback();
                    yield break;
                }


                HoldDependRes();

                State = ResState.Loading;

                AssetBundleRequest abQ = null;

                if (AssetType != null)
                {
                    abQ = abR.AssetBundle.LoadAssetAsync(mAssetName, AssetType);
                    mAssetBundleRequest = abQ;

                    yield return(abQ);
                }
                else
                {
                    abQ = abR.AssetBundle.LoadAssetAsync(mAssetName);
                    mAssetBundleRequest = abQ;

                    yield return(abQ);
                }

                mAssetBundleRequest = null;

                UnHoldDependRes();

                if (!abQ.isDone)
                {
                    Log.E("Failed Load Asset:" + mAssetName);
                    OnResLoadFaild();
                    finishCallback();
                    yield break;
                }

                mAsset = abQ.asset;
            }

            State = ResState.Ready;

            finishCallback();
        }