private static void OnCodeOptimizationChanged(CodeOptimization codeOptimization) { if (CodeOptimization.Release == codeOptimization) { Disconnect(); } }
public ManagedDebuggerWindow(CodeOptimization codeOptimization) { m_CodeOptimization = codeOptimization; if (CodeOptimization.Debug == m_CodeOptimization) { m_CodeOptimizationTitleContent = EditorGUIUtility.TrTextContent("Mode: Debug"); m_CodeOptimizationButtonContent = EditorGUIUtility.TrTextContent("Switch to release mode"); m_CodeOptimizationTextContent = (!EditorUtility.scriptCompilationFailed) ? EditorGUIUtility.TrTextContentWithIcon("Release mode disables C# debugging but improves C# performance.\nSwitching to release mode will recompile and reload all scripts.", EditorGUIUtility.GetHelpIcon(MessageType.Info)) : EditorGUIUtility.TrTextContentWithIcon("All compiler errors must be fixed before switching to release mode.", EditorGUIUtility.GetHelpIcon(MessageType.Error)); } else { m_CodeOptimizationTitleContent = EditorGUIUtility.TrTextContent("Mode: Release"); m_CodeOptimizationButtonContent = EditorGUIUtility.TrTextContent("Switch to debug mode"); m_CodeOptimizationTextContent = (!EditorUtility.scriptCompilationFailed) ? EditorGUIUtility.TrTextContentWithIcon("Debug mode enables C# debugging but reduces C# performance.\nSwitching to debug mode will recompile and reload all scripts.", EditorGUIUtility.GetHelpIcon(MessageType.Info)) : EditorGUIUtility.TrTextContentWithIcon("All compiler errors must be fixed before switching to debug mode.", EditorGUIUtility.GetHelpIcon(MessageType.Error)); } m_TextRectHeight = EditorStyles.helpBox.CalcHeight(m_CodeOptimizationTextContent, k_WindowWidth); m_WindowStyle = new GUIStyle { padding = new RectOffset(10, 10, 10, 10) }; }
public static void BuildCode(CodeOptimization codeOptimization, GlobalConfig globalConfig) { List <string> codes; switch (globalConfig.CodeMode) { case CodeMode.Client: codes = new List <string>() { "Model/Generate/Client", "Model/Share", "Hotfix/Share", "Model/Client", "ModelView/Client", "Hotfix/Client", "HotfixView/Client" }; codes = GetRelativeDirs(codes); break; case CodeMode.Server: codes = new List <string>() { "Model/Generate/Server", "Model/Share", "Hotfix/Share", "Model/Server", "Hotfix/Server", "Model/Client", "Hotfix/Client", }; codes = GetRelativeDirs(codes); break; case CodeMode.ClientServer: codes = new List <string>() { "Model/Generate/Server", "Model/Share", "Hotfix/Share", "Model/Client", "ModelView/Client", "Hotfix/Client", "HotfixView/Client", "Model/Server", "Hotfix/Server", }; codes = GetRelativeDirs(codes); break; default: throw new Exception("not found enum"); } BuildAssemblieEditor.BuildMuteAssembly("Code", codes, Array.Empty <string>(), codeOptimization); AfterCompiling(); AssetDatabase.Refresh(); }
public void MonoBehaviourWithEmptyEventMethodIsReported(CodeOptimization codeOptimization) { var prevCodeOptimization = AssemblyCompilationPipeline.CodeOptimization; AssemblyCompilationPipeline.CodeOptimization = codeOptimization; var scriptIssues = Utility.AnalyzeAndFindAssetIssues(m_MonoBehaviourWithEmptyEventMethod); AssemblyCompilationPipeline.CodeOptimization = prevCodeOptimization; // restore previous value Assert.AreEqual(1, scriptIssues.Count()); var issue = scriptIssues.FirstOrDefault(); Assert.NotNull(issue); Assert.NotNull(issue.descriptor); Assert.AreEqual(Rule.Severity.Default, issue.descriptor.severity); Assert.AreEqual(EmptyMethodAnalyzer.GetDescriptor().id, issue.descriptor.id); Assert.True(string.IsNullOrEmpty(issue.descriptor.type)); Assert.True(string.IsNullOrEmpty(issue.descriptor.method)); Assert.True(issue.name.Equals("MonoBehaviourWithEmptyEventMethod.Update")); Assert.True(issue.filename.Equals(m_MonoBehaviourWithEmptyEventMethod.fileName)); Assert.True(issue.description.Equals("System.Void MonoBehaviourWithEmptyEventMethod::Update()")); Assert.True(issue.GetCallingMethod().Equals("System.Void MonoBehaviourWithEmptyEventMethod::Update()")); Assert.AreEqual(1, issue.line); Assert.AreEqual(IssueCategory.Code, issue.category); }
private GUIContent GetDebuggerContent(bool debuggerAttached, CodeOptimization optimization) { if (CodeOptimization.Debug == optimization) { return(debuggerAttached ? m_DebuggerAttachedContent : m_DebuggerEnabledContent); } return(m_DebuggerDisabledContent); }
private static void ToggleDebugState(CodeOptimization codeOptimization) { if (CodeOptimization.Debug == codeOptimization) { CompilationPipeline.codeOptimization = CodeOptimization.Release; } else { CompilationPipeline.codeOptimization = CodeOptimization.Debug; } }
public static void BuildHotfix(CodeOptimization codeOptimization, GlobalConfig globalConfig) { string[] logicFiles = Directory.GetFiles(Define.BuildOutputDir, "Hotfix_*"); foreach (string file in logicFiles) { File.Delete(file); } int random = RandomHelper.RandomNumber(100000000, 999999999); string logicFile = $"Hotfix_{random}"; List <string> codes; switch (globalConfig.CodeMode) { case CodeMode.Client: codes = new List <string>() { "Hotfix/Share/", "Hotfix/Client/", "HotfixView/Client/", }; codes = GetRelativeDirs(codes); break; case CodeMode.Server: codes = new List <string>() { "Hotfix/Share/", "Hotfix/Server/", "Hotfix/Client/", }; codes = GetRelativeDirs(codes); break; case CodeMode.ClientServer: codes = new List <string>() { "Hotfix/Share/", "Hotfix/Client/", "HotfixView/Client/", "Hotfix/Server/", }; codes = GetRelativeDirs(codes); break; default: throw new Exception("not found enum"); } BuildAssemblieEditor.BuildMuteAssembly(logicFile, codes, new[] { Path.Combine(Define.BuildOutputDir, "Model.dll") }, codeOptimization); }
public static void BuildModel(CodeOptimization codeOptimization, GlobalConfig globalConfig) { List <string> codes; switch (globalConfig.CodeMode) { case CodeMode.Client: codes = new List <string>() { "Model/Generate/Client/", "Model/Share/", "Model/Client/", "ModelView/Client/", }; codes = GetRelativeDirs(codes); break; case CodeMode.Server: codes = new List <string>() { "Model/Generate/Server/", "Model/Share/", "Model/Server/", "Model/Client/", }; codes = GetRelativeDirs(codes); break; case CodeMode.ClientServer: codes = new List <string>() { "Model/Share/", "Model/Client/", "ModelView/Client/", "Model/Generate/Server/", "Model/Server/", }; codes = GetRelativeDirs(codes); break; default: throw new Exception("not found enum"); } BuildAssemblieEditor.BuildMuteAssembly("Model", codes, Array.Empty <string>(), codeOptimization); }
private static void BuildMuteAssembly(string assemblyName, string[] CodeDirectorys, string[] additionalReferences, CodeOptimization codeOptimization) { List <string> scripts = new List <string>(); for (int i = 0; i < CodeDirectorys.Length; i++) { DirectoryInfo dti = new DirectoryInfo(CodeDirectorys[i]); FileInfo[] fileInfos = dti.GetFiles("*.cs", System.IO.SearchOption.AllDirectories); for (int j = 0; j < fileInfos.Length; j++) { scripts.Add(fileInfos[j].FullName); } } string dllPath = Path.Combine(Define.BuildOutputDir, $"{assemblyName}.dll"); string pdbPath = Path.Combine(Define.BuildOutputDir, $"{assemblyName}.pdb"); File.Delete(dllPath); File.Delete(pdbPath); Directory.CreateDirectory(Define.BuildOutputDir); AssemblyBuilder assemblyBuilder = new AssemblyBuilder(dllPath, scripts.ToArray()); //启用UnSafe //assemblyBuilder.compilerOptions.AllowUnsafeCode = true; BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); assemblyBuilder.compilerOptions.CodeOptimization = codeOptimization; assemblyBuilder.compilerOptions.ApiCompatibilityLevel = PlayerSettings.GetApiCompatibilityLevel(buildTargetGroup); // assemblyBuilder.compilerOptions.ApiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6; assemblyBuilder.additionalReferences = additionalReferences; assemblyBuilder.flags = AssemblyBuilderFlags.None; //AssemblyBuilderFlags.None 正常发布 //AssemblyBuilderFlags.DevelopmentBuild 开发模式打包 //AssemblyBuilderFlags.EditorAssembly 编辑器状态 assemblyBuilder.referencesOptions = ReferencesOptions.UseEngineModules; assemblyBuilder.buildTarget = EditorUserBuildSettings.activeBuildTarget; assemblyBuilder.buildTargetGroup = buildTargetGroup; assemblyBuilder.buildStarted += delegate(string assemblyPath) { Debug.LogFormat("build start:" + assemblyPath); }; assemblyBuilder.buildFinished += delegate(string assemblyPath, CompilerMessage[] compilerMessages) { int errorCount = compilerMessages.Count(m => m.type == CompilerMessageType.Error); int warningCount = compilerMessages.Count(m => m.type == CompilerMessageType.Warning); Debug.LogFormat("Warnings: {0} - Errors: {1}", warningCount, errorCount); if (warningCount > 0) { Debug.LogFormat("有{0}个Warning!!!", warningCount); } if (errorCount > 0) { for (int i = 0; i < compilerMessages.Length; i++) { if (compilerMessages[i].type == CompilerMessageType.Error) { Debug.LogError(compilerMessages[i].message); } } } }; //开始构建 if (!assemblyBuilder.Build()) { Debug.LogErrorFormat("build fail:" + assemblyBuilder.assemblyPath); return; } }
private static void BuildMuteAssembly(string assemblyName, string[] CodeDirectorys, string[] additionalReferences, CodeOptimization codeOptimization, Action completed) { List <string> scripts = new List <string>(); for (int i = 0; i < CodeDirectorys.Length; i++) { DirectoryInfo dti = new DirectoryInfo(CodeDirectorys[i]); FileInfo[] fileInfos = dti.GetFiles("*.cs", System.IO.SearchOption.AllDirectories); for (int j = 0; j < fileInfos.Length; j++) { scripts.Add(fileInfos[j].FullName); } } string dllPath = "Assets/StreamingAssets/DLL/" + assemblyName + ".dll"; AssemblyBuilder assemblyBuilder = new AssemblyBuilder(dllPath, scripts.ToArray()); BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); assemblyBuilder.compilerOptions.CodeOptimization = codeOptimization; assemblyBuilder.compilerOptions.ApiCompatibilityLevel = PlayerSettings.GetApiCompatibilityLevel(buildTargetGroup); // assemblyBuilder.compilerOptions.ApiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6; assemblyBuilder.additionalReferences = additionalReferences; assemblyBuilder.flags = AssemblyBuilderFlags.None; //AssemblyBuilderFlags.None 正常发布 //AssemblyBuilderFlags.DevelopmentBuild 开发模式打包 //AssemblyBuilderFlags.EditorAssembly 编辑器状态 assemblyBuilder.referencesOptions = ReferencesOptions.UseEngineModules; assemblyBuilder.buildTarget = EditorUserBuildSettings.activeBuildTarget; assemblyBuilder.buildTargetGroup = buildTargetGroup; assemblyBuilder.buildStarted += delegate(string assemblyPath) { Debug.LogFormat("热更代码编译开始"); }; assemblyBuilder.buildFinished += delegate(string assemblyPath, CompilerMessage[] compilerMessages) { AssetDatabase.Refresh(); int errorCount = compilerMessages.Count(m => m.type == CompilerMessageType.Error); int warningCount = compilerMessages.Count(m => m.type == CompilerMessageType.Warning); Debug.LogFormat("Warnings: {0} - Errors: {1}", warningCount, errorCount); if (warningCount > 0) { Debug.LogFormat("有{0}个Warning!!!", warningCount); } if (errorCount == 0) { Debug.Log("热更代码编译成功"); completed?.Invoke(); } else { for (int i = 0; i < compilerMessages.Length; i++) { if (compilerMessages[i].type == CompilerMessageType.Error) { Debug.LogError(compilerMessages[i].message); } } } }; //开始构建 if (!assemblyBuilder.Build()) { Debug.LogErrorFormat("热更代码编译失败"); return; } while (assemblyBuilder.status != AssemblyBuilderStatus.Finished) { System.Threading.Thread.Sleep(10); } }
private void OnGUI() { this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); this.clearFolder = EditorGUILayout.Toggle("clean folder? ", clearFolder); this.isBuildExe = EditorGUILayout.Toggle("build exe?", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("contain assetsbundle?", this.isContainAB); this.codeOptimization = (CodeOptimization)EditorGUILayout.EnumPopup("CodeOptimization ", this.codeOptimization); EditorGUILayout.LabelField("BuildAssetBundleOptions "); this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField(this.buildAssetBundleOptions); switch (this.codeOptimization) { case CodeOptimization.None: case CodeOptimization.Debug: this.buildOptions = BuildOptions.Development | BuildOptions.ConnectWithProfiler; break; case CodeOptimization.Release: this.buildOptions = BuildOptions.None; break; } GUILayout.Space(5); if (GUILayout.Button("BuildPackage")) { if (this.platformType == PlatformType.None) { ShowNotification(new GUIContent("please select platform!")); return; } if (platformType != activePlatform) { switch (EditorUtility.DisplayDialogComplex("Warning!", $"current platform is {activePlatform}, if change to {platformType}, may be take a long time", "change", "cancel", "no change")) { case 0: activePlatform = platformType; break; case 1: return; case 2: platformType = activePlatform; break; } } BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB, this.clearFolder); } GUILayout.Label(""); GUILayout.Label("Code Compile:"); this.globalConfig.LoadMode = (LoadMode)EditorGUILayout.EnumPopup("LoadMode: ", this.globalConfig.LoadMode); this.globalConfig.CodeMode = (CodeMode)EditorGUILayout.EnumPopup("CodeMode: ", this.globalConfig.CodeMode); if (GUILayout.Button("BuildCode")) { if (Define.EnableCodes) { throw new Exception("now in ENABLE_CODES mode, do not need Build!"); } BuildAssemblieEditor.BuildCode(this.codeOptimization, globalConfig); } if (GUILayout.Button("BuildModel")) { if (Define.EnableCodes) { throw new Exception("now in ENABLE_CODES mode, do not need Build!"); } BuildAssemblieEditor.BuildModel(this.codeOptimization, globalConfig); } if (GUILayout.Button("BuildHotfix")) { if (Define.EnableCodes) { throw new Exception("now in ENABLE_CODES mode, do not need Build!"); } BuildAssemblieEditor.BuildHotfix(this.codeOptimization, globalConfig); } if (GUILayout.Button("ExcelExporter")) { //Directory.Delete("Assets/Bundles/Config", true); ToolsEditor.ExcelExporter(); // 如果是ClientServer,那么客户端要使用服务端配置 if (this.globalConfig.CodeMode == CodeMode.ClientServer) { FileHelper.CopyDirectory("../Config/StartConfig/Localhost", "Assets/Bundles/Config/StartConfig/Localhost"); foreach (string file in Directory.GetFiles("../Config/", "*.bytes")) { File.Copy(file, $"Assets/Bundles/Config/{Path.GetFileName(file)}", true); } } Debug.Log("copy config to Assets/Bundles/Config"); } if (GUILayout.Button("Proto2CS")) { ToolsEditor.Proto2CS(); } GUILayout.Space(5); }