private void OnGUI() { if (GUILayout.Button("标记")) { SetPackingTagAndAssetBundle(); } //if (GUILayout.Button("清除标记")) //{ // ClearPackingTagAndAssetBundle(); //} this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); if (platformType == PlatformType.None) { platformType = PlatformType.Android; } this.isBuildExe = EditorGUILayout.Toggle("是否打包EXE: ", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("是否同将资源打进EXE: ", this.isContainAB); this.buildOptions = (BuildOptions)EditorGUILayout.EnumMaskField("BuildOptions(可多选): ", this.buildOptions); this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumMaskField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); if (GUILayout.Button("开始打包")) { if (this.platformType == PlatformType.None) { Log.Error("请选择打包平台!"); return; } BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB); } }
private void OnGUI() { this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); this.isBuildExe = EditorGUILayout.Toggle("是否打包EXE: ", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("是否同将资源打进EXE: ", this.isContainAB); this.buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType: ", this.buildType); switch (buildType) { case BuildType.Development: this.buildOptions = BuildOptions.Development | BuildOptions.AutoRunPlayer | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging; break; case BuildType.Release: this.buildOptions = BuildOptions.None; break; } this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); if (GUILayout.Button("开始打包")) { if (this.platformType == PlatformType.None) { Log.Error("请选择打包平台!"); return; } BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB); } }
public static void BuildBundleIOS() { BuildTarget buildTarget = BuildTarget.iOS; // 切换到 Android平台 EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.iOS, buildTarget); BuildHelper.Build(PlatformType.IOS, BuildAssetBundleOptions.None, BuildOptions.None, false, false); }
private void OnGUI() { this.platformType = (PlatformType)EditorGUILayout.EnumPopup("PlatformType:", (PlatformType)1); this.buildConfig.ClientVersion = EditorGUILayout.TextField("ClientVersion:", this.buildConfig.ClientVersion); this.isBuildExe = EditorGUILayout.Toggle("IsBuildEXE:", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("IsContainABEXE:", this.isContainAB); this.buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType:", this.buildType); switch (buildType) { case BuildType.Development: this.buildOptions = BuildOptions.Development | BuildOptions.AutoRunPlayer | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging; break; case BuildType.Release: this.buildOptions = BuildOptions.None; break; } this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); if (GUILayout.Button("StartBuild")) { if (this.platformType == PlatformType.None) { Log.Error("Please Select Platform!"); return; } int cv = 0; if (int.TryParse(this.buildConfig.ClientVersion, out cv)) { File.WriteAllText(path, JsonHelper.ToJson(this.buildConfig)); BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB, cv); AssetDatabase.Refresh(); } else { Log.Debug("Input Error!"); } } if (GUILayout.Button("BuildInitialAB")) { BuildHelper.BuildInitial(); } }
//自动打AB包 public static void BuildAB(PackageConfig packageConfig) { PlatformType platformType = PlatformType.PC; bool isBuildExe = false; bool isContainAB = true; switch (packageConfig.platformType) { case PackageConfig.PlatformType.Andriod: platformType = PlatformType.Android; break; case PackageConfig.PlatformType.IOS: platformType = PlatformType.IOS; break; } BuildHelper.Build(platformType, packageConfig.buildAssetBundleOptions, packageConfig.buildOptions, isBuildExe, isContainAB); }
private void OnGUI() { GUILayout.Label("---------------------------------------- FGUI打包标记"); UnityEngine.Object[] array = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Deep); GUILayout.Label("当前选中: " + array.Length + "个物体"); packetageName = EditorGUILayout.TextField("请输入资源所属包名: ", packetageName); if (GUILayout.Button("标记FGUI打包资源")) { if (string.IsNullOrEmpty(packetageName)) { Log.Error("请设置包名!"); return; } if (array.Length == 0) { Log.Error("未选中需要标记的资源!"); return; } for (int i = 0; i < array.Length; i++) { string filepath = AssetDatabase.GetAssetPath(array[i]); AssetImporter import = AssetImporter.GetAtPath(filepath); // 需要区分配置文件和资源文件 if (filepath.EndsWith(".bytes")) { import.assetBundleName = packetageName + "_cf" + ".unity3d"; } else { import.assetBundleName = packetageName + "_res" + ".unity3d"; } } Log.Debug("FGUI资源标记完毕!"); } GUILayout.Label("\n----------------------------------------清除打包标记"); if (GUILayout.Button("清除全部AB包标记")) { ClearPackingTagAndAssetBundle(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); Log.Debug("清除完成!"); } GUILayout.Label("\n----------------------------------------ET打包工具"); this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); this.isBuildExe = EditorGUILayout.Toggle("是否打包EXE: ", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("是否同将资源打进EXE: ", this.isContainAB); this.buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType: ", this.buildType); switch (buildType) { case BuildType.Development: this.buildOptions = BuildOptions.Development | BuildOptions.AutoRunPlayer | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging; break; case BuildType.Release: this.buildOptions = BuildOptions.None; break; } this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); GUILayout.Label(""); if (GUILayout.Button("开始打包")) { if (this.platformType == PlatformType.None) { Log.Error("请选择打包平台!"); return; } BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB); } }
private void OnGUI() { this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); this.isBuildExe = EditorGUILayout.Toggle("是否打包EXE: ", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("是否同将资源打进EXE: ", this.isContainAB); this.buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType: ", this.buildType); switch (buildType) { case BuildType.Development: this.buildOptions = BuildOptions.Development | BuildOptions.AutoRunPlayer | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging; break; case BuildType.Release: this.buildOptions = BuildOptions.None; break; } this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); if (GUILayout.Button("开始打包", GUILayout.Height(30))) { if (this.platformType == PlatformType.None) { Log.Error("请选择打包平台!"); return; } var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/" + this.platformType.ToString() + "/StreamingAssets"; if (Directory.Exists(filepath)) { Directory.Delete(filepath, true); Log.Debug("一口气删除原文件夹,全部重新生成,时间会久一点,但未改动的文件的md5会不变的,不用担心热更包会很大---Version.txt"); } BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB); } GUILayout.Space(10); if (GUILayout.Button("一键标记AssetBundle")) { if (EditorUtility.DisplayDialog("温馨提示", "是否一键标记AssetBundle", "确认", "取消")) { SetPackingTagAndAssetBundle(); } } if (GUILayout.Button("一键清除AssetBundle标记")) { if (EditorUtility.DisplayDialog("温馨提示", "是否一键清除AssetBundle标记", "确认", "取消")) { ClearPackingTagForBundlesFolder(); ClearPackingTagForResFolder(); } } GUILayout.Space(20); GUILayout.Label("看宏:Async=True&&ILRuntime=true,才走AB包模式:PS运行时,看下web服务器开了没,GlobalProto***.txt路径对不"); EditorGUILayout.BeginVertical("Box"); { mIsSecurity = EditorGUILayout.Toggle("AB包加密", mIsSecurity); if (GUILayout.Button("生成Version.txt的json的md5(ps:若加密别重复点击)", GUILayout.Height(30))) { if (mIsSecurity) { WillABSecurity(); } Log.Debug(mIsSecurity ? "使用-加密模式" : "未使用-加密模式"); BuildHelper.GenerateVersionInfo(string.Format("../Release/{0}/StreamingAssets/", this.platformType), mIsSecurity); } } EditorGUILayout.EndVertical(); GUILayout.Space(20); //GUILayout.Label("android\n1.查看ResourcesComponent.cs的LoadOneBundle的方法调用的LoadFromFile方法加128字节. 两处改 \n2.查看AssetsBundleLoaderAsync.cs的LoadAsync的方法.LoadFromFileAsync要加上128字节. 一处改",GUILayout.Height(48)); GUILayout.Label("原理:生成的ab包后给其加上128个字节,这样有多余的字节AssetStudio工具就无法解析啦(加密)\n读取时,拿到的资源就往后移128个字节,这样就能解析出来(解密文件)"); if (GUILayout.Button("想过用byte还原回去,但还原不了,只能打包AB时删除原目录或手动解压压缩回去")) { return; var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/" + this.platformType.ToString() + "/StreamingAssets"; var files = Directory.GetFiles(filepath, "*.*"); for (int i = 0; i < files.Length; i++) { if (files[i].Contains("StreamingAssets.manifest") || files[i].Contains("Version.txt")) { } else {//因为打包要使用,还原回去 byte[] oldData = File.ReadAllBytes(files[i]); if (oldData[0] == 0 && oldData[1] == 0) { Log.Debug(files[i]); int newOldLen = oldData.Length - 128; var newData = new byte[newOldLen]; int n = 0; for (int y = 128; y < oldData.Length; y++) { newData[n] = oldData[y]; n++; } FileStream fs = File.OpenWrite(files[i]); fs.Write(newData, 0, newOldLen); fs.Close(); } } } } }