#egui #godot #后端 #原创 #设置 #仓库 #gdext

gdext-egui

Godot 4 的 Egui 后端实现。由于原始依赖 gdext 尚未稳定且未在 crates.io 上发布,因此此软件包也未发布。您可以通过 Git 仓库设置对此软件包的依赖

1 个不稳定版本

0.0.0 2024年2月23日

#47 in #godot

MPL-2.0 许可证

2KB

gdext-egui Godot 4 的 egui 后端实现

示例 Godot 项目

查看工作示例的 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 支持不理想。

无运行时依赖