【unity游戏开发——编辑器扩展】CompilationPipeline处理与脚本编译相关的操作和事件

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前言
  • 脚本编译事件
    • 1、两个重要事件介绍
      • 1.1 assemblyCompilationFinished 事件
      • 1.2 compilationFinished 事件
    • 2、示例
  • 专栏推荐
  • 完结

前言

CompilationPipeline 是 UnityEditor 命名空间下的一个重要类,专门用于处理与脚本编译相关的操作和事件。这个类在编辑器扩展开发中非常有用,特别是当你需要处理动态代码生成、编译状态监控或程序集相关操作时。我们最常用的是利用它得知代码是否编译结束,比如动态生成脚本时,我们需要在编译结束后才能使用新的脚本。

官方文档:CompilationPipeline

脚本编译事件

1、两个重要事件介绍

1.1 assemblyCompilationFinished 事件

CompilationPipeline.assemblyCompilationFinished += CompilationPipeline_assemblyCompilationFinished;

特性

  • 每个程序集编译完成后立即触发
  • 提供详细的编译信息,包括:
    • string arg1:编译完成的程序集名称
    • CompilerMessage[] arg2:包含所有编译消息(错误、警告)的数组

CompilerMessage 结构

public struct CompilerMessage
{
    public string message;    // 消息内容
    public string file;       // 相关文件路径
    public int line;          // 行号
    public int column;        // 列号
    public CompilerMessageType type;  // 消息类型(Error/Warning)
}

1.2 compilationFinished 事件

CompilationPipeline.compilationFinished += CompilationPipeline_compilationFinished;

特性

  • 所有程序集编译完全结束后触发
  • 参数 obj 是 ActiveBuildStatus 对象(通常可以忽略)
  • 最适合执行编译后的处理逻辑

2、示例

using System.IO;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;

public class TestCompilationPipelineEditorWindow : EditorWindow
{
    [MenuItem("编辑器拓展/自定义窗口拓展/CompilationPipeline窗口拓展")]
    private static void OpenWindow()
    {
        TestCompilationPipelineEditorWindow win = EditorWindow.GetWindow<TestCompilationPipelineEditorWindow>();
        win.Show();
    }

    void OnGUI()
    {
        if (GUILayout.Button("生成脚本文件"))
        {
            // 生成脚本文件
            string scriptPath = "Assets/GeneratedScript.cs";
            File.WriteAllText(scriptPath, "public class GeneratedScript { }");
            AssetDatabase.Refresh();
        }
    }

    private void OnEnable()
    {
        //每个程序集编译完成后立即触发
        CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompiled;
        //所有程序集编译完全结束后触发
        CompilationPipeline.compilationFinished += OnAllAssembliesCompiled;
    }

    private void OnAssemblyCompiled(string assemblyName, CompilerMessage[] messages)
    {
        // 统计错误和警告数量
        int errorCount = 0;
        int warningCount = 0;

        foreach (var message in messages)
        {
            switch (message.type)
            {
                case CompilerMessageType.Error:
                    errorCount++;
                    Debug.LogError($"编译错误 [{assemblyName}]: {message.message}\n" +
                                 $"位置: {message.file}({message.line},{message.column})");
                    break;
                case CompilerMessageType.Warning:
                    warningCount++;
                    Debug.LogWarning($"编译警告 [{assemblyName}]: {message.message}\n" +
                                    $"位置: {message.file}({message.line},{message.column})");
                    break;
            }
        }

        Debug.Log($"程序集 {assemblyName} 编译完成\n" +
                 $"错误: {errorCount}, 警告: {warningCount}");
    }

    private void OnAllAssembliesCompiled(object obj)
    {
        Debug.Log("全部程序集编译完成");

        // 编译完成,可以使用新生成的脚本了
    }
}

效果
【unity游戏开发——编辑器扩展】CompilationPipeline处理与脚本编译相关的操作和事件_第1张图片


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】
【unity游戏开发——编辑器扩展】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

你可能感兴趣的:(unity,编辑器,游戏引擎,游戏,ui)