介绍

警告

C# 支持是自Godot3.0以来提供的一项新功能。因此,您可能仍然会遇到一些问题,或者找到可以改进文档的地方。请向Godot的C# 报告 engine GitHub page 以及 documentation GitHub page .

本页简要介绍了C#,包括它是什么以及如何在Godot中使用它。之后,你可能想看看 how to use specific features ,阅读 differences between the C# and the GDScript API 再次访问 Scripting section 一步一步的教程。

C# 是微软开发的高级编程语言。在Godot中,它是用Mono5.x.net框架实现的,包括对C# 7.0的完全支持。Mono是微软.NET框架的一个开源实现,基于C# 和公共语言运行时的ECMA标准。检查其功能的一个良好起点是 Compatibility Mono文档中的页面。

注解

是关于C#语言整体的全面教程。如果您不熟悉它的语法或功能,请参阅 Microsoft C# guide 或者在其他地方寻找合适的介绍。

为Godot设置C#

Windows

下载并安装最新版本的 Visual Studio不是 Visual Studio代码),其中包含在Godot中使用C# 所需的实用程序。如果您不打算使用Visual Studio IDE,可以下载 Visual Studio Build Tools 相反。确保至少安装了.NET Framework 4.5目标包,您可以在“单个组件”选项卡中使用上面提到的任何安装程序来获得它。

MacOS和Linux

下载并安装最新版本的 Mono SDK . 从Godot 3.1beta3开始,版本号并不重要,因为Godot捆绑了自己的mono 5.18安装。我们只需要为nuget和msbuild安装mono,这是在Godot中使用C# 所必需的。

注解

要在MacOS上下载Mono,请使用 Mono Downloads Page . Visual Studio频道是Mono的早期版本,无法工作。

附加说明

您的Godot版本必须启用Mono支持,因此请确保下载 单声道版本 Godot的。如果您是从源代码构建godot,请确保按照中概述的步骤在构建中启用mono支持。 用mono编译 页。

总之,您必须安装了Visual Studio或Mono(取决于您的操作系统) and 单声道版本的Godot。

配置外部编辑器

C# 在Godot的脚本编辑器中的支持是最小的。考虑使用外部IDE或编辑器,例如 Visual Studio Code 或者单发育。这些功能为C# 提供了自动完成、调试和其他有用的功能。要在Godot中选择外部编辑器,请单击 编辑器→编辑器设置 向下滚动到 Mono . 在**Mono**下 ,点击 编辑 ,然后选择所选的外部编辑器。

注解

如果使用的是Visual Studio代码,请确保下载并安装 C# extension 启用语法突出显示和智能感知等功能。

创建一个C# 脚本

当您成功地为Godot设置了C# 之后,您在选择时应该看到以下选项 Attach script 在场景中节点的上下文菜单中:

../../../_images/attachcsharpscript.png

请注意,尽管某些细节发生了变化,但在使用C# 编写脚本时,大多数概念的工作方式都是相同的。如果你是Godot的新手,你可能会想学习 脚本 在这一点上。虽然文档中的某些地方仍然缺少C# 示例,但大多数概念可以很容易地从GDScript转移。

项目设置和工作流

当您创建第一个C# 脚本时,Godot会为您的Godot项目初始化C# 项目文件。这包括生成一个C# 解决方案 (.sln )和项目文件 (.csproj )以及一些实用程序文件和文件夹 (.monoProperties/AssemblyInfo.cs )所有这些但是 .mono 非常重要,应该致力于您的版本控制系统。 .mono 可以安全地添加到VCS的忽略列表中。排除故障时,有时删除 .mono 文件夹并让它重新生成。

请注意,当前存在一些问题,Godot和C# 项目不保持同步;如果删除、重命名或移动C# 脚本,更改可能不会反映在C# 项目文件中。在这种情况下,您必须手动编辑C# 项目文件。

例如,如果您创建了一个脚本(例如 Test.cs )并在Godot中删除它,编译将失败,因为C# 项目文件仍然希望丢失的文件存在。现在,你只需打开 .csproj 归档并查找 ItemGroup ,应该包含一行,如下所示:

<ItemGroup>
    <Compile Include="Test.cs" />
    <Compile Include="AnotherTest.cs" />
</ItemGroup>

只需删除该行,项目就可以再次正确构建。对于重命名和移动对象,如果需要,只需重命名并在项目文件中移动它们。

例子

这是一个空白的C# 脚本,其中有一些注释来演示它的工作原理。

using Godot;
using System;

public class YourCustomClass : Node
{
    // Member variables here, example:
    private int a = 2;
    private string b = "textvar";

    public override void _Ready()
    {
        // Called every time the node is added to the scene.
        // Initialization here.
        GD.Print("Hello from C# to Godot :)");
    }

    public override void _Process(float delta)
    {
        // Called every frame. Delta is time since the last frame.
        // Update game logic here.
    }
}

如您所见,在GDScript中,函数通常在全局范围内,如Godot print 功能在 GD 类的一部分 Godot 命名空间。以获取 GD 类,请参见类引用页 @GDScript@GlobalScope .

注解

请记住,要附加到节点的类应该与 .cs 文件。否则,将出现以下错误,并且无法运行场景: "Cannot find class XXX for script res://XXX.cs"

C# 和GDScript之间的一般差异

C# API使用 PascalCase 而不是 snake_case 在GDScript/C++中。在可能的情况下,字段和getter/setter已转换为属性。一般来说,C# Godot API力求尽可能地做到惯用。

有关详细信息,请参阅 与gdscript的API差异 页。

当前问题和已知问题

由于C#支持在Godot是一种全新的支持,所以有些成长的痛苦和事情需要解决。下面是您在进入Godot的C#时应该注意的最重要的问题列表,但如果有疑问,也请查看该官员 issue tracker for Mono issues .

  • 如上所述,在Godot中删除、重命名或移动内容时,C#项目并不总是自动保持同步。 (#12917

  • 编写编辑器插件是可能的,但目前它相当复杂。

  • 除了导出的变量外,热重新加载时状态当前未保存和还原。

  • 只有桌面平台(Linux、Windows和MacOS)才支持导出Mono项目。目前不支持Android、iOS、HTML5和UWP (#20267#20268 #20270 #20271

  • 附加的C# 脚本应引用具有与文件名匹配的类名的类。

C#在Godot的表现

根据一些初步资料 benchmarks C# 在Godot中的表现-虽然通常是相同的数量级-大致是 ~4× 在一些幼稚的案例中。C++仍然有点快,具体情况根据你的用例而不同。对于大多数一般的脚本工作负载,GDScript可能足够快。C# 速度更快,但与Godot交谈时需要一些昂贵的编组。

在Godot使用Nuget软件包

NuGet 软件包可以与Godot一起安装和使用,就像任何C# 项目一样。许多IDE能够直接添加包。也可以通过在 .csproj 位于项目根目录中的文件:

    <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="11.0.2"/>
    </ItemGroup>
    ...
</Project>

每当添加或修改包时,运行 nuget restore 在项目目录的根目录中。要确保nuget包可供msbuild使用,请运行:

msbuild /t:restore