1个不稳定版本

0.0.0 2021年10月17日

37#gd-native

Zlib 许可证

1KB

GDNative绑定Rust

crates.io stable docs master docs book website

godot-rust 是一个实现Godot游戏引擎原生绑定的Rust库。这允许你在Godot中开发游戏或其他应用程序,同时利用Rust的强项,如其类型系统、可扩展性和性能。

注意:如果你在寻找GDExtension (Godot 4) 的Rust绑定,请查看 gdext

维护策略

gdnative 被认为功能基本完整,并且重点维护API稳定性。我们尽量避免不必要的破坏性更改,并在必要时尽量减少其对最终用户的影响。

我们遵循 Cargo的语义版本控制 作为在版本之间传达公共API更改的手段。未来的发布计划已在GitHub上公开,使用 里程碑 功能。请注意,我们使用 breaking-change 标签来指示存在 任何 技术破坏,无论其对最终用户程序的影响预期如何。

如果你想在开始之前确定你想要做的事情是否在项目的范围内,并且符合我们的维护策略,请在开始之前与项目维护者 取得联系

工具链兼容性

gdnative 目前支持的最小Rust版本 (MSRV) 为 1.70。我们使用Rust 2021版。

警告Linux用户:请注意您Godot二进制文件的来源! 使用基于容器的格式分发的Godot二进制版本可能包含与从您的系统直接构建的GDNative库不兼容的依赖项版本。此类格式的例子包括 FlatpakSnapAppImage

截至2023年,一些包管理器可能在请求Godot时静默安装这些版本之一而不是正常包,这可能导致与您的GDNative库出现奇特的兼容性问题。我们建议使用来自 godotengine.org 的官方二进制文件,用于编辑器和导出模板。

由于GDNative API没有严格遵循SemVer,并且一些概念没有与Rust一对一映射(默认参数),一个godot-rust版本难以同时与多个Godot版本保持兼容。

然而,我们默认支持最新稳定的 Godot 3 小版本发布,并允许您使用 custom-godot 功能标志轻松使用自定义引擎版本(见下文)。

兼容性列表

  • Godot 3.5.1(与 gdnative 0.11 兼容)
  • Godot 3.4(与 gdnative 0.10 兼容,0.11 的自定义构建)
  • Godot 3.3(自定义构建)
  • Godot 3.2(自定义构建)

绑定不支持 Godot 4。如果您正在寻找 GDExtension (Godot 4) 的 Rust 绑定,请查看 gdextension

入门指南

详细的设置说明在 本书的“入门”部分。如有问题,请考虑阅读 常见问题解答

最新发布版本

这是使用 godot-rust 的推荐方式。在安装 bindgen 依赖项和当前 Godot 版本后,将 gdnative crate 添加为依赖项,并将 crate 类型设置为 cdylib

[dependencies]
gdnative = "0.11"

[lib]
crate-type = ["cdylib"]

最新 GitHub 版本

如果您想从最新的功能更新和错误修复中受益,可以使用 GitHub 版本。我们有一个相对复杂的 CI 和测试套件来保证基本稳定性,但 GitHub 版本通常比 crates.io 发布版更具实验性,且实战经验较少。我们也不保证任何 SemVer 兼容性。

[dependencies]
gdnative = { git = "https://github.com/godot-rust/godot-rust.git" }

[lib]
crate-type = ["cdylib"]

自定义构建

要使用与不同 Godot 版本或自定义构建的引擎兼容的绑定,请参阅用户指南中的 “自定义 Godot 构建”

异步/yield 支持

异步支持正在开发中,如果启用了 gdnative 上的 async 功能,则可以在 gdnative::tasks 中找到低级 API。请参阅本书中的 此页,了解如何使用 Tokio 使用异步功能。

示例

一个典型的用例是公开您的 本地类,一个可以从 Godot 引擎调用的 Rust API。生成的本地脚本可以附加到场景树中,就像 GDScript(.gd 文件)一样。

这是通过动态库和 GDNative 接口 实现的,它将由 Godot 加载。必要的连接由 godot-rust 在幕后完成。一个简单的“Hello world”应用程序可能看起来像这样

use gdnative::prelude::*;

#[derive(NativeClass)]
#[inherit(Node)]
pub struct HelloWorld;

#[methods]
impl HelloWorld {
    fn new(_base: &Node) -> Self {
        HelloWorld
    }

    #[method]
    fn _ready(&self, #[base] _base: &Node) {
        godot_print!("Hello, world.");
    }
}

fn init(handle: InitHandle) {
    handle.add_class::<HelloWorld>();
}

godot_init!(init);

更多示例

重要提示

要运行或编辑示例,您需要首先为其构建本地库。否则,项目将损坏。您可以手动使用 cargo build 来执行此操作,或者使用 example.sh 脚本以方便起见:使用 ./example.sh run hello-world./example.sh edit hello-world 来运行或编辑编辑器。

/examples 目录包含几个可直接使用的示例,包括 Godot 项目和易于从 Cargo 编译的设置。

启动时,Godot编辑器尝试加载项目中使用的所有资源,包括原生库。如果后者不存在,编辑器将跳过场景中缺失的原生脚本相关的属性或信号。这导致依赖于编辑器配置的属性或信号的任何示例场景树都无法正常工作。

第三方项目

要查看在godot-rust之上开发的游戏和集成的列表,请查看书中第三方项目列表。

贡献

请参阅贡献指南

许可证

您提交的任何贡献,若要包含在作品中,均应遵守MIT许可证,且无任何额外条款或条件。

无运行时依赖