跳到正文
Hacker News· pkmgjyiuk·· 5 天前AI 评分28

VelvetSharp:轻量级 Unity C# 代码编辑器

I made some light weight unity C# code editor

AI 导读

VelvetSharp 是一款轻量级 Unity C# IDE,作为 Rider、Visual Studio 和 VS Code 的替代方案,当前版本为 Phase 8(build 8.0.0)。

正文 · AI 翻译

一款轻量、快速启动的 Unity C# IDE——Rider、Visual Studio 和 VS Code 的替代方案。

当前版本:Phase 8(build 8.0.0)——见 VERSIONS.md。版本 体系基于阶段:每次交付更新都会将阶段加一, 编号从不重复。阶段始终显示在状态栏中。

零 .NET 运行时。零 OmniSharp。整个 C# 智能引擎均以 TypeScript 自定义构建,在 Web Worker 中脱离 UI 线程运行,基于 tree-sitter(WASM)以及 由我们自己的 ECMA-335 元数据读取器直接从 UnityEngine.dll 提取的 Unity API 数据库。

┌─────────────────────────────────────────────────────────────────┐
│  ◆ VelvetSharp — lightweight Unity C# IDE                       │
├───────────┬─────────────────────────────────────────────────────┤
│ Explorer  │  tabs · Monaco editor · velvet theme                │
│ Search    │  IntelliSense backed by @velvetsharp/brain          │
│ Outline   │    • member completions w/ type inference           │
|           |    • Unity event functions (Awake/Start/Update…)    |
│ Ctrl+P    │    • semantic colors: types/methods/fields/msgs     │
│ Ctrl+T    │    • Unity hover docs (from UnityEngine.xml)        │
│ Ctrl+⇧+P  │    • signature help · go-to-definition              │
│ Ctrl+⇧+F  │    • fast syntax squiggles (worker, ~90ms)          │
|           |    • csproj auto-detect → assemblies + defines      |
├───────────┴─────────────────────────────────────────────────────┤
│ ● brain online · 7 files · 8 types · 55 members · 2ms           │
│ ● Unity API: UnityEngine v4.0.30319 · 3,288 types               │
│ ⚙ 3 assemblies · +145 defines (from your .csproj files)         │
└─────────────────────────────────────────────────────────────────┘

v0.3.0 新特性——预构建 Windows exe

  • 现成的 Windows 构建,无需工具链——VelvetSharp.exe 以 便携文件夹(VelvetSharp.exe + resources.neu,压缩后约 5.9 MB)以及 NSIS 安装向导(VelvetSharp-0.3.0-win-x64-setup.exe,按用户安装,无需 管理员权限,含开始菜单 + 桌面快捷方式、卸载程序)的形式发布。
  • 打包的 shell 是 Neutralino 6(WebView2)——与 Tauri 构建使用相同的渲染引擎——因此应用行为完全一致;这个 2.5 MB 的 exe 带有 VelvetSharp 图标和版本元数据。
  • 首次运行工作区选择器——从任意快捷方式启动并选择你的 Unity 项目文件夹;该选择会被记住(状态栏标签或 Ctrl+Shift+P → File: Open Workspace Folder... 可切换)。
  • desktop/ 包含完整的打包项目(neutralino.config.json + neu build),而 src-tauri/ 仍可用于 Rust 构建的变体。

v0.2.0 新特性

  • 一切都在 Web Worker 中运行——解析、索引、补全、悬停和 诊断从不阻塞 UI 线程。输入延迟降至 90 ms 防抖 + 1–3 ms 解析;5.2 MB 的 Unity API 在启动时于 worker 内加载。
  • 增量项目索引——编辑文件时只更新该文件的 索引符号(v0.1 每次按键都会重建整个索引)。
  • 完整语法着色——自定义 C# Monarch 语法(字符串、逐字 & 插值字符串、字符、十六进制/二进制数字、特性、预处理器、 控制流关键字)外加语义 token 提供器,它按 真实解析结果为你的项目中的类、方法、字段、属性、枚举成员和静态成员着色——UnityEngine 类型为青色,你的类为青色,Unity 事件函数(Awake、Start、Update…)以粗体天鹅绒粉色突出显示。
  • 自动补全中的 Unity 事件函数——在类成员级别,你现在可以获得 完整的 MonoBehaviour 消息目录(40 个事件,含文档、制表位和 现成函数体)。已声明的会被隐藏。也可通过 Ctrl+Shift+P → "Unity: Insert Method…" 使用。
  • 大纲面板——侧边栏 ≣ 标签显示当前文件的类 → 成员, 带有 Unity 消息徽章;点击即可跳转。
  • csproj 自动配置——放入任意 Unity 项目文件夹, VelvetSharp 会找到你的 *.csproj 文件(Assembly-CSharp、-Editor、.Player…), 解析 DefineConstants(UNITY_*)、引用和 Compile 列表,在状态栏中 显示程序集标签,并将每个脚本映射到其程序集。

为什么它如此轻量

Rider / VS VS Code + C# VelvetSharp
运行时 .NET + JVM .NET + LSP 无(webview 中的 WASM)
冷启动 10–60 s 3–10 s < 2 s
引擎 Roslyn/OmniSharp OmniSharp 自定义 TS 大脑(约 40 KB gzip)
Unity API 来源 packages NuGet 你自己的 DLL,本地解析

仓库布局

velvetsharp/
├── app/                    # Vite + React + Monaco frontend
│   ├── public/api/unityengine.db.json   ← generated from YOUR UnityEngine.dll
│   ├── public/demo/        ← demo Unity workspace for browser mode
│   ├── public/wasm/        ← tree-sitter runtime + C# grammar
│   └── src/                # UI, adapters (browser ⇄ Tauri ⇄ Neutralino), monaco setup
├── packages/
│   ├── brain/              # @velvetsharp/brain — the C# intelligence engine
│   └── metadata/           # @velvetsharp/metadata — zero-dep ECMA-335 reader
├── desktop/                # prebuilt-exe packaging (Neutralino shell, `neu build`)
├── src-tauri/              # Tauri 2 shell (minimal Rust: fs + workspace scan)
├── scripts/                # test + tooling scripts
├── BUILD-WINDOWS.md        # ← how to build the desktop app on Windows
└── package.json

快速开始(浏览器预览,无需构建)

cd app
npm install
npx vite build
npx vite preview --port 3000   # or any static server for app/dist

桌面构建(Windows / macOS / Linux)

免构建选项(推荐):下载预构建的 Windows 产物—— VelvetSharp-0.3.0-win-x64-setup.exe(安装程序)或 VelvetSharp-0.3.0-win-x64-portable.zip(便携版)。双击即可运行。

自行重新构建打包外壳(无需 Rust):

cd app && npm install && npm run build && cd ..
# put a fresh build into desktop/app/dist, then:
cd desktop
npx neu update      # fetch Neutralino binaries
cp ../app/node_modules/@neutralinojs/lib/dist/neutralino.js .
npx neu build --release   # → dist/VelvetSharp/VelvetSharp-<plat>

或者编译 Rust/Tauri 变体——参见 BUILD-WINDOWS.md。简版:

npm install
npm run tauri dev     # live development
npm run tauri build   # ~12 MB installer

大脑如何工作

  1. 解析——每个 .cs 文件都由 tree-sitter 的 C# 语法解析(编译为 WASM,在 webview 中运行)。错误在 <50 ms 内变为波浪线。
  2. 索引——命名空间、类型、方法、属性、字段、事件和局部变量 被提取到内存中的项目索引。
  3. 推断——当你输入 rb. 时,引擎会遍历你的作用域:字段 → 局部变量 → 参数 → var x = new T() / GetComponent<T>() 模式 → MonoBehaviour 类上的 Unity 自全局变量(transform、gameObject…)→ 通过 Unity DB 和你自己的类型进行链式成员解析。
  4. 补全——Unity API 成员来自一个紧凑数据库(3,288 个类型、 13,958 个方法、9,213 个属性、748 个枚举),该数据库由 @velvetsharp/metadata 从你的 UnityEngine.dll 中提取——一个从零编写的 ECMA-335 读取器, 完全不需要 .NET 运行时——并与官方 XML 文档 (34,599 个文档片段)合并,因此悬停时会显示真正的 Unity 文档。

重新生成 Unity 数据库

对于不同的 Unity 版本,放入新的 UnityEngine.dll + .xml 并运行:

npx tsx packages/metadata/src/cli.ts extract UnityEngine.dll UnityEngine.xml app/public/api/unityengine.db.json

扩展大脑(路线图)

  • v0.2——worker 引擎、语义颜色、Unity 消息、大纲、csproj 自动配置 ✅ 已发布
  • v0.4——BCL 元数据、补全作用域、命名空间补全、名称建议、深度语义诊断 ✅ 已发布
  • v0.5——查找用法、重命名(局部)、Unity 事件向导、语义 lint 包
  • v0.5——可选的浏览器内 Roslyn(WASM),在你需要时提供完整的语义准确性

VelvetSharp 是你的——扩展 packages/brain/src/engine.ts,让它更锋利。

v0.3.1——工作区打开修复

  • 启动对话框已修复:只要扫描到的工作区没有项目,首次运行选择器现在就会打开(v0.3.0 将其限制为空扫描时,而安装目录中的 readme 使其失效)。
  • 永不静默打开:如果原生文件夹对话框失败或打开在窗口后面,内置提示可让你粘贴项目路径(经过验证,带有最近项目标签)。所有入口点(首次运行、欢迎按钮、状态栏标签、命令面板命令)共享同一流程。
  • 根目录解析顺序:--project= / 裸路径 CLI 参数 -> 已验证的已保存根目录 -> 带 Unity 特征的 CWD(Assets/ + ProjectSettings/)-> 普通 CWD -> 选择器。
  • 就地工作区重新加载:切换项目不再重新加载页面(Neutralino 一次性提供其认证令牌,因此页面重新加载是致命的)。编辑器清除标签页/模型,并实时重新索引并显示进度。
  • 快速扫描:每个文件夹一次 readDirectory(移除了逐文件 getStats;读取时强制执行 2 MB 文本上限)。
  • 关键运行时修复:@neutralinojs/lib v6 导出命名空间(filesystem、os、...),而不是 Neutralino 对象——旧的命名导入在运行时是 undefined,导致 v0.3.0 中每次原生调用都崩溃。

交付物:VelvetSharp-0.3.1-win-x64-setup.exe(每用户 NSIS 安装程序)和 VelvetSharp-0.3.1-win-x64-portable.zip。

v0.4.0——BCL 智能 + 深度语义分析

  • .NET 基类库支持:mscorlib + System + System.Core 元数据 使用相同的纯 TypeScript ECMA-335 读取器提取(无需 .NET SDK)并合并 到大脑中——补全、悬停和签名现在覆盖 Console、Math、 String、List<T>、Dictionary<K,V>、StringBuilder、File、Thread、Linq 容器及其相关:Unity + BCL 中共 6,210 个类型 / 58k 个成员。
  • 补全作用域:裸上下文建议会遵循文件的 using 指令、所在命名空间链以及自动检测到的 csproj (包括 Unity 6 <ImplicitUsings> = Roslyn 隐式集合)。没有 using UnityEngine; 的文件不再建议 GameObject。
  • 命名空间补全:输入 using System.Collections.G 并选择 Generic —— 对 Unity、BCL 和你的项目中的每个命名空间进行 分段感知匹配。
  • 智能变量命名:在声明位置(Rigidbody 、GameObject 、 List<int> 、int ……)引擎会建议符合习惯的名称 —— rb、go、col、 list、i —— 并带有缩写表以及 camelCase 回退。
  • Deep semantic pass (new velvetsharp.semantic diagnostics, 90 ms debounce):
    • 未使用的变量 —— 置灰 + 警告(感知读/写)
    • 不可达代码 —— return/break/continue/throw 之后的语句在 编辑器中置灰并给出警告
    • 缺少返回值 / 在 void 中带值 return / 在非 void 中缺少值
    • 接口、抽象类和静态类上的 new(CS0144/CS0712)
    • 字面量和方法调用上的 ref/out(必须是可赋值变量)
    • [Obsolete] API —— 从每个 DLL 中提取自定义特性元数据; 过时的类型/成员会获得删除线装饰、带过时消息的警告, 以及补全文档中的注释(例如 Thread.Suspend)。
  • 首次运行加固:取消文件夹对话框且没有可索引内容时, 现在会显示输入路径提示,而不是让你停留在空白的欢迎界面。

交付物:VelvetSharp-0.4.0-win-x64-setup.exe 和 VelvetSharp-0.4.0-win-x64-portable.zip(exe + resources.neu + readme)。

来源:Hacker News · github.com