【问题标题】:Automatization of code generation in UnityUnity 中代码生成的自动化
【发布时间】:2021-07-15 01:24:44
【问题描述】:

我想在我的 Unity 项目中设置一些代码生成脚本。我想每次刷新项目时都运行代码生成器。我做了类似的事情:

    public static class CustomRefresh
    {
        [MenuItem("Tools/CustomRefresh")]
        public static void Refresh()
        {
            GenerateSomeCodeFiles();
            AssetDatabase.Refresh();
        }
    }

事实上,在使用 Tools/CustomRefresh 选项后,新的代码文件会生成并存在于项目文件夹中,但它们不会被编译。我必须第二次使用 Tools/CustomRefresh 来编译它。我怎样才能使这个过程正确地自动化,这样我就不必刷新两次?

【问题讨论】:

    标签: unity3d code-generation


    【解决方案1】:

    似乎Refresh() 不会一直重新编译资产。我会尝试类似

    #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
    

    确保在脚本顶部包含using UnityEditor。上述方法将强制 Unity 重新编译实际脚本。如果您使用的是较新版本的 Unity,则可以忽略 2017_1_OR_NEWER 中的代码,而只需使用单行解决方案,因为 Unity 公开了一种公共方法来重新编译 2019_3_OR_NEWER 版本中的脚本。

    【讨论】:

    • 不幸的是,同样的问题出现了。在第二次尝试之前没有明显的变化。
    • docs 指定它是一个异步任务。可能只是需要一段时间。可能尝试CompilationPipeline.RequestScriptCompilation();,然后使用Refresh()
    • 其实更好的是,可以订阅编译完成时调用的事件。它在docs 中调用。在调用 CompliationPipeline 之前订阅此事件,并在回调中更新数据。如果那里没有更新,那么在那儿打电话给Refresh()
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2015-04-19
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多