1 个不稳定版本
0.0.0 | 2024年2月23日 |
---|
#47 in #godot
2KB
gdext-egui
Godot 4 的 egui 后端实现
查看工作示例的 Gif(Reddit 链接,2.8MiB~)
用法
在 Cargo.toml 中,在 [dependencies]
标签下
godot = { git = "https://github.com/godot-rust/gdext", branch = "master" }
gdext-egui = { git = "https://github.com/kang-sw/gdext-egui", branch = "master" }
注意
如果从
gdext
主分支软件包中任何 API 破坏导致此软件包编译错误,您可以将以下行添加到Cargo.toml
以使其与当前(2024-02-23 16:07:10)依赖版本兼容[patch.crates-io] godot = { git = "https://github.com/godot-rust/gdext", rev = "6614030150950ffa6bd0311a2b914b86d5b7e9e9" }
在 Rust 中,编写一个像这样的 GodotClass 派生类
#[derive(GodotClass)]
#[class(init, base=Node)]
struct Showcase {
base: Base<Node>,
#[init(default = OnReady::manual())]
egui: OnReady<Gd<gdext_egui::EguiBridge>>,
demos: egui_demo_lib::DemoWindows,
}
#[godot_api]
impl INode for Showcase {
fn ready(&mut self) {
self.egui.init(gdext_egui::EguiBridge::new_alloc());
// `EguiBridge` MUST be registered in scene tree to work properly!
let mut gd_self = self.to_gd();
gd_self.add_child(self.egui.clone().upcast());
self.egui.set_owner(gd_self.upcast());
}
fn process(&mut self, _d: f64) {
// If you hope to put UI code in main loop, you MUST get `egui::Context`
// via `EguiBridge::current_frame()` method!
let ctx = self.egui.bind().current_frame().clone();
self.demos.ui(&ctx);
}
}
不安全
使用多个不安全块来在 egui 和 Godot 原生 UI 之间实现 拖放
方案。通常认为它是安全的,因为 Godot 原生和
特性
- 窗口支持
- 基本视口
- 创建 / 销毁
- 鼠标输入处理
- 编辑器扩展
- 编辑器内视口
- 文本输入 / IME 支持
- "GUEST MODE" 视口
- 在除了根视口之外的任何现有窗口上生成 EGUI 层。
- 视口关闭信号
- 拖放
- <-> Godot 编辑器
- <-> 操作系统文件系统
- 基本视口
- 渲染
- 裁剪
- 实用工具
- 暴露 GdScript API(本质上,常用方法的类包装器)
- 属性显示(用于编辑器集成)
限制
- 编辑器插件仍在开发中。
- IME 支持不理想。