Example #1
0
 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)
            };
        }
Example #3
0
        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();
        }
Example #4
0
        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);
        }
Example #5
0
        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;
     }
 }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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;
            }
        }
Example #10
0
        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);
            }
        }
Example #11
0
        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);
        }