Example #1
0
 /// <summary>
 /// 显示PackageAsset资源打包依赖层级查看窗口
 /// </summary>
 /// <returns></returns>
 public static void showWindow(Dictionary <string, PackageAsset> .ValueCollection palist, List <AssetBundleBuild> abblist)
 {
     Debug.Log("PackagAssetInfoBrowserWindow:showWindow()");
     mPackageAssetList.Clear();
     mPackageAssetList.AddRange(palist);
     mAssetBundleBuildList          = abblist;
     mPackageAssetInfoBrowserWindow = (PackagAssetInfoBrowserWindow)EditorWindow.GetWindow(typeof(PackagAssetInfoBrowserWindow));
     mPackageAssetInfoBrowserWindow.Show();
 }
Example #2
0
    /// <summary>
    /// 打包指定Asset AB接口
    /// </summary>
    /// <param name="asset"></param>
    /// <returns>打包成功与否</returns>
    private static bool packageABForSpecificAsset(Object obj)
    {
        if (obj == null)
        {
            Debug.LogError("无效的Asset,无法打包!");
            return(false);
        }

        Utilities.checkAndCreateSpecificFolder(ABHelper.Singleton.CurrentPlatformABPath);

        // Asset打包映射map,Key為Asset相对路径,Value为Asset打包抽象对象
        // 用于整理出Asset的层级关系,确保每一个Asset只对应一个PackageAsset抽象对象
        Dictionary <string, PackageAsset> packageassetmap = new Dictionary <string, PackageAsset>();

        if (!getAllPackageAssets(obj, ref packageassetmap))
        {
            return(false);
        }

        foreach (var packageasset in packageassetmap.Values)
        {
            if (!packageasset.checkAssetPackageConditions())
            {
                return(false);
            }
        }

        //得出最终打包结论
        //打包映射map,Key为AB名字,Value为AB里Asset列表
        Dictionary <string, List <string> > buildmap = new Dictionary <string, List <string> >();
        //检查是否用到了内置资源
        bool isusingbuildinresource = false;

        foreach (var packageasset in packageassetmap.Values)
        {
            if (ABHelper.Singleton.isUsingBuildInAsset(packageasset.AssetObject))
            {
                isusingbuildinresource = true;
            }
            var abname = packageasset.getPackageAssetABName();
            // 目前看來Unity 5的打包API在不拆分AnimationClip的情況下,暫時不支持把FBX内嵌的AnimationClip指定AB打包
            // 因爲buildlist需要指定AssetPath,但獲取到的AnimationClip的Asset Path始終是FBX Asset的路徑
            // AnimationClip拆分后重新指定預制件上使用,打包時會導致FBX AB裏一份原始的AnimationClip,拆分的新的AnimationClip一個AB
            // Note:
            // 动画单独提取出来打包会导致FBX的AB里会有一份冗余动画资源
            // 交叉使用动画时会导致交叉使用的动画所在的FBX AB整个被加载进来,
            // 当前的方案是通过脚本把动画提取出来后,把FBX设置成不导入动画的形式,然后对提取出来的动画单独打包避免动画冗余
            // TODO:
            // 每次通过脚本提取出来的动画不包含原来添加在提取出来后的动画里的Event等数据,
            // 还需要做额外操作保证更新FBX动画时提取出来后的动画保留原来的部分操作数据
            //if (packageasset.PackageAssetType == AssetPackageType.E_FBX)
            //{
            //    var paobjs = AssetDatabase.LoadAllAssetsAtPath(packageasset.AssetPath);
            //    foreach (var paobj in paobjs)
            //    {
            //        var clip = paobj as AnimationClip;
            //        if (clip != null)
            //        {
            //            var clippath = AssetDatabase.GetAssetPath(clip);
            //            Debug.Log(string.Format("clippath : {0}", clippath));
            //            Debug.Log(string.Format("clipname : {0}", clip.name));
            //        }
            //    }
            //}
            var finalabname = abname + ABHelper.Singleton.CurrentPlatformABPostfix;
            var assetlist   = new List <string>();
            //AssetABBuildRule.E_MUTILPLE打包规则的Asse列表不止一个,需要单独判定
            if (packageasset.AssetAssetBundleBuildRule == AssetABBuildRule.E_MUTILPLE)
            {
                var filespathlist = ABHelper.Singleton.getAssetListForMultipleRule(packageasset.AssetPath);
                foreach (var filepath in filespathlist)
                {
                    var relativepath = "Assets" + filepath.Substring(Application.dataPath.Length);
                    assetlist.Add(relativepath);
                }
            }
            else
            {
                assetlist.Add(packageasset.AssetPath);
            }
            if (!buildmap.ContainsKey(finalabname))
            {
                buildmap.Add(finalabname, new List <string>());
            }
            //避免添加重复的Asset(e.g. 当引用多个AnimationClip时,因为Multiple规则导致多次判定动画)
            //如果动画是和FBX打一起的
            //问题:
            //1. 交叉引用动画会把依赖的FBX所有资源都加载进来(已验证)
            //2. 交叉引用动画的FBX打包规则为NormalRule的话,在动画不拆分的情况下,FBX会因为交叉使用被直接打包到引用该动画的AB里(方案:提取动画出来单独打包ab,然后设置fbx import animation为false避免冗余动画打包)
            //3. FBX更新后重新导出AnimationClip如何保留原有AnimationClip上的信息(待解决)
            foreach (var asset in assetlist)
            {
                //Note:
                //Editor资源虽然最终不参与打包AB,但需要通过Editor Only的一些资源得出间接引用的非Editor Only资源(e.g. LightData.asset间接引用的光照贴图)
                if (ABHelper.Singleton.isEditorOnlyAsset(asset))
                {
                    continue;
                }
                else if (ABHelper.Singleton.isSpecialAssetNoNeedConsider(asset))
                {
                    continue;
                }
                else
                {
                    if (!buildmap[finalabname].Contains(asset))
                    {
                        buildmap[finalabname].Add(asset);
                    }
                }
            }
        }

        if (isusingbuildinresource)
        {
            //临时允许使用Build In Resource打包
            //return;
        }

        List <AssetBundleBuild> abblist = new List <AssetBundleBuild>();

        foreach (var build in buildmap)
        {
            var abb = new AssetBundleBuild();
            abb.assetBundleName = build.Key;
            abb.assetNames      = build.Value.ToArray();
            abblist.Add(abb);
        }

        //如果包含Shader,判定是否有新的shader需要加入打包列表
        var shaderabname = ABHelper.Singleton.ShaderABName + ABHelper.Singleton.CurrentPlatformABPostfix;

        if (buildmap.ContainsKey(shaderabname))
        {
            recordAllNewShaders(buildmap[shaderabname]);
        }

        // 开始打包AB
        // Note: 这里采用LZ4压缩方式打包AB
        BuildPipeline.BuildAssetBundles(ABHelper.Singleton.CurrentPlatformABPath, abblist.ToArray(), ABHelper.Singleton.ABBuildOptions, ABHelper.Singleton.getCurrentPlatformABBuildTarget());

        recordAllABDpInfo();

        PackagAssetInfoBrowserWindow.showWindow(packageassetmap.Values, abblist);

        return(true);
    }