Ejemplo n.º 1
0
        public static IEnumerator AssetBundleLoop()
        {
            while (true)
            {
                while (hasTaskToFinish == false)
                {
                    yield return(new WaitForEndOfFrame());
                }
                //处理Task
                while (assetTaskQueue.Count > 0)
                {
                    AssetRequestTask current = assetTaskQueue.Dequeue();
                    //AssetBundle已经被读取
                    if (LoadedAssets.ContainsKey(current.GetABName()))
                    {
                        if (LoadedAssets[current.GetABName()] == null)
                        {
                            current.onAssetLoaded(null);
                            Debug.LogError("Null Asset Request Critical!");
                            continue;
                        }

                        string assetPath = LoadedAssets[current.GetABName()].GetAllAssetNames()[0];

                        AssetBundleRequest abRequest = LoadedAssets[current.GetABName()].LoadAssetAsync(assetPath);

                        yield return(abRequest);

                        current.onAssetLoaded(abRequest.asset);
                    }
                    //AssetBundle尚未读取
                    else
                    {
                        //依赖包 Loop
                        for (var i = 0; i < assetBundleManifestList.Count; i++)
                        {
                            var DependenciesInfo = assetBundleManifestList[i].GetAllDependencies(current.GetABName());

                            for (var j = 0; j < DependenciesInfo.Length; j++)
                            {
                                if (LoadedAssets.ContainsKey(DependenciesInfo[j]))
                                {
                                    continue;
                                }

                                var isDependenceAssetLoaded = false;

                                MonoActiveObject.StartCoroutine(LoadAsset(DependenciesInfo[j],
                                                                          () => { isDependenceAssetLoaded = true; }));

                                while (!isDependenceAssetLoaded)
                                {
                                    yield return(new WaitForEndOfFrame());
                                }
                            }
                        }
                        //主AB
                        bool isMainLoaded = false;

                        MonoActiveObject.StartCoroutine(LoadAsset(current.GetABName(), () =>
                        {
                            isMainLoaded = true;
                        }));

                        while (!isMainLoaded)
                        {
                            yield return(new WaitForEndOfFrame());
                        }

                        //添加回队列 等待队列回调
                        assetTaskQueue.Enqueue(current);

                        yield return(new WaitForEndOfFrame());
                    }
                }
                hasTaskToFinish = false;
            }
        }
Ejemplo n.º 2
0
        public static void Init()
        {
            activationData.OnLoad();

            //TODO: Mod Manager
            modDirs = new List <string>();

            DirectoryInfo dir = null;

            switch (Application.platform)
            {
            case RuntimePlatform.WindowsEditor:
                dir = new DirectoryInfo(Application.dataPath + "/../mods/");
                break;

            case RuntimePlatform.WindowsPlayer:
                dir = new DirectoryInfo(Application.dataPath + "/../mods/");
                break;

            case RuntimePlatform.Android:
                dir = new DirectoryInfo(Application.persistentDataPath + "/mods/");
                break;
            }

            if (dir != null)
            {
                if (!dir.Exists)
                {
                    dir.Create();
                }

                var scriptableMods = new GameObject("ScriptableModManager", typeof(ScriptableModManager)).GetComponent <ScriptableModManager>();

                //Unzip Mod packs
                var installDir = new DirectoryInfo(dir.FullName + "Installs");

                if (!installDir.Exists)
                {
                    installDir.Create();
                }

                var zips = installDir.GetFiles("*.modpack");

                var fastZip = new FastZip();

                foreach (var zip in zips)
                {
                    var packDir = new DirectoryInfo(dir.FullName + Path.GetFileNameWithoutExtension(zip.Name));

                    if (!packDir.Exists)
                    {
                        packDir.Create();
                    }

                    fastZip.ExtractZip(zip.FullName, packDir.FullName, null);


                    var detectInstalled = new FileInfo(zip.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(zip.Name) + ".installed");

                    if (detectInstalled.Exists)
                    {
                        detectInstalled.Delete();
                    }

                    zip.MoveTo(zip.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(zip.Name) + ".installed");
                }

                foreach (var subDir in dir.GetDirectories())
                {
                    if (activationData.ModsIgnoreList.Contains(subDir.FullName + "/"))
                    {
                        continue;
                    }

                    modDirs.Add(subDir.FullName + "/");
                    //Filter Files
                    if (Application.platform == RuntimePlatform.Android)
                    {
                        if (!subDir.Name.Contains("Android"))
                        {
                            continue;
                        }
                    }

                    if (Application.platform == RuntimePlatform.WindowsPlayer)
                    {
                        if (!subDir.Name.Contains("Windows"))
                        {
                            continue;
                        }
                    }

                    if (subDir.Name.Contains("("))
                    {
                        continue;
                    }


                    foreach (var dll in subDir.GetFiles("*.dll"))
                    {
                        scriptableMods.dllDirs.Add(dll.FullName);
                    }

                    foreach (var modInfoFile in subDir.GetFiles("*.modpackdata"))
                    {
                        var assetRequest = new AssetRequestTask()
                        {
                            onAssetLoaded = (val) =>
                            {
                                var modPackageData = val as ModPackageData;

                                if (modPackageData != null)
                                {
                                    modPackageData.installedDirectory = subDir.Name;
                                    ModActivationData.modPackagesList.Add(modPackageData);
                                }
                            }
                        };

                        assetRequest.SetAssetBundleName(modInfoFile.Name);
                        LoadAssetFromAssetBundle(assetRequest);
                    }
                }
                scriptableMods.Mount();
            }
        }
Ejemplo n.º 3
0
 public static void LoadAssetFromAssetBundle(AssetRequestTask assetRequestTask)
 {
     assetTaskQueue.Enqueue(assetRequestTask);
     hasTaskToFinish = true;
 }