最近碰到Unity编辑器偶尔抽风,明明代码都正常的,编译却有个空报错,导致策划/美术有时候需要重启Unity,有时候需要关掉unity+删除Library/AssemblyScript目录再开unity才正常(程序可以任意代码加个注释触发Unity编译之后也正常)。于是搞了个编辑器上重新编译脚本的功能。
自Unity 2019.3 引入了公共编辑器 API 来强制重新编译脚本:通过钩挂到程序集编译 start/finished 事件对其进行了测试,该方法确实重新编译了项目中的所有脚本。UnityEditor.Compilation.CompilationPipeline.RequestScriptCompilation
对于 Unity 2017.1 到 Unity 2019.2 的 Unity 版本,可以通过反射进行调用。 是 Unity 2019.3 从 method 内部调用的方法(请参阅参考)。遗憾的是,对于早于 2017.1 的 Unity 版本,我不确定是否存在,因为 Unity C# 参考没有该 Unity 版本的源代码。UnityEditor.Scripting.ScriptCompilation.EditorCompilationInterface.DirtyAllScripts
DirtyAllScripts
RequestScriptCompilation
DirtyAllScripts
简单的编辑器窗口,用于在单击按钮时强制重新编译脚本(使用 Unity 2019.3.0f6、Unity 2022.3.54f1 和 Unity 2017.1.1f1 测试):
using UnityEditor; #if UNITY_2019_3_OR_NEWER using UnityEditor.Compilation; #elif UNITY_2017_1_OR_NEWER using System.Reflection; #endif using UnityEngine; namespace PumpEditor { public class CompilationWindow : EditorWindow { [MenuItem("Window/Pump Editor/Compilation")] private static void ShowWindow() { var window = EditorWindow.GetWindow<CompilationWindow>(); window.titleContent = new GUIContent("Compilation"); window.Show(); } private void OnGUI() { if (GUILayout.Button("Request Script Compilation")) { #if UNITY_2019_3_OR_NEWER CompilationPipeline.RequestScriptCompilation(); #elif UNITY_2017_1_OR_NEWER var editorAssembly = Assembly.GetAssembly(typeof(Editor)); var editorCompilationInterfaceType = editorAssembly.GetType("UnityEditor.Scripting.ScriptCompilation.EditorCompilationInterface"); var dirtyAllScriptsMethod = editorCompilationInterfaceType.GetMethod("DirtyAllScripts", BindingFlags.Static | BindingFlags.Public); dirtyAllScriptsMethod.Invoke(editorCompilationInterfaceType, null); #endif } } } }
参考: Force Unity to recompile scripts - Questions & Answers - Unity Discussions