Beispiel #1
0
        void ResetView()
        {
            if (!File.Exists(BMSettings_Path))
            {
                BMEditUtility.CreateAsset <BMSettings>(BMSettings_Path);
            }
            settings = AssetDatabase.LoadAssetAtPath <BMSettings>(BMSettings_Path);

            titleFields = settings.GetType().GetFields();
        }
Beispiel #2
0
 private void OnEnable()
 {
     _settings      = target as BMSettings;
     _newSceneStyle = new GUIStyle();
     _newSceneStyle.normal.textColor = Color.green;
     _scenesVersionDict = BMEditUtility.GetDictionaryFromFile(_settings.scenesVersionFile);
     if (_scenesVersionDict == null)
     {
         _scenesVersionDict = new Dictionary <string, string>();
     }
 }
Beispiel #3
0
        static void MoveAssetBundle()
        {
            string streamingAssetsPath = Application.streamingAssetsPath;

            BMEditUtility.DelFolder(streamingAssetsPath);
            if (!Directory.Exists(streamingAssetsPath))
            {
                Directory.CreateDirectory(streamingAssetsPath);
            }
            BMEditUtility.CopyDir(Output_Path, streamingAssetsPath);
            Logger.Log("Move all bundle files over. to " + streamingAssetsPath);
        }
Beispiel #4
0
        private void GenerateAtlasSpritePrefab(string atlasDir)
        {
            Dictionary <string, string> md5Map = new Dictionary <string, string>();

            FileInfo[] resFiles = BMEditUtility.GetAllFiles(atlasDir, "*.*");
            for (int j = 0; j < resFiles.Length; j++)
            {
                FileInfo info = resFiles[j];
                if (info.FullName.EndsWith(".meta", StringComparison.Ordinal) || info.FullName.EndsWith(".txt", StringComparison.Ordinal))
                {
                    continue;
                }

                string dirName        = Path.GetFileName(info.DirectoryName);
                string outPath        = $"{_settings.atlasSpritePrefabDir}{dirName}/";
                string spriteFileName = Path.GetFileName(info.FullName);
                string spriteName     = Path.GetFileNameWithoutExtension(info.FullName);
                string texPath        = BMEditUtility.Absolute2Relativity(info.FullName);
                string md5            = HashHelper.ComputeMD5(texPath);
                md5Map.Add(texPath, md5);
                TextureImporter ti = AssetImporter.GetAtPath(texPath) as TextureImporter;
                if (ti)
                {
                    if (!Directory.Exists(outPath))
                    {
                        Directory.CreateDirectory(outPath);
                    }
                    GameObject     spritePrefab   = new GameObject(spriteName);
                    SpriteRenderer spriteRenderer = spritePrefab.AddComponent <SpriteRenderer>();
                    Vector4        border         = ti.spriteBorder;
                    ti.spritePackingTag = "Atlas_" + dirName;
                    ti.SaveAndReimport();
                    spriteRenderer.sprite = AssetDatabase.LoadAssetAtPath <Sprite>(texPath);;
                    //spritePrefab.hideFlags = HideFlags.HideInHierarchy;
                    var savePath = outPath + spriteName + ".prefab";
                    if (File.Exists(savePath))
                    {
                        File.Delete(savePath);
                    }
                    PrefabUtility.SaveAsPrefabAsset(spritePrefab, savePath);
                    //var texture2D = AssetDatabase.LoadAssetAtPath<Texture2D>(rPath);
                    //var sprite = Sprite.Create(texture2D, new Rect(0,0,texture2D.width,texture2D.height), new Vector2(0.5f,0.5f), 400, 0,SpriteMeshType.FullRect,border);
                    DestroyImmediate(spritePrefab);
                }
            }

            //Save md5
            BMEditUtility.SaveDictionary(Path.Combine(atlasDir, "manifest.txt"), md5Map);
        }
Beispiel #5
0
 static void ClearManifestFiles()
 {
     FileInfo[] manifestFiles = BMEditUtility.GetAllFiles(Output_Path, "*.manifest");
     for (int i = 0; i < manifestFiles.Length; i++)
     {
         FileInfo fileInfo = manifestFiles[i];
         string   path     = fileInfo.DirectoryName + "/" + fileInfo.Name; //相对路径
         Debug.Log(path);
         if (File.Exists(path))
         {
             File.Delete(path);
         }
         EditorUtility.DisplayProgressBar("Clear Manifest Files...", path, (float)(i + 1.0f) / (float)manifestFiles.Length);
     }
     EditorUtility.ClearProgressBar();
 }
Beispiel #6
0
 private void UpdatePackingTag(string dir)
 {
     FileInfo[] resFiles = BMEditUtility.GetAllFiles(dir, "*.*");
     for (int i = 0; i < resFiles.Length; i++)
     {
         FileInfo info  = resFiles[i];
         string   rPath = BMEditUtility.Absolute2Relativity(info.FullName);
         if (Path.GetExtension(rPath) == ".meta")
         {
             continue;
         }
         string          dirName = Path.GetFileName(Path.GetDirectoryName(rPath));
         TextureImporter ti      = AssetImporter.GetAtPath(rPath) as TextureImporter;
         if (ti)
         {
             ti.spritePackingTag = "UISprite_" + dirName;
             ti.SaveAndReimport();
         }
     }
 }
Beispiel #7
0
        static void SaveBundleInfo()
        {
            int total = 0;

            for (int i = 0; i < buildInfoList.Count; i++)
            {
                BuildInfo buildInfo = buildInfoList[i];
                foreach (var sub in buildInfo.subBuildInfoMap.Values)
                {
                    total++;
                    buildInfoJson["bundles"].Add(sub.ToJson());
                }
            }
            string json = buildInfoJson.ToJson();

            BMEditUtility.SaveUTF8TextFile(Output_Path + "/" + BMConfig.BundleDataFile, JsonFormatter.PrettyPrint(json));
            BMEditUtility.SaveUTF8TextFile(Output_Path + "/" + BMConfig.VersionFile, version.ToString());
            //BMEditUtility.SaveDictionary(historyBuildInfoPath, historyBuildInfoPath);
            EditorPrefs.SetString(settings.AppName + BM_Build_Version, version.ToString());
            Logger.Log(string.Format("Bundle total num:{0}", total));
        }
Beispiel #8
0
 static void FetchBuildInfoList(List <string> folders, string searchPattern, CompressType compressType, BuildType buildType)
 {
     //包含所有资源的bundle
     for (int i = 0; i < folders.Count; i++)
     {
         if (!Directory.Exists(folders[i]))
         {
             continue;
         }
         string resDir = BMEditUtility.Relativity2Absolute(folders[i]);
         if (resDir == null)
         {
             continue;
         }
         BuildInfo buildInfo = FetchBuildInfo(resDir, searchPattern, buildType);
         buildInfo.buildName    = folders[i].EndsWith("/")?folders[i].Substring(0, folders[i].Length - 1):folders[i];
         buildInfo.buildType    = buildType;
         buildInfo.compressType = compressType;
         buildInfoList.Add(buildInfo);
     }
 }
Beispiel #9
0
        private bool CheckModify(string atlasDir)
        {
            Dictionary <string, string> md5Map = BMEditUtility.GetDictionaryFromFile(Path.Combine(atlasDir, "manifest.txt"));
            bool modify = false;

            if (md5Map == null)
            {
                modify = true;
            }
            else
            {
                FileInfo[] resFiles = BMEditUtility.GetAllFiles(atlasDir, "*.*");
                for (int i = 0; i < resFiles.Length; i++)
                {
                    FileInfo info = resFiles[i];
                    if (info.FullName.EndsWith(".meta", StringComparison.Ordinal) || info.FullName.EndsWith(".txt", StringComparison.Ordinal))
                    {
                        continue;
                    }
                    string spriteFileName = Path.GetFileName(info.FullName);
                    string oldmd5;
                    string md5 = HashHelper.ComputeMD5(Path.Combine(atlasDir, spriteFileName));
                    if (md5Map.TryGetValue(spriteFileName, out oldmd5))
                    {
                        if (md5 != oldmd5)
                        {
                            modify = true;
                            break;
                        }
                    }
                    else
                    {
                        modify = true;
                        break;
                    }
                }
            }
            return(modify);
        }
Beispiel #10
0
        private static void StartBuild(bool forceBuild, Language language, BuildTarget buildTarget, bool moveBundle = false)
        {
            //加载打包配置
            BundleBuilder.settings = AssetDatabase.LoadAssetAtPath <BMSettings>(BMSettings_Path);
            //加载场景版本号
            BundleBuilder.scenesVersionDict = BMEditUtility.GetDictionaryFromFile(BundleBuilder.settings.scenesVersionFile);
            if (BundleBuilder.scenesVersionDict == null)
            {
                BundleBuilder.scenesVersionDict = new Dictionary <string, string>();
            }
            //Output_Path = Application.dataPath.Replace("Assets", "TestBundle");
            BundleBuilder.Output_Root_Path = Application.dataPath.Replace("Assets", BundleBuilder.settings.BuildOutputDirName);
            BundleBuilder.Output_Path      = BundleBuilder.Output_Root_Path + "/" + language.ToString() + "/" + buildTarget.ToString();
            string historyBuildInfoPath = BundleBuilder.Output_Path + "/" + BMConfig.BundleDataFile;

            BundleBuilder.historyBuildInfo = forceBuild ? null : LoadHistoryBundleData(historyBuildInfoPath);
            if (BundleBuilder.settings.tempForceBuild)
            {
                forceBuild = true;
                BundleBuilder.settings.tempForceBuild = false;
                BMEditUtility.SaveSetting(BundleBuilder.settings);
            }
            BundleBuilder.StartBuild(forceBuild, Language.zh_CN, buildTarget, true, BundleBuilder.settings.encodeLuaFile, moveBundle);
        }
Beispiel #11
0
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();


            if (!string.IsNullOrEmpty(_settings.scenesVersionFile))
            {
                EditorGUILayout.Space();
                foreach (var folder in _settings.scenesFolderList)
                {
                    FileInfo[] sceneFiles = BMEditUtility.GetAllFiles(folder, _settings.scenesPattern);
                    for (int i = 0; i < sceneFiles.Length; i++)
                    {
                        string path = BMEditUtility.Absolute2Relativity(sceneFiles[i].DirectoryName) + "/" + sceneFiles[i].Name; //相对路径
                        if (_scenesVersionDict.TryGetValue(path, out string version))
                        {
                            var oldVer = version;
                            version = EditorGUILayout.TextField(path.Replace(_settings.resDir, ""), version);
                            if (version != oldVer)
                            {
                                _scenesVersionDict[path] = version;
                                BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict);
                            }
                        }
                        else
                        {
                            EditorGUILayout.TextField(path.Replace(_settings.resDir, ""), "0");
                        }
                    }
                }

                if (GUILayout.Button("Save Scene Version"))
                {
                    BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict);
                }
                //重制所有场景版本号
                if (GUILayout.Button("Reset All Scenes Version"))
                {
                    _scenesVersionDict = new Dictionary <string, string>();
                    BMEditUtility.SaveDictionary(_settings.scenesVersionFile, _scenesVersionDict);
//                _settings.sceneVersions = new List<int>();
//                _settings.scenePaths = new List<string>();
//                serializedObject.ApplyModifiedProperties();
//                BMEditUtility.SaveSetting(_settings);
                }
            }

            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Generate Atlas Sprite"))
            {
                GenerateAtlasSprite(false);
            }
            if (GUILayout.Button("Force Generate Atlas Sprite"))
            {
                GenerateAtlasSprite(true);
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();
            //uiSpriteDir
            _settings.uiSpriteDir = EditorGUILayout.TextField("UI Sprite", _settings.uiSpriteDir);
            if (!string.IsNullOrEmpty(_settings.uiSpriteDir))
            {
                if (GUILayout.Button("Update All Packing Tag"))
                {
                    UpdatePackingTag(_settings.uiSpriteDir);
                }
            }
        }
Beispiel #12
0
        //=======================
        // 流程函数
        //=======================

        public static void StartBuild(bool forceBuild, Language language, BuildTarget buildTag, bool generate, bool luaEncoded, bool moveBundle)
        {
            buildTarget    = buildTag;
            buildStartTime = EditorApplication.timeSinceStartup;
            tempLuaPaths   = new List <string>();

            isForceBuild = forceBuild;
            isLuaEncoded = luaEncoded;

            //记录打包次数
            string verStr = EditorPrefs.GetString(settings.AppName + BM_Build_Version, null);

            if (string.IsNullOrEmpty(verStr))
            {
                version = new Version(0, 0, 0, 1);
            }
            else
            {
                version = new Version(verStr);
                version = new Version(version.Major, version.Minor, version.Build, version.Revision + 1);
            }

            buildInfoJson                = new JsonData();
            buildInfoJson["resDir"]      = settings.resDir;
            buildInfoJson["platform"]    = buildTarget.ToString();
            buildInfoJson["suffix"]      = settings.Suffix_Bundle;
            buildInfoJson["useHashName"] = settings.useHashName;
            buildInfoJson["language"]    = language.ToString();
            buildInfoJson["bundles"]     = new JsonData();

            ignoreSuffixs = settings.Ignore_Suffix.Split(',');
            ignoreFolders = settings.Ignore_Folder.Split(',');

            //强制打包时情况原来的目录
            if (isForceBuild && Directory.Exists(Output_Path))
            {
                BMEditUtility.DelFolder(Output_Path);
            }
            Directory.CreateDirectory(Output_Path);
            //清空控制台日志
            Debug.ClearDeveloperConsole();

            //清除AssetBundleName (这步可以不做)
            //RemoveAllAssetBundleName();
            //获取所有Build信息
            FetchAllBuildInfo();
            //计算AssetBundle信息
            CalcAssetBundleInfos();
            //做增量过滤
            if (!isForceBuild)//是否是强制重新Build
            {
                IncrementFilter();
            }
            //生成AssetBundle
            if (generate)
            {
                GenerateAssetBundle();
            }

            //计算Bundle文件大小
            if (generate)
            {
                CalcBundleFileSize();
            }
            //写入Bundle信息
            SaveBundleInfo();

            //清除manifest文件
            if (settings.clearManifestFile)
            {
                ClearManifestFiles();
            }

            //移动生成后的所有bundle文件
            if (moveBundle)
            {
                MoveAssetBundle();
            }

            Logger.Log("Generate Assets Bundle Over. time consuming:{0}s", EditorApplication.timeSinceStartup - buildStartTime);
        }
Beispiel #13
0
        //=======================
        // 工具函数
        //=======================

        //获取Build信息
        static BuildInfo FetchBuildInfo(string resDir, string searchPattern, BuildType buildType)
        {
            BuildInfo buildInfo = new BuildInfo();

            buildInfo.assetPaths = new List <string>();
            FileInfo[] resFiles = BMEditUtility.GetAllFiles(resDir, searchPattern);
            for (int i = 0; i < resFiles.Length; i++)
            {
                FileInfo fileInfo  = resFiles[i];
                string   lowerName = fileInfo.Name.ToLower();
                string   dirPath   = BMEditUtility.Absolute2Relativity(fileInfo.DirectoryName) + "/";

                //过滤一些文件
                if ((fileInfo.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                {
                    continue;
                }
                if ((fileInfo.Directory.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                {
                    continue;
                }
                if (IgnoreFile(lowerName, dirPath))
                {
                    continue;
                }

                string path = dirPath + fileInfo.Name; //相对路径
                if (buildType == BuildType.Lua)
                {
                    string temp = path + "." + BMUtility.EncryptWithMD5(path) + ".bytes";
                    if (File.Exists(temp))
                    {
                        File.Delete(temp);
                    }
                    if (isLuaEncoded)
                    {
                        if (!EncodeLuaFile(path, temp))
                        {
                            Debug.Log("Encode lua file fail!");
                            break;
                        }
                    }
                    else
                    {
                        File.Copy(path, temp);
                    }
                    buildInfo.assetPaths.Add(temp);
                    tempLuaPaths.Add(temp);
                }
                else
                {
                    buildInfo.assetPaths.Add(path);
                }
                //Logger.Log("path:{0}", path);
                EditorUtility.DisplayCancelableProgressBar("Fetch Build Info...", path, (float)(i + 1.0f) / (float)resFiles.Length);
            }
            //EditorUtility.ClearProgressBar();
            if (buildType == BuildType.Lua)
            {
                AssetDatabase.Refresh();
            }
            return(buildInfo);
        }
Beispiel #14
0
        static void CalcAssetBundleInfos()
        {
            for (int i = 0; i < buildInfoList.Count; i++)
            {
                BuildInfo buildInfo = buildInfoList[i];
                buildInfo.subBuildInfoMap = new Dictionary <string, SubBuildInfo>();
                for (int j = 0; j < buildInfo.assetPaths.Count; j++)
                {
                    string path    = buildInfo.assetPaths[j];
                    string dirName = Path.GetDirectoryName(path);
                    string name;
                    int    version = 0;
                    switch (buildInfo.buildType)
                    {
                    case BuildType.Pack:
                        name = BMUtility.Path2Name(dirName);
                        break;

                    case BuildType.Scene:
                        name = BMUtility.Path2Name(dirName + "/" + Path.GetFileNameWithoutExtension(path));
                        if (scenesVersionDict.TryGetValue(path, out string verStr))
                        {
                            version = int.Parse(verStr);
                        }
                        else
                        {    //新场景
                            version = 1;
                            scenesVersionDict.Add(path, version.ToString());
                            BMEditUtility.SaveDictionary(settings.scenesVersionFile, scenesVersionDict);
                        }
                        break;

                    case BuildType.Shader:
                        name = BMUtility.Path2Name(buildInfo.buildName);
                        break;

                    case BuildType.Lua:
                        name = BMUtility.Path2Name(buildInfo.buildName);
                        break;

                    default:    // BuildType.Single:
                        name = BMUtility.Path2Name(dirName + "/" + Path.GetFileName(path));
                        break;
                    }
                    string       md5     = BMUtility.EncryptWithMD5(name + "." + settings.Suffix_Bundle);
                    SubBuildInfo subInfo = null;
                    if (!buildInfo.subBuildInfoMap.TryGetValue(md5, out subInfo))
                    {
                        string abName = name;
                        if (settings.useHashName)
                        {
                            abName = md5;
                        }
                        subInfo = new SubBuildInfo()
                        {
                            bundleName       = name,
                            buildMd5         = md5,
                            buildType        = buildInfo.buildType,
                            version          = version,
                            assetBundleBuild = new AssetBundleBuild()
                            {
                                assetBundleName    = abName,
                                assetBundleVariant = settings.Suffix_Bundle,
                            },
                            assetPaths        = new List <string>(),
                            assetHashs        = new List <string>(),
                            dependenceMap     = new Dictionary <string, string[]>(),
                            dependenceHashMap = new Dictionary <string, string[]>(),
                        };
                        buildInfo.subBuildInfoMap.Add(md5, subInfo);
                    }
                    //添加依赖关系
                    AddDependence(path, subInfo.dependenceMap);
                    string hash = HashHelper.ComputeMD5(path);
                    subInfo.assetPaths.Add(path.ToLower());
                    subInfo.assetHashs.Add(hash);
                    AssetBundleBuild abb = subInfo.assetBundleBuild;
                    abb.assetNames = subInfo.assetPaths.ToArray();

                    //abb.addressableNames = subInfo.assetPaths.ToArray();
                    subInfo.assetBundleBuild = abb;
                    EditorUtility.DisplayProgressBar("Calc Asset Bundle Build Infos...", path, (float)(j + 1.0f) / (float)buildInfo.assetPaths.Count);
                }
            }
            EditorUtility.ClearProgressBar();


            Logger.Log("Calc Asset Bundle Infos Over.");
        }