介绍

实际开发过程中,经常需要调试 C# 代码,之前推荐过一款插件 Unity 插件推荐:Console Enhanced Pro 可以用来双击调用堆栈跳转到对应的 C# 文件。

而现在很多项目使用 Lua 开发,也需要双击 Lua 调用堆栈跳转到对应的 Lua 文件。

Console Enhanced Pro 默认并不支持此功能,不过插件本身提供了扩展,可以修改双击之后的行为,因此这里介绍一下如何实现此功能。

方法

提取路径与行号

xLua 与 ToLua 都可以通过 CustomLoader 之类的方式修改加载的文件路径,最后获得的调用堆栈大概类似下面的输出:

1
2
stack traceback:
    [string "Lua/Test"]:21: in function 'Test'

从中可以看到文件路径在中间、行号在后面,使用正则表达式提取。

将路径与行号传递给编辑器就可以实现打开文件并跳转到指定行号。

打开编辑器

Unity 默认程序

使用默认的 External Script Editor 打开文件

1
UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(classPath, line);

扩展名关联程序

使用文件扩展名关联的程序打开文件

1
2
var obj = AssetDatabase.LoadMainAssetAtPath(relativePath);
AssetDatabase.OpenAsset(obj, lineNumber);

自定义进程路径

使用进程打开其他编辑器,需要创建一个新的编辑器进程。

配置

使用 ScriptableObject 定义配置,可以方便配置。 使用枚举选择打开文件的方式,填写第三方程序路径,并支持字符串格式化配置。

环境

  • Windows 7 + Unity 5.6.6f2 + Intellij Idea 2019.2 + xLua
  • Windows 10 + Unity 2018.4.28f1 + Intellij Idea 2021.2 + ToLua

逻辑上来说也支持 macOS,不过需要测试一下。

使用方法

执行 Tools/ConsoleE/Create Option 创建配置文件 Assets/Editor/ConsoleE_LuaExtensions/ConsoleE_Extensions_Option.asset

工具提供三种打开文件方式:

  1. Unity 指定的编辑器
  2. 扩展名关联的可执行文件
  3. 自定义程序路径与打开参数

默认情况下使用 Unity 设置中指定的编辑器打开文件。

默认配置是 Idea 的配置,根据实际的路径修改 Idea 可执行文件路径。

LuaPathPattern 需要根据项目实际路径修改。

多工程支持

When you specify the path to a file, IntelliJ IDEA opens it in LightEdit mode, unless it belongs to a project that is already open or there is special logic to automatically open or create a project (for example, in case of Maven or Gradle files).

Open files from the command line | IntelliJ IDEA

默认情况下开启多个 Idea 时,会自动在已打开此文件所在工程的 Idea 窗口中打开此文件。

其他编辑器需要看看文档,了解如何设置类似的行为。

焦点激活问题

在使用自定义程序路径与打开参数时,新启动的程序是否会获得焦点与操作系统有关:Windows 7 默认行为是启动进程后新进程获得焦点,Windows 10 的逻辑修改为任务栏中图标会闪烁。

大概有几种可行的方案:

  1. 编辑器自己提供获得焦点的选项,好像大部分都没提供(Idea 2021.2 中没有此选项)。类似的功能如断点时获取焦点。
  2. 看看 Unity 内部是如何实现的。
  3. 在 Windows 下获取焦点本质上是向窗口发送消息,那么需要编写代码实现获取当前打开文件的窗口,然后向其发送消息。

仓库