12个版本
0.11.3 | 2023年1月30日 |
---|---|
0.11.0 | 2022年10月2日 |
0.10.0 | 2022年3月19日 |
0.9.3 | 2021年2月3日 |
0.9.0-preview.0 | 2020年7月10日 |
15 在 #gd-native 中排名
每月 431 次下载
在 21 个crate中使用(通过 gdnative-core)
21KB
522 行
Rust的GDNative绑定
godot-rust 是一个Rust库,它实现了对 Godot游戏引擎 的本地绑定。这使得您可以在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库不兼容的依赖项版本。此类格式的示例包括 Flatpak、Snap 和 AppImage。
截至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
。
入门指南
详细的设置说明在本书的《入门指南》部分。如有问题,请考虑阅读常见问题解答(FAQ)。
最新发布版本
这是使用godot-rust的推荐方法。在安装了bindgen
依赖和当前Godot版本后,将gdnative
存储库作为依赖项添加,并将存储库类型设置为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构建。
Async/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轻松编译的设置。
- hello-world - 您的第一个项目,将内容写入控制台。
- spinning-cube - 在原地旋转我们的节点,公开编辑器属性。
- scene-create - 使用Rust代码加载、实例化和放置场景。
- builder-export - 使用构建器API导出。
- property-export - 导出复杂属性,如集合。
- dodge-the-creeps - Rust版的小Godot游戏。
- signals - 连接和发射信号。
- resource - 创建和使用自定义资源。
- rpc - 简单的端到端网络。
- native-plugin - 创建自定义节点插件。
启动时,Godot编辑器尝试加载项目中使用的所有资源,包括原生库。如果后者不存在,编辑器将跳过场景中与缺失原生脚本相关的属性或信号。这导致依赖于编辑器中配置的属性或信号的任何示例场景树都无法使用。
第三方项目
要查看在godot-rust之上开发的游戏和集成列表,请参阅书籍中的第三方项目。
贡献
请参阅贡献指南。
许可
您提交的任何贡献,只要包含在本作品中,就应按照MIT许可证进行许可,不附加任何额外条款或条件。
依赖项
~1.5MB
~34K SLoC