/// <summary> /// 初始化框架编辑器 /// </summary> static public void InitEditorEnvironment() { //是否为batchmode if (Application.isBatchMode) { Debug.Log("BDFramework version:" + BDLauncher.Version); } //只有在非Playing的时候才初始化 if (EditorApplication.isPlayingOrWillChangePlaymode || IsInited) { return; } try { //BD初始化 //BApplication.Init(); //BDEditor初始化 BDEditorApplication.Init(); //加载主工程的DLL Type var assemblyPath = BApplication.Library + "/ScriptAssemblies/Assembly-CSharp.dll"; var editorAssemlyPath = BApplication.Library + "/ScriptAssemblies/Assembly-CSharp-Editor.dll"; if (File.Exists(assemblyPath) && File.Exists(editorAssemlyPath)) { var gAssembly = Assembly.LoadFile(assemblyPath); var eAssemlby = Assembly.LoadFile(editorAssemlyPath); Types = CollectTypes(gAssembly, eAssemlby).ToArray(); } //编辑器下加载初始化 BResources.Init(AssetLoadPathType.Editor); //编辑器下管理器注册 ManagerInstHelper.Load(Types); //Editor的管理器初始化 BDFrameworkPipelineHelper.Init(); //调试器启动 DebuggerServerProcessManager.Inst.Start(); //Pipeline初始化 HotfixPipelineTools.Init(); //编辑器初始化 InitEditorTask(); //编辑器任务 EditorTaskInstance.OnUnityLoadOrCodeRecompiled(); //编辑器http服务 InitEditorHttpServer(); //最后,完成初始化 IsInited = true; // Debug.Log("框架编辑器环境初始化成功!"); } catch (Exception e) { Debug.LogError("框架编辑器环境初始化失败!"); Debug.LogError(e); throw; } }
/// <summary> /// 热更代码发生改变 /// </summary> static public void OnCodeChanged() { //获取最近修改的代码 var codes = BDEditorApplication.GetLeastHotfixCodes(); if (codes != null && codes.Length > 0) //修改过Hotfix { if (BDEditorApplication.BDFrameWorkFrameEditorSetting.BuildSetting.IsNeedAutoBuildDll()) { EditorWindow_ScriptBuildDll.RoslynBuild(Application.streamingAssetsPath, BApplication.RuntimePlatform, ScriptBuildTools.BuildMode.Debug, false); Debug.Log("自动编译Hotfix.dll成功!"); } else if (BDEditorApplication.BDFrameWorkFrameEditorSetting.BuildSetting.IsHotfixCodeOutofUnityAssets()) { MoveCodeToBDWorkSpace(codes); } } }
/// <summary> /// 编译Xcode(这里是出母包版本) /// </summary> /// <param name="mode"></param> static private (bool, string) BuildIpa(BuildMode mode, string outdir) { bool ret = false; BDEditorApplication.SwitchToiOS(); //DeleteIL2cppCache(); //具体IOS的的配置 PlayerSettings.gcIncremental = true; //PlayerSettings.stripEngineCode = true; // if (PlayerSettings.GetManagedStrippingLevel(BuildTargetGroup.iOS) == ManagedStrippingLevel.High) // { // PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.iOS, ManagedStrippingLevel.Low); //} // //文件夹处理 var outputPath = IPath.Combine(outdir, string.Format("{0}_{1}", Application.identifier, mode.ToString())); if (Directory.Exists(outputPath)) { Directory.Delete(outputPath, true); } Directory.CreateDirectory(outputPath); //开始项目一键打包 string[] scenes = { SCENEPATH }; BuildOptions opa = BuildOptions.None; BuildMode realmode = BuildMode.Release; switch (mode) { case BuildMode.UseCurrentConfigDebug: case BuildMode.Debug: { realmode = BuildMode.Debug; opa = BuildOptions.CompressWithLz4HC | BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.ConnectWithProfiler | BuildOptions.EnableDeepProfilingSupport; } break; case BuildMode.UseCurrentConfigRelease: case BuildMode.Release: { realmode = BuildMode.Release; opa = BuildOptions.CompressWithLz4HC; } break; } //构建包体 Debug.Log("------------->Begin build<------------"); UnityEditor.BuildPipeline.BuildPlayer(scenes, outputPath, BuildTarget.iOS, opa); Debug.Log("------------->End build<------------"); //检测xcode if (File.Exists(outputPath + "/Info.plist")) { var shellPath = ""; //这里需要判断Editor类型,所以使用u3d的 Application.Platform if (Application.platform == RuntimePlatform.WindowsEditor) { shellPath = BApplication.DevOpsCIPath + string.Format("/BuildIpa_{0}.cmd", realmode); } else if (Application.platform == RuntimePlatform.OSXEditor) { shellPath = BApplication.DevOpsCIPath + string.Format("/BuildIpa_{0}.shell", realmode); } if (File.Exists(shellPath)) { //执行BuildIpa的shell Debug.Log("即将执行:" + shellPath); ExecuteShell(shellPath); //删除xcode项目 Directory.Delete(outputPath, true); var ipaPath = outputPath + ".ipa"; if (File.Exists(ipaPath)) { ret = true; } else { Debug.LogError("【BDFramework】 not found:" + ipaPath); } } else { //For ci throw new Exception("没找到编译xcode脚本! 后续请配合Jekins/Teamcity出包!"); } EditorUtility.RevealInFinder(outputPath); } else { //For ci throw new Exception("【BDFramework】Package not exsit! -" + outputPath); } return(ret, outputPath); }
/// <summary> /// 打包APK /// </summary> static private (bool, string) BuildAPK(BuildMode mode, string outdir) { bool ret = false; //切换到Android BDEditorApplication.SwitchToAndroid(); //删除il2cpp缓存 //DeleteIL2cppCache(); if (!BDEditorApplication.BDFrameWorkFrameEditorSetting.IsSetConfig()) { //For ci throw new Exception("请注意设置apk keystore账号密码"); } //模式 AndroidConfig androidConfig = null; switch (mode) { case BuildMode.Debug: case BuildMode.UseCurrentConfigDebug: { androidConfig = BDEditorApplication.BDFrameWorkFrameEditorSetting.AndroidDebug; } break; case BuildMode.Release: case BuildMode.UseCurrentConfigRelease: { androidConfig = BDEditorApplication.BDFrameWorkFrameEditorSetting.Android; } break; } //秘钥相关 var keystorePath = IPath.Combine(BApplication.ProjectRoot, androidConfig.keystoreName); if (!File.Exists(keystorePath)) { //For ci throw new Exception("【keystore】不存在:" + keystorePath); } PlayerSettings.Android.keystoreName = keystorePath; PlayerSettings.keystorePass = androidConfig.keystorePass; PlayerSettings.Android.keyaliasName = androidConfig.keyaliasName; PlayerSettings.keyaliasPass = androidConfig.keyaliasPass; Debug.Log("【keystore】" + PlayerSettings.Android.keystoreName); //具体安卓的配置 PlayerSettings.gcIncremental = true; PlayerSettings.Android.preferredInstallLocation = AndroidPreferredInstallLocation.Auto; //PlayerSettings.stripEngineCode = true; // if (PlayerSettings.GetManagedStrippingLevel(BuildTargetGroup.Android) == ManagedStrippingLevel.High) // { //PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Android, ManagedStrippingLevel.Low); // } //开启符号表 EditorUserBuildSettings.androidCreateSymbolsZip = true; //不同模式的设置 // switch (mode) // { // case BuildMode.Debug: // { // // } // break; // case BuildMode.Release: // { // // } // break; // } // var outputPath = IPath.Combine(outdir, string.Format("{0}_{1}.apk", Application.identifier, mode.ToString())); //文件夹处理 if (!Directory.Exists(outdir)) { Directory.CreateDirectory(outdir); } if (File.Exists(outputPath)) { File.Delete(outputPath); } //开始项目一键打包 string[] scenes = { SCENEPATH }; BuildOptions opa = BuildOptions.None; switch (mode) { case BuildMode.UseCurrentConfigDebug: case BuildMode.Debug: { opa = BuildOptions.CompressWithLz4HC | BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.ConnectWithProfiler | BuildOptions.EnableDeepProfilingSupport; } break; case BuildMode.UseCurrentConfigRelease: case BuildMode.Release: { opa = BuildOptions.CompressWithLz4HC; } break; } //构建包体 Debug.Log("------------->Begin build<------------"); UnityEditor.BuildPipeline.BuildPlayer(scenes, outputPath, BuildTarget.Android, opa); Debug.Log("------------->End build<------------"); //构建出判断 if (File.Exists(outputPath)) { Debug.Log("Build Success :" + outputPath); ret = true; EditorUtility.RevealInFinder(outputPath); } else { //For ci throw new Exception("【BDFramework】Package not exsit! -" + outputPath); } return(ret, outputPath); }
/// <summary> /// 当进入paymode /// </summary> static private void OnEnterPlayMode() { BDEditorApplication.Init(); InitEditorTask(); EditorTaskInstance.OnEnterWillPlayMode(); }