Visual Studio Code(VSCode)是一款跨平台轻量级代码编辑器。

最初使用VSCode要追溯到2017年的TypeScript项目,由于支持语法着色,类型检查和静态编译足够出色(这很显然,VSCode 本身就是用 TypeScript 写的)。后来发现对于开发Unity项目也是很好的选择......而近几年更是成为开发者的首选IDE。

不过,我们仍会在实际使用过程中遇到的一些需补足的地方,比如下面要讲的这个问题。

痛点

在VSCode中修改Unity工程的C#代码之后,需要切回到Unity Editor,以便完成代码编译。

为了能够在修改代码之后,以尽可能短的时间(需要等待脚本完成编译)启动Play模式,我们会使用一些技巧,比如:

  1. 拆分程序集:这样只会编译被修改代码所在的程序集。这当然是一个本该做的事情,但不应该和当前的需求耦合。
  2. 离散化思想:不定时切回Unity Editor进行编译。但是如此一来,除了浪费额外的切换操作的时间,而且破坏了沉浸的开发体验。

改变

我们希望在VSCode中修改代码之后,按下Ctrl+S键就能够直接编译C#代码。

实现

可以分为三步:

一 创建Unity侦听器

创建一个CompileTriggerWatcher.cs脚本,放置于Assets目录下的一个Editor文件夹内。

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

[InitializeOnLoad]
public static class CompileTriggerWatcher {
    static string triggerPath = Path.Combine(
        Directory.GetParent(Application.dataPath).FullName,
        ".compile_trigger"
    );
    static DateTime lastWriteTime = DateTime.MinValue;

    static CompileTriggerWatcher() {
        EditorApplication.update += OnUpdate;
    }

    static void OnUpdate() {
        if (!File.Exists(triggerPath)) return;

        DateTime writeTime = File.GetLastWriteTime(triggerPath);
        if (writeTime != lastWriteTime) {
            lastWriteTime = writeTime;
            AssetDatabase.Refresh();
            Debug.Log("[CompileTrigger] 检测到变化,已触发编译");
        }
    }
}

二 创建VSCode Task

在项目根目录创建 .vscode/tasks.json。

作用是在工作空间写(按Ctrl+S时)一个文件名后缀为.compile_trigger的触发文件。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Trigger Unity Compile",
            "type": "shell",
            "command": "echo ${datetime} > ${workspaceFolder}/.compile_trigger",
            "windows": {
                "command": "echo %date%%time% > ${workspaceFolder}\\.compile_trigger"
            },
            "presentation": {
                "reveal": "never",
                "panel": "shared"
            }
        }
    ]
}

三 按Ctrl+S保存C#脚本时,触发上述Task

  1. 安装 VSCode 插件 Trigger Task on Save
  2. 在 .vscode/settings.json 增加配置
{
    "triggerTaskOnSave.tasks": {
        "Trigger Unity Compile": [
            "**/*.cs"
        ]
    },
    "triggerTaskOnSave.showNotifications": false,
    "triggerTaskOnSave.delay": 100
}

验证:成功

更多推荐