Beispiel #1
0
        //根据manifest检查一遍依赖关系
        private void CheckAndClearManifestFiles(BuildTarget target, bool isClear = false)
        {
            string ifsBuildDir = JW.Res.FileUtil.CombinePaths(
                _ifsBuildPath,
                GetPlatformStr(target));
            //
            string      mainAssetBundlePath = JW.Res.FileUtil.CombinePaths(ifsBuildDir, GetPlatformStr(target));
            AssetBundle mainAssetBundle     = AssetBundle.LoadFromFile(mainAssetBundlePath);

            if (mainAssetBundle == null)
            {
                Terminate("Get RootAssetBundle Failed");
                return;
            }

            AssetBundleManifest mainAssetManifest = (AssetBundleManifest)mainAssetBundle.LoadAsset("AssetBundleManifest");

            if (mainAssetManifest == null)
            {
                Terminate("Get RootAssetBundle Manifest Failed!");
                return;
            }
            //
            string[] allAbs = mainAssetManifest.GetAllAssetBundles();
            foreach (string ab in allAbs)
            {
                JW.Common.Log.LogD("Exist AssetBundle:" + ab);
            }
            //
            for (int i = 0; i < _packConfig.PackInfoAll.Count; i++)
            {
                ResPackInfo info = _packConfig.PackInfoAll[i];
                if (info.GetPackType() == (byte)ResPackType.ResPackTypeBundle)
                {
                    BundlePackInfo binfo = info as BundlePackInfo;
                    //查找依賴
                    string[] des = mainAssetManifest.GetAllDependencies(info.Path);
                    if (des != null && des.Length > 0)
                    {
                        binfo.DependencyNames = string.Join(",", des);
                        JW.Common.Log.LogD("Add Dependency:" + binfo.DependencyNames + "-2->" + info.Path);
                    }
                }
            }
            //
            mainAssetBundle.Unload(true);
            mainAssetManifest = null;
            //
            if (isClear)
            {
                string[] files = Directory.GetFiles(ifsBuildDir, "*.manifest", SearchOption.AllDirectories);
                for (int i = 0; i < files.Length; i++)
                {
                    JW.Res.FileUtil.DeleteFile(files[i].Replace('\\', '/'));
                }
                //删除 Win Android IOS
                JW.Res.FileUtil.DeleteFile(mainAssetBundlePath);
            }
        }
Beispiel #2
0
        /// 构建资源打包器
        public void BuildResourcePacker(BuildTarget target, bool clearManifest, bool writeResCfg = true)
        {
            //当前配置的打包
            if (_packConfig == null)
            {
                Terminate("You must call InitResourcePacker() before BuildResourcePacker()!");
                return;
            }
            JW.Common.Log.LogD("-->开始打包: " + GetPlatformStr(target));
            AssetDatabase.SaveAssets();
            //IFS输出目录
            string ifsBuildDir = JW.Res.FileUtil.CombinePaths(
                _ifsBuildPath,
                GetPlatformStr(target));

            if (!JW.Res.FileUtil.IsDirectoryExist(ifsBuildDir))
            {
                JW.Res.FileUtil.CreateDirectory(ifsBuildDir);
            }
            else
            {
                JW.Common.Log.LogD("-->清理目录: " + ifsBuildDir);
                JW.Res.FileUtil.ClearDirectory(ifsBuildDir);
            }
            //目标target
            ResPackHelper.BuildTarget = target;
            try
            {
                for (int i = 0; i < _packConfig.PackInfoAll.Count; i++)
                {
                    ResPackInfo info = _packConfig.PackInfoAll[i];
                    BuildResource(info, ifsBuildDir, target);
                }
            }
            catch (Exception e)
            {
                Terminate(e.Message);
            }
            //
            if (_packConfig.IsGlobalBuild)
            {
                JW.Common.Log.LogD("-->全局模式打包-->");
                AssetDatabase.Refresh();
                AssetDatabase.SaveAssets();
                BuildAssetBundleOptions options = _packConfig.GOptions | BuildAssetBundleOptions.DisableWriteTypeTree;
                BuildPipeline.BuildAssetBundles(ifsBuildDir, options, target);
            }
            //
            JW.Common.Log.LogD("-->检查Manifest-->");
            CheckAndClearManifestFiles(target, clearManifest);
            //
            if (writeResCfg)
            {
                JW.Common.Log.LogD("-->写入包配置信息文件-->");
                _packConfig.Write(ifsBuildDir);
            }
            JW.Common.Log.LogD("Build Resource Done.");
        }
Beispiel #3
0
 //构建资源包
 void BuildResource(ResPackInfo ResInfo, string ifsBuildDir, BuildTarget target)
 {
     if (ResInfo.GetPackType() == (byte)ResPackType.ResPackTypeBundle)
     {
         BuildBundleResource(ResInfo as BundlePackInfo, ifsBuildDir, target);
     }
     else if (ResInfo.GetPackType() == (byte)ResPackType.ResPackTypeBinary)
     {
         BuildNormalResource(ResInfo as BinaryPackInfo, ifsBuildDir);
     }
 }
        /// 游戏更新检查后后启动
        public void StartAfterUpdate(Action <bool> allCompletedCallback)
        {
            _allCompletedCallback = allCompletedCallback;
#if USE_PACK_RES
            if (ResService.GetInstance().PackConfig == null)
            {
                JW.Common.Log.LogE("Preloader.StartAfterUpdate : resource initialize failed");
                return;
            }
            //
            _bundleFiles   = BundleMediator.GetInstance().GetPreloadBundles();
            _bundleLoading = false;

            string filename = "main_shaders.ab";
            _shaderBundle = BundleService.GetInstance().GetBundle(filename);
            if (_shaderBundle == null)
            {
                JW.Common.Log.LogE("Preloader.StartAfterUpdate : failed to get shader bundle");
            }

            ResPackInfo pi = ResService.GetInstance().PackConfig.GetPackInfo(filename);
            if (pi == null)
            {
                _shaderFilename = new JWArrayList <string>(0);
            }
            else
            {
                _shaderFilename = new JWArrayList <string>(pi.Resources.Count);
                for (int i = 0; i < pi.Resources.Count; i++)
                {
                    _shaderFilename.Add(pi.Resources[i].Path);
                }
            }
#else
            _bundleFiles    = new JWObjList <string>(0);
            _shaderBundle   = null;
            _shaderFilename = new JWArrayList <string>(0);
#endif

            //真正的开始预加载协成
            StartCoroutine(PreloadCoroutine());
        }
        public void Write(string buidlDir, string excludePackName = null)
        {
            List <ResPackInfo> allInfo  = _config.PackInfo;
            List <ResPackInfo> baseInfo = new List <ResPackInfo>();

            if (allInfo != null)
            {
                for (int i = 0; i < allInfo.Count; ++i)
                {
                    ResPackInfo pack = allInfo[i];
                    pack.Path = JW.Res.FileUtil.CombinePaths(
                        "",
                        pack.Path);
                    //
                    if (pack.Path.Equals(excludePackName, StringComparison.OrdinalIgnoreCase))
                    {
                        JW.Common.Log.LogD("-->写入包配置信息文件 移除-->" + excludePackName);
                        continue;
                    }
                    else
                    {
                        baseInfo.Add(pack);
                    }
                }
            }
            byte[] buffer = new byte[1024 * 1024];
            int    offset = 0;

            // count
            MemoryOperator.WriteShort((short)baseInfo.Count, buffer, ref offset);
            // resources
            for (int i = 0; i < baseInfo.Count; i++)
            {
                baseInfo[i].Write(buffer, ref offset);
            }
            JW.Res.FileUtil.WriteFile(JW.Res.FileUtil.CombinePaths(buidlDir, _outConfigName)
                                      , buffer, 0, offset);
        }
Beispiel #6
0
        /// 只打包二进制
        public void BuildBinaryPacker(BuildTarget target)
        {
            //当前配置的打包
            if (_packConfig == null)
            {
                Terminate("You must call InitResourcePacker() before BuildResourcePacker()!");
                return;
            }
            JW.Common.Log.LogD("-->开始打包二进制: " + GetPlatformStr(target));
            //IFS输出目录
            string ifsBuildDir = JW.Res.FileUtil.CombinePaths(
                _ifsBuildPath,
                GetPlatformStr(target));

            if (!JW.Res.FileUtil.IsDirectoryExist(ifsBuildDir))
            {
                JW.Res.FileUtil.CreateDirectory(ifsBuildDir);
            }
            //目标target
            ResPackHelper.BuildTarget = target;
            try
            {
                for (int i = 0; i < _packConfig.PackInfoAll.Count; i++)
                {
                    ResPackInfo info = _packConfig.PackInfoAll[i];
                    if (info.GetPackType() == (byte)ResPackType.ResPackTypeBinary)
                    {
                        BuildResource(info, ifsBuildDir, target);
                    }
                }
            }
            catch (Exception e)
            {
                Terminate(e.Message);
            }
        }
        /// 输出子配置文件 用于运行时读取
        public void WriteSubCfg(string buildDir, string[] resourcesPrefixs, string cfgFileName, bool excludeMode = false, string cleanLua = "")
        {
            List <ResPackInfo> allInfo = _config.PackInfo;

            List <ResPackInfo> baseInfo = new List <ResPackInfo>();

            if (allInfo != null)
            {
                for (int i = 0; i < allInfo.Count; ++i)
                {
                    ResPackInfo pack = allInfo[i];
                    pack.Path = JW.Res.FileUtil.CombinePaths(
                        "",
                        pack.Path);

                    bool isIn = false;
                    //非排他模式
                    if (excludeMode == false)
                    {
                        isIn = false;
                        for (int j = 0; j < resourcesPrefixs.Length; j++)
                        {
                            if (pack.Path.StartsWith(resourcesPrefixs[j]))
                            {
                                isIn = true;
                                break;
                            }
                        }
                    }
                    else
                    {
                        //排他模式
                        isIn = true;
                        for (int j = 0; j < resourcesPrefixs.Length; j++)
                        {
                            if (pack.Path.StartsWith(resourcesPrefixs[j]))
                            {
                                isIn = false;
                                break;
                            }
                        }
                    }
                    //Lua脚本包排除
                    if (!string.IsNullOrEmpty(cleanLua))
                    {
                        if (pack.Path.Equals(cleanLua, StringComparison.OrdinalIgnoreCase))
                        {
                            isIn = false;
                        }
                    }

                    if (isIn)
                    {
                        baseInfo.Add(pack);
                    }
                }
            }


            byte[] buffer = new byte[1024 * 1024];
            int    offset = 0;

            // count
            MemoryOperator.WriteShort((short)baseInfo.Count, buffer, ref offset);
            // resources
            for (int i = 0; i < baseInfo.Count; i++)
            {
                baseInfo[i].Write(buffer, ref offset);
            }
            //保存
            JW.Res.FileUtil.WriteFile(JW.Res.FileUtil.CombinePaths(buildDir, cfgFileName)
                                      , buffer, 0, offset);
        }