Godot 4 默认支持 C#,但需满足 .NET 6+、配置 MSBuild、启用 C# 支持;脚本须继承节点类并用 [GlobalClass] 标记,类名与文件名一致;需手动编译,注意节点查找时机与信号连接生命周期。

Godot 4 默认支持 C#,但必须满足 .NET 6+ 运行时、正确配置 MSBuild 工具链,且项目需启用 C# 支持——否则 new CSharpScript() 会失败,编辑器也识别不了 .cs 文件。
确认 Godot 已启用 C# 支持
新建项目时勾选 “C#” 模板;已有项目需手动启用:菜单栏 Project → Tools → C# → Install Mono Runtime(若未安装),再点击 Generate C# Solution。该操作会生成 .sln、.csproj 和 godot_cs_config.json。若跳过此步,脚本保存后不会出现在场景面板的脚本下拉列表中。
- 检查
project.godot中是否含[mono]区块,且mono/enable = true - 确保 Godot 安装路径下存在
GodotSharp/Tools目录,否则编译器无法调用dotnet - Linux/macOS 用户需手动安装
dotnet-sdk-6.0或更高版本,并在终端验证dotnet --version
编写继承 Node 的基础脚本
C# 脚本必须继承 Godot 中的节点类型(如 Node、Sprite2D、CharacterBody2D),并用 [GlobalClass] 特性标记类(Godot 4.2+ 推荐),否则无法在编辑器中挂载。
using Godot;
<p>[GlobalClass]
public partial class Player : CharacterBody2D
{
private float _speed = 300f;</p><pre class="brush:php;toolbar:false;">public override void _PhysicsProcess(double delta)
{
Vector2 inputDir = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
Velocity = inputDir * _speed;
MoveAndSlide();
}}
- 类名必须与文件名完全一致(如
Player.cs→class Player),否则编译报错CS0246 - Godot 4.2+ 推荐使用
partial类 +[GlobalClass],避免手动绑定信号;旧版需在编辑器中右键节点 → “Attach Script” 并选择 C# 模板 -
_PhysicsProcess的参数是double(非float),传入delta是固定时间步长,勿转为(float)delta再乘速度——这会导致跨平台帧率不一致
访问节点与信号连接的写法差异
C# 中节点查找和信号连接不依赖字符串反射,而是强类型方法调用,但需注意生命周期:GetNode<t>()</t> 在 _Ready() 后才安全,OnReady() 是更稳妥的初始化入口。
public partial class Door : Node2D
{
[Export] public NodePath LeverPath { get; set; }
private Lever _lever;
<pre class="brush:php;toolbar:false;">public override void _Ready()
{
_lever = GetNode<Lever>(LeverPath);
_lever.OnActivated += OnLeverActivated; // 假设 Lever 有 public Action OnActivated
}
private void OnLeverActivated()
{
QueueFree();
}}
-
[Export]字段可在编辑器中赋值,但NodePath必须指向有效路径,否则GetNode<t>()</t>返回null - 信号连接推荐用 C# 事件(如
OnActivated += ...)或Connect()方法,避免用字符串名(如"body_entered")——后者易拼错且无编译检查 - 务必在
_ExitTree()或节点销毁前调用Disconnect()或移除事件订阅,否则引发内存泄漏或空引用异常
最常被忽略的是:C# 脚本修改后需手动触发编译(Ctrl+B 或点击编辑器上方 “Build” 按钮),Godot 不会像 GDScript 那样热重载;若脚本有语法错误,Output 面板会显示 MSBuild 错误而非运行时异常,此时需先修复编译错误才能看到游戏内行为。











