最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Godot with C#

2023-02-01 08:03 作者:緊果唄  | 我要投稿

Godot 有兩套語言支持構(gòu)建:

  • - 默認(rèn)的支持 GDScript,GDExtension

  • - 另一套則集成了 .NET 6 支持 C#, GDScript, GDExtension。

要使用 C# 語言進行 Godot 項目開發(fā),系統(tǒng)上需要安裝 .NET SDK 6.0 或 7.0,.NET 7.0 的支持還不完善。相比 GDScript 腳本,C# 是一個編譯型的高級語言,Godot 通過開源的 Mono 6.x 框架支持 C# 8.0 語言版本。與作用快速原型開發(fā)使用 GDScript 腳本不同,每次執(zhí)行之前都需要進行編譯,以生成最新的 C# 程序集。但是,作為預(yù)編譯語言,它的運行效率雖然不能和 C++ 看齊,但比 GDSCript 有非常大的效率提升,簡單情況有 4x 提升。并且,在使用的便利程序上,要比 C++ 好,所以在不是極限性能需要情況下,C# 是值得一試的方案。


怎么選開發(fā)語言,就是權(quán)衡開發(fā)效率與程序運行性能:

  • - 選擇 GDScript 可以快速地做原型迭代;

  • - 選擇 C# 一方面提升了性能,另外它比 C++/Rust 更容易上手,同時編譯速度也不太慢;

  • - 最后,極致性能要求,那么就選擇 C++/Rust 折騰去吧!

Godot 3.2.3 開始,不需安裝 Mono SDK,除非需要從源代碼構(gòu)建 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# 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 查詢相關(guān)命令;

  • - 在狀態(tài)欄中,點擊 Godot Project 字樣處選擇工程目錄;

  • - 在狀態(tài)欄中,點擊 Play in Editor (mono) 字樣處運 Godot 工程;

  • - 直接打開 Run and Debug 側(cè)欄面板選擇 ``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 面板查詢編譯日志信息。

配置文件 ``tasks.json`` 默認(rèn)只提供了一個構(gòu)建任務(wù),可以通過菜單 Terminal → Run Build Task... 執(zhí)行:?

如果添加運行配置時,沒有提供 **C# Godot** 配置,請檢查以上三個擴展是否完成安裝,并且處于啟用狀態(tài)。配置好開發(fā)環(huán)境,就可以在 Godot 給節(jié)點附加腳本時,在 Attach Script 對話框中選擇 C# 語言。

Node 節(jié)點類擴展代碼示例:

使用 C# 與 GDScript 的一些差異:

  • - C# 使用 ``PascalCase`` 代碼風(fēng)格,GDSCript/C++ 使用 ``snake_case`` 風(fēng)格,`AddChild()` vs. `add_child()`。

  • - C# 類名要求代碼文件名一致,否由會提示 *"Cannot find class XXX for script res://XXX.cs"*

  • - C# 中使用 Godot 命令空間下的 GD 管理 @GDscript 和 @GlobbalScope 全局函數(shù)符號。

  • - C# 導(dǎo)出符號生效之前,需要重新編譯程序集,通過 Godot 界面右上角的 Build 按鈕構(gòu)建工程。

  • - C# 語句使用分號作為結(jié)束符號,而 GDScript 不需要。

  • - C# 中以 `Godot.Object` 作為所有類型的基類,新版本更名為 `Godot.GodotObject`。

  • - C# 使用 this 引用當(dāng)前類實例,GDScript 使用 self 引用當(dāng)前類實例。

在 C# 中,也不能像 GDScript 那樣,直接拖動節(jié)點到腳本中創(chuàng)建引用,也不能使用 onready,而需要在 Ready 這類事件中,使用 FindNode 或者 GetNode 獲取節(jié)點引用:

使用 C# 進行 Godot 項目開發(fā),還需要解決以下這些基本問題:

  • - 不同語言之間的相互調(diào)用問題;

  • - Godot 信號系統(tǒng)的使用方式的差異;

  • - C# 與 GDScript API 之間的差異;

  • - Godot 不同版本之間的差異處理等等;

Godot 考慮到了不同語言之間相互調(diào)用,C# 調(diào)用 GDScript API 或者屬性讀寫使用 GodotObject 提供的方法:

而在 GDscript 訪問 C# API 則是直接調(diào)用,就像使用其它 GDScript 對象一樣,實例化操作如下所示:


注意,實例化得到的類型以 Godot 內(nèi)置類型為準(zhǔn),而不是按 C# 或 GDScript 中聲明的類型作為判斷標(biāo)準(zhǔn)。

比如,后面的 MyNode2D 在使用 GDScript `is` 關(guān)鍵字做類型判斷時,需要使用內(nèi)置類型 Node 作為參考。

C# 調(diào)用 GDScript API 時注意,如果第一個參數(shù)是一個數(shù)組,那么就需要顯式轉(zhuǎn)換為 `object` 類型。否則,

數(shù)組元素就會被當(dāng)作一個參數(shù)使用,并可能導(dǎo)致函數(shù)簽名不匹配。

編寫 C# 類代碼時注意,類名與 ``.cs`` 代碼文件名一致,否則提示錯誤:

? ? Invalid call. Nonexistent function `new` in base.

比如,MyCoolNode.cs 文件就應(yīng)該定義 MyCoolNode 類型。并且需要繼承自 ``Godot.Object`` 或其它子類。最后,C# 工程文件 ``.csproj``中要正確引用``.cs`` 文件,這樣才會生效。

Godot 4.x Mono 信號機制在 C# 使用委托機制實現(xiàn),并且可以使用更高效的 += 和 -= 運算符監(jiān)聽、或者取消監(jiān)聽。另外,Connect 方法也有更新,使用 Callable 對象包裝回調(diào)函數(shù)及回調(diào)參數(shù)。另外,通過節(jié)點的嵌套類 SignalName 可以訪問信號名稱,它繼承自 GodotObject.SignalName。清理節(jié)點時,Godot 會負責(zé)所有信號監(jiān)聽事件的清理:

以下是 Callable 類參考文檔中展示的用法,使用了嵌套類 MethodName 或者 nameof 獲取方法名稱。但是在默認(rèn)參數(shù)綁定操作上有差別,GDScript 中可以直接調(diào)用 Callable 對象的 bind() 方法綁定默認(rèn)參數(shù)。而目前在 C# 中給信號綁定默認(rèn)參數(shù)則需要使用 lambdas 來構(gòu)造出一個包含默認(rèn)參數(shù)的 Callable 對象。如果方法沒有參數(shù),也沒有返回值,可以包裝成 Action,由 Callable.From() 再包裝成可調(diào)用對象。

Godot 4.x Mono 所有信號定義名稱使用 EventHandler 結(jié)尾,定義好信號后,完成后,Godot 在幕后自動使用 C# `event` 關(guān)鍵字創(chuàng)建相應(yīng)的事件。然后,可以像其他 Godot 信號一樣使用自定義信號事件。

注意,類型定義使用的 partial class,即表示類定義代碼是分開文件存放的,還可以包含在其它代碼文件。

除了直接使用委托方式定義信號,還可以使用 AddUserSignal() 方法添加自定義信號。

Godot 3.x Mono 自定義信號的使用有些差別,獲取信號名稱使用 nameof(MySignal) 語法,并且信號連接依然是使用節(jié)點的 Connect 方法進行。信號名稱的獲取這種操作一致性不夠好,例如,獲取按鈕節(jié)點的信號就不能使用 nameof(Button.Pressed) 這樣的表達,而是直接使用 "pressed" 字符串字面量。

總結(jié)起來,C# 中有三種獲取或使用信號名稱的方式,Godot 3.x 只支持前兩種:

  • - `EmitSignal("MySignal");` 直接使用字符串字面量

  • - `EmitSignal(nameof(MySignal));` 使用 nameof 關(guān)鍵字

  • - `EmitSignal(SignalName.MySignal);` 使用內(nèi)嵌類 SignalName

使用自定義信號可能遇到的問題是:調(diào)用 EmitSignal() 時報錯,表示信號不存在,而調(diào)用 AddUserSignal() 手動添加信號時,又表示不能重復(fù)添加已經(jīng)定義的信號,這可能是定義信號的代碼沒有寫到類體內(nèi)部。

一些 GDScript 遇不到的問題,如下:

一個類型中結(jié)構(gòu)體,Vector2,在 C# 中是通過拷貝進行賦值的,也就是說在獲取 Position 屬性時,獲取到的是一個副本,對這個副本賦值并不會影響到原來歸屬的節(jié)點。解決方法:創(chuàng)建一個變量引用 Position 再進行賦值操作。在 C# 10 版本中,可以對結(jié)構(gòu)體使用 with 表達式來解決這種問題。

通常,使用 C# 編程而不是 GDScript,一個主要的目的可能是為了提升程序運行速度,所以應(yīng)該避免編寫無效率的代碼,以下是兩種節(jié)點的移動方式對比,后者更高效:

給 Godot C# API 傳遞原始的 byte[] 或者字符串,需要 marshalling 操作,這相對不夠高效。隱式轉(zhuǎn)換 string 為 NodePath 或 StringName 會產(chǎn)生原生互操作和 marshalling 成本,因為字符串必須編組并傳遞給相應(yīng)的原生構(gòu)造函數(shù)。


參考:

  • - http://www.mono-project.com/docs/about-mono/compatibility

  • - https://docs.godotengine.org/en/3.5/tutorials/scripting/c_sharp/c_sharp_features.html

  • - https://docs.godotengine.org/en/3.5/tutorials/scripting/c_sharp/c_sharp_differences.html

  • - https://docs.godotengine.org/en/stable/tutorials/scripting/cross_language_scripting.html

  • - https://docs.godotengine.org/en/stable/tutorials/scripting/creating_script_templates.html

  • - https://docs.godotengine.org/en/latest/tutorials/scripting/c_sharp/index.html

  • - https://docs.godotengine.org/en/latest/tutorials/scripting/c_sharp/c_sharp_basics.html

  • - https://docs.godotengine.org/en/latest/tutorials/scripting/c_sharp/c_sharp_exports.html

  • - https://docs.godotengine.org/en/latest/tutorials/scripting/c_sharp/c_sharp_differences.html

  • - https://docs.godotengine.org/en/latest/tutorials/scripting/c_sharp/c_sharp_signals.html

  • - https://docs.godotengine.org/en/latest/contributing/development/core_and_modules/object_class.html#doc-binding-properties-using-set-get-property-list

  • - [Bunnymark](https://github.com/cart/godot3-bunnymark)

  • - [Godot.NET.Sdk](https://www.nuget.org/packages/Godot.NET.Sdk/#versions-body-tab)

  • - [Mono SDK](https://www.mono-project.com/download/stable/#download-lin)

  • - [.NET SDK](https://dotnet.microsoft.com/download)

  • - [Visual Studio Code](https://code.visualstudio.com/)

  • - [Godot 3.5.1 Mono](https://downloads.tuxfamily.org/godotengine/3.5.1/mono/)

  • - [CustomType for Godot 3.x](https://github.com/Jeangowhy/Godot-Tour/tree/main/mono-3x/addons/CustomType)

  • - [CustomType for Godot 4.x](https://github.com/Jeangowhy/Godot-Tour/tree/4.x/mono-4x/addons/CustomType)


Godot with C#的評論 (共 條)

分享到微博請遵守國家法律
中西区| 白银市| 宜君县| 霍林郭勒市| 隆昌县| 贡嘎县| 同江市| 岑巩县| 靖宇县| 博罗县| 伊吾县| 汪清县| 上栗县| 清新县| 深水埗区| 宣化县| 涿鹿县| 青州市| 团风县| 长顺县| 嵩明县| 宁乡县| 衡阳市| 鸡东县| 兴和县| 石门县| 奉新县| 凌海市| 门头沟区| 茶陵县| 赤峰市| 荆门市| 富锦市| 含山县| 仁布县| 福鼎市| 邮箱| 宝应县| 革吉县| 定边县| 米脂县|