Godot C++/C# VScode Settings
### 🟠🔵 Godot C++/C# VScode Settings
Godot 4.o 发布了,Godot 4 临门一脚,把 Mono 换【踢】了,用了 .Net 6.0,只支持桌面 C# 开发,好处就是可以使用 C# 10.0。下载请这边来 https://godotengine.org/download/windows/


Godot 3.2.3 开始,不需安装 Mono SDK,除非需要从源代码构建 Godot,但是 .NET SDK 还是要安装。注意,使用的 Godot 要与 SDK 的版本比特位一致,建议使用 64-bit 的版本。由于 Godot 只提供了 C# 的最小支持,可以考虑使用外部编辑器,如 Visual Studio Code,以提供更完善的自动完成、调试等功能。
Godot 目前支持以下作用外部编辑器,可以通过 Editor → Editor Settings → Mono → Editor 修改:
- Visual Studio 2019
- Visual Studio Code
- MonoDevelop
- Visual Studio for Mac
- JetBrains Rider
以 VSCode 配置为例,最新的 Godot 4 不需要配置 Builds:
- Set **Mono** -> **Editor** -> **External Editor** to **Visual Studio Code**.
- Set **Mono** -> **Builds** -> **Build Tool** to **dotnet CLI**.
并且在 Visual Studio Code 中安装以下扩展:
- [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
- [Mono Debug](https://marketplace.visualstudio.com/items?itemName=ms-vscode.mono-debug)
- [C# Tools for Godot](https://marketplace.visualstudio.com/items?itemName=neikeq.godot-csharp-vscode)
- [C/C++ for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
C# Tools for Godot 扩展支持 Godot 3.2.2 以上版本,可以提供以下功能:
- Debugging.
- Launch a game directly in the Godot editor from VSCode.
- Additional code completion for Node paths, Input actions, Resource paths, Scene paths and Signal names.
如果使用 Linux 操作系统,需要安装 Mono SDK 以支持 Godot 的 C# 工具插件。
配置 VSCdoe 以实现 Godot 工程的运行:
- 按菜单执行 Run → **Add Configuration...** → **C# Godot**
- 编辑配置文件 ``tasks.json`` 和 ``launch.json``,使用 executable 和 Command 指向正确的 Godot 可执行文件。
完成以上配置后,就可以直接在 VScode 中运行 Godot 项目:
- 使用命令调板,Ctrl-Shift-P 打开面板并输入 C# Godot 查询相关命令;
- 在状态栏中,点击 Godot Project 字样处选择工程目录;
- 在状态栏中,点击 Play in Editor (mono) 字样处运 Godot 工程;
- 直接打开 Run and Debug 侧栏面板选择 ``launch.json`` 配置的调试的方式:
- Play in Editor 直接通过编辑器中运行;
- Launch 执行 `Godot.exe --path ${workspaceRoot}`
- Launch (Select Scene) 选择场景执行 `Godot.exe --path ${workspaceRoot} ${command:SelectLaunchScene}`
- Attach 附着到本地调试进程;
如果工程不能正常运行,而 VScode 又看不到错误信息,就可以到 Godot 的 MSBuild 面板查询编译日志信息,例如,当前系统曾经删除过 Xamarin 的 NuGet 模块目录,导致 Godot 编译时出现问题,只需要恢复目录即可:
SDK 解析程序失败:
"尝试解析 SDK "Godot.NET.Sdk/4.0.0-beta.16" 时,SDK 解析程序 "NuGetSdkResolver" 失败。
异常: "NuGet.Packaging.Core.PackagingException: 无法找到回退包文件夹“C:\Microsoft\Xamarin\NuGet\”。
NuGet 是依赖管理工具,包含为开放源代码 .NET 库而创建的 NuGet.org 包管理平台,上面公开发布了所有包的推荐元数据。NuGet 包 `*.nupkg` 是一个 zip 文件,其中包含 .NET 程序集和关联的元数据。
NuGet 是 .NET 生态系统的包管理器,并且是开发人员用来发现并获取 .NET 开放源代码库的主要方法。NuGet.org(由托管 NuGet 包的 Microsoft 提供的免费服务)是公共 NuGet 包的主要主机,但可以发布到自定义 NuGet 服务,如 MyGet 和 Azure Artifacts。
创建 NuGet 包有两种主要方式。 较新的推荐方式是从 SDK 样式项目,其内容以 `<Project Sdk="Microsoft.NET.Sdk">` 开头的项目文件创建包。 程序集和目标会自动添加到包,剩余元数据会添加到 MSBuild 文件,如包名称和版本号。使用 `dotnet pack` 命令编译会输出 `*.nupkg` 文件,而不是程序集。
本地下载安装的缓冲目录可以使用以下命令查询及清理:
nuget locals all -list
nuget locals all -clear
配置文件 ``tasks.json`` 默认只提供了一个构建任务,可以通过菜单 Terminal → Run Build Task... 执行:
如果添加运行配置时,没有提供 **C# Godot** 配置,请检查以上三个扩展是否完成安装,并且处于启用状态。配置好开发环境,就可以在 Godot 给节点附加脚本时,在 Attach Script 对话框中选择 C# 语言。
调试器配置,`launch.json` 设置如何启动调试程序,配置实体中必要的参数有以下 3 个:
01. **type** - 设置调试器类型,根据已安装的调试器设置,如:
- **node** VSCode 内置的 Node debugger
- **python** Python debugger
- **cppdbg** GDB or LLDB debugger
- **cppvsdbg** Visual Studio Windows debugger
02. **request** - 调试执行类型,目前只支持 launch 和 attach 两种。
03. **name** - 调试菜单中显示标题。
根据被调试程序使用的编译器不同,在不同系统上可以使用的调试器如下:
1. Linux: GDB
2. macOS: LLDB or GDB
3. Windows: the Visual Studio Windows Debugger or GDB (using Cygwin or MinGW)
调试 Cygwin 或 MinGW 编译的程序时,可以设置 Machine Interface ("MI") 调试引擎,这是根据 Core Interfaces 实现的调试器接口,设置 **MIMode** 属性为 gdb 或 lldb。在 **miDebuggerPath** 指定调试器路径,但是这种方式中断难,不能在程序运行时中断。另外,要使用 GDBSever 进行远程调试,需要在 **miDebuggerServerAddress** 指定服务器地址。
使用 cppvsdbg 调试 GCC 编译器生成的程序,可能会遇到程序中断设置无效,或者可以中断,但是程序运行时无源代码关联。cppvsdbg 和 Clang 搭配使用却非常好。
在 DEBUG CONSOLE 窗口中是可以看到 gdb 运行是正常的,也可以通过 list 指令查询到关联源代码。一个临时解决方法(变通)就是手动将代码复制到:
Thread 1 "const" hit Breakpoint 1, main () at c:\demo\const.cpp:22
22 float c = 3.14;
使用 cppvsdbg 等调试器时,可以在 **console** 设置要使用的终端类型:
- `integratedTerminal`:VS Code 的集成终端
- `internalConsole`:内部控制台
- `externalTerminal`:外部的系统终端
- `newExternalWindow`:新创建的系统终端,对于 GUI 程序就会忽略控制台 I/O。
一般使用 VSCode 集成控制台,integratedTerminal 比其它两个好在:不会弹出外部窗口,不会因为内部窗口运行结束而看不到控制台输出,集成控制台会记录所有打印信息。
加载调试程序时的其它可用选项:
01. **presentation** - 控制配置实体如何在命令面板中分组、排序,显示或隐藏 (group, order, hidden)。
02. **preLaunchTask** - 调试前执行 tasks.json 的任务,默认任务是 ${defaultBuildTask}。
03. **postDebugTask** - 调试会话结束后执行 tasks.json 的任务,注意要和任务标签 **label** 一致。
04. **internalConsoleOptions** - 调试器控制台面板的显示状态设置,默认会在调试时自动切换显示。
05. **debugServer** - 此参数给扩展开发者使用,以允许连接到指定端口而不是启动调试适配器。
06. **serverReadyAction** - 调试 Web 服务器时设置以自动在浏览器中打开指定的 URL。
调试器启动两种方式中,launch 表示直接和应用一起启动,attach 表示将调试器附加到已经启动的进程上。设置好调试器,还可以通过 preLaunchTask 和 postDebugTask 这样的配置去调用 Tasks 配置中任务。任务就是一个动作,如编译程序,或者清理缓存文件等等,都可以配置为一个 Task。
调试控制控制台会自动隐藏,重新打开需要使用 Debug: Select Debug Console 命令。
调试器本质上也是一个程序,和自己用 C++ 编写的程序没有不同,差异只是在功能上,即调试器具有调试其它程序的功能,调试器需要去运行被调试的程序以获得程序控制流主动权。
在调试 Web 服务器时,可以使用 serverReadyAction 参数指定一个自动打开浏览器的方式,比如以下配置,就会在外部浏览器中打开指定的 URL 地址。这个动作需要在程序中输出可以按 pattern 格式匹配的内容到调试器控制台,编辑器匹配到控制台内容后再在浏览器中打开匹配到的地址。uriFormat 则是指示如果构造出相应的 URL 地址:
以下是配套演示用的 Go 语言程序:
根据不同调试器需要设置其它不同的参数,一般可以设置要调试的程序或脚本,参数参考如下:
- **program** - 被调试的程序或文件路径。
- **args** - 传入被调试程序的参数。
- **env** - 环境变量设置,可以使用 null 来 "undefine" 一个环境变量。
- **envFile** - 指定一个 dotenv 环境变量配置文件。
- **cwd** - 设置程序运行时的工作目录路径,以方便定义可能使用到的依赖。
- **port** - 设置调试器要附着的端口。
- **stopOnEntry** - 设置是否在入口处中断程序的执行,false or true。
另外,VSCode 作为一个跨平台开发工具,可以根据不同的平台在配置实体中使用以下配置项目:
1. **window**:为 Window 平台单独配置的项目;
2. **linux**:为 Linux 平台单独配置的项目;
3. **osx**:为 Mac OS 平台单独配置的项目;
以下是 tasks.json 配置实体使用的参数:
01. **label**: 任务标签,会显示在命令面板上。
02. **type**: 任务类型,如 shell 或者 process,前者执行命令行工具,后者执行一个程序。
03. **command**: 任务实际执行的命令,如果按 shell 方式,就是执行 cmd.exe /d /c "command"。
04. **windows**: Any Windows specific properties. Will be used instead of the default properties when the command is executed on the Windows operating system.
05. **group**: 任务分组归类,比如 "kind": "build" 或 ”test" 等等,设置默认任务 "isDefault": true。
06. **presentation**: Defines how the task output is handled in the user interface. In this example, the Integrated Terminal showing the output is always revealed and a new terminal is created on every task run.
07. **options**: Override the defaults for cwd (current working directory), env (environment variables), or shell (default shell). Options can be set per task but also globally or per platform. Environment variables configured here can only be referenced from within your task script or process and will not be resolved if they are part of your args, command, or other task attributes.
08. **runOptions**: Defines when and how a task is run.
09. **problemMatcher**: 任务输出内容的处理方式,与代码关联起来,如 $gcc,$go,$tsc 等等。
配置文件中常用的变量:
01. `${workspaceFolder}`:在 VS Code 中打开的项目文件夹路径
02. `${file}`:当前开打开(激活)的文件
03. `${relativeFile}`:文件的相对路径,相对于 ${workspaceFolder}
04. `${fileBasename}`:当前打开文件的名称
05. `${fileBasenameNoExtension}`:当前打开文件的名称,不带扩展名
06. `${fileExtname}`:当前打开文件的扩展名
07. `${fileDirname}`:当前打开文件的文件夹名称
08. `${workspaceFolderBasename}` - 项目所在的目录名称
09. `${fileWorkspaceFolder}` - 当前打开的文件的工作区文件夹
10. `${relativeFileDirname}` - 当前打开的文件的目录名,相对于 workspaceFolder
11. `${cwd}` - 任务运行器启动时的当前工作目录
12. `${lineNumber}` - 当前选中的行号在活动文件中
13. `${selectedText}` - 活动文件中当前选定的文本
14. `${execPath}` - 运行VS Code可执行文件的路径
15. `${defaultBuildTask}` - 默认构建任务的名称
17. `${pathSeparator}` - 目录分隔符号,在 macOS 或 Linux 系统为 /,Windows 上为 \
以下是 VSCode C++ 项目的配置参考,使用 Clang + cppvsdbg 和 GCC + cppdbg 两种搭配: