Godot C++/C# VScode Settings
### ?????Godot C++/C# VScode Settings
Godot 4.o 發(fā)布了,Godot 4 臨門一腳,把 Mono 換【踢】了,用了 .Net 6.0,只支持桌面 C# 開發(fā),好處就是可以使用 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,以提供更完善的自動完成、調(diào)試等功能。
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 操作系統(tǒng),需要安裝 Mono SDK 以支持 Godot 的 C# 工具插件。
配置 VSCdoe 以實現(xiàn) Godot 工程的運行:
- 按菜單執(zhí)行 Run → **Add Configuration...**? → **C# Godot**
- 編輯配置文件 ``tasks.json`` 和 ``launch.json``,使用 executable 和 Command 指向正確的 Godot 可執(zhí)行文件。
完成以上配置后,就可以直接在 VScode 中運行 Godot 項目:
- 使用命令調(diào)板,Ctrl-Shift-P 打開面板并輸入 C# Godot 查詢相關命令;
- 在狀態(tài)欄中,點擊 Godot Project 字樣處選擇工程目錄;
- 在狀態(tài)欄中,點擊 Play in Editor (mono) 字樣處運 Godot 工程;
- 直接打開 Run and Debug 側欄面板選擇 ``launch.json`` 配置的調(diào)試的方式:
? ? - Play in Editor 直接通過編輯器中運行;
? ? - Launch 執(zhí)行 `Godot.exe --path ${workspaceRoot}`
? ? - Launch (Select Scene) 選擇場景執(zhí)行 `Godot.exe --path ${workspaceRoot} ${command:SelectLaunchScene}`
? ? - Attach 附著到本地調(diào)試進程;
如果工程不能正常運行,而 VScode 又看不到錯誤信息,就可以到 Godot 的 MSBuild 面板查詢編譯日志信息,例如,當前系統(tǒng)曾經(jīng)刪除過 Xamarin 的 NuGet 模塊目錄,導致 Godot 編譯時出現(xiàn)問題,只需要恢復目錄即可:
? ? SDK 解析程序失敗:?
? ? "嘗試解析 SDK "Godot.NET.Sdk/4.0.0-beta.16" 時,SDK 解析程序 "NuGetSdkResolver" 失敗。
? ? 異常: "NuGet.Packaging.Core.PackagingException: 無法找到回退包文件夾“C:\Microsoft\Xamarin\NuGet\”。
NuGet 是依賴管理工具,包含為開放源代碼 .NET 庫而創(chuàng)建的 NuGet.org 包管理平臺,上面公開發(fā)布了所有包的推薦元數(shù)據(jù)。NuGet 包 `*.nupkg` 是一個 zip 文件,其中包含 .NET 程序集和關聯(lián)的元數(shù)據(jù)。
NuGet 是 .NET 生態(tài)系統(tǒng)的包管理器,并且是開發(fā)人員用來發(fā)現(xiàn)并獲取 .NET 開放源代碼庫的主要方法。NuGet.org(由托管 NuGet 包的 Microsoft 提供的免費服務)是公共 NuGet 包的主要主機,但可以發(fā)布到自定義 NuGet 服務,如 MyGet 和 Azure Artifacts。
創(chuàng)建 NuGet 包有兩種主要方式。 較新的推薦方式是從 SDK 樣式項目,其內(nèi)容以 `<Project Sdk="Microsoft.NET.Sdk">` 開頭的項目文件創(chuàng)建包。 程序集和目標會自動添加到包,剩余元數(shù)據(jù)會添加到 MSBuild 文件,如包名稱和版本號。使用 `dotnet pack` 命令編譯會輸出 `*.nupkg` 文件,而不是程序集。
本地下載安裝的緩沖目錄可以使用以下命令查詢及清理:
? ? nuget locals all -list
? ? nuget locals all -clear
配置文件 ``tasks.json`` 默認只提供了一個構建任務,可以通過菜單 Terminal → Run Build Task... 執(zhí)行:?
如果添加運行配置時,沒有提供 **C# Godot** 配置,請檢查以上三個擴展是否完成安裝,并且處于啟用狀態(tài)。配置好開發(fā)環(huán)境,就可以在 Godot 給節(jié)點附加腳本時,在 Attach Script 對話框中選擇 C# 語言。
調(diào)試器配置,`launch.json` 設置如何啟動調(diào)試程序,配置實體中必要的參數(shù)有以下 3 個:
01. **type** - 設置調(diào)試器類型,根據(jù)已安裝的調(diào)試器設置,如:
? ? - **node** VSCode 內(nèi)置的 Node debugger
? ? - **python** Python debugger
? ? - **cppdbg** GDB or LLDB debugger
? ? - **cppvsdbg** Visual Studio Windows debugger
02. **request** - 調(diào)試執(zhí)行類型,目前只支持 launch 和 attach 兩種。
03. **name** - 調(diào)試菜單中顯示標題。
根據(jù)被調(diào)試程序使用的編譯器不同,在不同系統(tǒng)上可以使用的調(diào)試器如下:
1. Linux: GDB
2. macOS: LLDB or GDB
3. Windows: the Visual Studio Windows Debugger or GDB (using Cygwin or MinGW)
調(diào)試 Cygwin 或 MinGW 編譯的程序時,可以設置 Machine Interface ("MI") 調(diào)試引擎,這是根據(jù) Core Interfaces 實現(xiàn)的調(diào)試器接口,設置 **MIMode** 屬性為 gdb 或 lldb。在 **miDebuggerPath** 指定調(diào)試器路徑,但是這種方式中斷難,不能在程序運行時中斷。另外,要使用 GDBSever 進行遠程調(diào)試,需要在 **miDebuggerServerAddress** 指定服務器地址。
使用 cppvsdbg 調(diào)試 GCC 編譯器生成的程序,可能會遇到程序中斷設置無效,或者可以中斷,但是程序運行時無源代碼關聯(lián)。cppvsdbg 和 Clang 搭配使用卻非常好。
在 DEBUG CONSOLE 窗口中是可以看到 gdb 運行是正常的,也可以通過 list 指令查詢到關聯(lián)源代碼。一個臨時解決方法(變通)就是手動將代碼復制到:
? ? Thread 1 "const" hit Breakpoint 1, main () at c:\demo\const.cpp:22
? ? 22? ? ? float c = 3.14;
使用 cppvsdbg 等調(diào)試器時,可以在 **console** 設置要使用的終端類型:
- `integratedTerminal`:VS Code 的集成終端
- `internalConsole`:內(nèi)部控制臺
- `externalTerminal`:外部的系統(tǒng)終端
- `newExternalWindow`:新創(chuàng)建的系統(tǒng)終端,對于 GUI 程序就會忽略控制臺 I/O。
一般使用 VSCode 集成控制臺,integratedTerminal 比其它兩個好在:不會彈出外部窗口,不會因為內(nèi)部窗口運行結束而看不到控制臺輸出,集成控制臺會記錄所有打印信息。
加載調(diào)試程序時的其它可用選項:
01. **presentation** - 控制配置實體如何在命令面板中分組、排序,顯示或隱藏 (group, order, hidden)。
02. **preLaunchTask** - 調(diào)試前執(zhí)行 tasks.json 的任務,默認任務是 ${defaultBuildTask}。
03. **postDebugTask** - 調(diào)試會話結束后執(zhí)行 tasks.json 的任務,注意要和任務標簽 **label** 一致。
04. **internalConsoleOptions** - 調(diào)試器控制臺面板的顯示狀態(tài)設置,默認會在調(diào)試時自動切換顯示。
05. **debugServer** - 此參數(shù)給擴展開發(fā)者使用,以允許連接到指定端口而不是啟動調(diào)試適配器。
06. **serverReadyAction** - 調(diào)試 Web 服務器時設置以自動在瀏覽器中打開指定的 URL。
調(diào)試器啟動兩種方式中,launch 表示直接和應用一起啟動,attach 表示將調(diào)試器附加到已經(jīng)啟動的進程上。設置好調(diào)試器,還可以通過 preLaunchTask 和 postDebugTask 這樣的配置去調(diào)用 Tasks 配置中任務。任務就是一個動作,如編譯程序,或者清理緩存文件等等,都可以配置為一個 Task。
調(diào)試控制控制臺會自動隱藏,重新打開需要使用 Debug: Select Debug Console 命令。
調(diào)試器本質(zhì)上也是一個程序,和自己用 C++ 編寫的程序沒有不同,差異只是在功能上,即調(diào)試器具有調(diào)試其它程序的功能,調(diào)試器需要去運行被調(diào)試的程序以獲得程序控制流主動權。
在調(diào)試 Web 服務器時,可以使用 serverReadyAction 參數(shù)指定一個自動打開瀏覽器的方式,比如以下配置,就會在外部瀏覽器中打開指定的 URL 地址。這個動作需要在程序中輸出可以按 pattern 格式匹配的內(nèi)容到調(diào)試器控制臺,編輯器匹配到控制臺內(nèi)容后再在瀏覽器中打開匹配到的地址。uriFormat 則是指示如果構造出相應的 URL 地址:
以下是配套演示用的 Go 語言程序:
根據(jù)不同調(diào)試器需要設置其它不同的參數(shù),一般可以設置要調(diào)試的程序或腳本,參數(shù)參考如下:
- **program** - 被調(diào)試的程序或文件路徑。
- **args** - 傳入被調(diào)試程序的參數(shù)。
- **env** - 環(huán)境變量設置,可以使用 null 來 "undefine" 一個環(huán)境變量。
- **envFile** - 指定一個 dotenv 環(huán)境變量配置文件。
- **cwd** - 設置程序運行時的工作目錄路徑,以方便定義可能使用到的依賴。
- **port** - 設置調(diào)試器要附著的端口。
- **stopOnEntry** - 設置是否在入口處中斷程序的執(zhí)行,false or true。
另外,VSCode 作為一個跨平臺開發(fā)工具,可以根據(jù)不同的平臺在配置實體中使用以下配置項目:
1. **window**:為 Window 平臺單獨配置的項目;
2. **linux**:為 Linux 平臺單獨配置的項目;
3. **osx**:為 Mac OS 平臺單獨配置的項目;
以下是 tasks.json 配置實體使用的參數(shù):
01. **label**: 任務標簽,會顯示在命令面板上。
02. **type**: 任務類型,如 shell 或者 process,前者執(zhí)行命令行工具,后者執(zhí)行一個程序。
03. **command**: 任務實際執(zhí)行的命令,如果按 shell 方式,就是執(zhí)行 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**: 任務輸出內(nèi)容的處理方式,與代碼關聯(lián)起來,如 $gcc,$go,$tsc 等等。
配置文件中常用的變量:
01. `${workspaceFolder}`:在 VS Code 中打開的項目文件夾路徑
02. `${file}`:當前開打開(激活)的文件
03. `${relativeFile}`:文件的相對路徑,相對于 ${workspaceFolder}?
04. `${fileBasename}`:當前打開文件的名稱
05. `${fileBasenameNoExtension}`:當前打開文件的名稱,不帶擴展名
06. `${fileExtname}`:當前打開文件的擴展名
07. `${fileDirname}`:當前打開文件的文件夾名稱
08. `${workspaceFolderBasename}` - 項目所在的目錄名稱
09. `${fileWorkspaceFolder}` - 當前打開的文件的工作區(qū)文件夾
10. `${relativeFileDirname}` - 當前打開的文件的目錄名,相對于 workspaceFolder
11. `${cwd}` - 任務運行器啟動時的當前工作目錄
12. `${lineNumber}` - 當前選中的行號在活動文件中
13. `${selectedText}` - 活動文件中當前選定的文本
14. `${execPath}` - 運行VS Code可執(zhí)行文件的路徑
15. `${defaultBuildTask}` - 默認構建任務的名稱
17. `${pathSeparator}` - 目錄分隔符號,在 macOS 或 Linux 系統(tǒng)為 /,Windows 上為 \
以下是 VSCode C++ 項目的配置參考,使用 Clang + cppvsdbg 和 GCC + cppdbg 兩種搭配: