
1. 项目概述与核心价值如果你和我一样既迷恋 Rust 语言在性能和安全上的极致表现又离不开 Godot 引擎那直观、高效且功能强大的编辑器那么godot-bevy这个项目很可能就是你一直在寻找的“终极答案”。简单来说它是一个桥梁一个能让 Godot 这颗强大的游戏引擎“大脑”用上 Bevy 框架那套精妙绝伦的实体组件系统ECS来驱动游戏逻辑的桥梁。在传统的游戏开发中我们常常面临一个两难选择是用引擎原生的、与编辑器深度绑定的脚本语言如 GDScript、C#来快速开发享受便利还是为了追求极致的性能和控制力用 C 或 Rust 这样的系统级语言从头构建但牺牲掉一部分编辑器的便捷性。godot-bevy的出现正是为了打破这个僵局。它让你可以继续在 Godot 编辑器中拖拽场景、设计 UI、配置动画和物理享受其顶级的渲染管线和工作流同时游戏最核心、最吃性能的逻辑部分——比如成千上万个单位的 AI 决策、复杂的物理模拟、密集的数据处理——则可以完全交给 Rust 和 Bevy 的 ECS 来处理。这种组合相当于把 Godot 的“面子”表现层和 Bevy 的“里子”逻辑层完美结合兼顾了开发效率与运行时性能。我自己在尝试将一些性能要求较高的原型项目从纯 GDScript 迁移过来后最直观的感受是帧率更稳了逻辑代码的结构更清晰了那种因为脚本语言动态特性带来的、在复杂项目后期难以维护的“ spaghetti code ”面条代码问题也得到了极大的缓解。对于有志于开发大型、复杂或对性能有苛刻要求的 2D/3D 游戏的开发者而言godot-bevy提供了一条极具吸引力的技术路径。2. 架构设计与核心理念拆解要理解godot-bevy如何工作我们得先拆解一下它的核心架构。这并非一个简单的“胶水层”而是一个经过深思熟虑的双向通信与数据同步系统。2.1 核心通信模型Bevy 作为“逻辑服务器”你可以把整个架构想象成一个微型的客户端-服务器模型。在这个模型里Godot 引擎是“客户端”/“渲染前端”它负责管理场景树、处理用户输入鼠标、键盘、手柄、执行渲染命令、播放音效和动画。它拥有所有游戏对象Node的最终表现权。Bevy 的 ECS 是“逻辑服务器”/“后端”它运行在一个独立的、由 Rust 管理的世界里。这个世界里没有Node只有Entity实体、Component组件和System系统。所有的游戏逻辑如移动计算、伤害判定、状态机更新都在这里发生。godot-bevy的核心工作就是在每一帧或按需将必要的数据在这两个世界之间进行同步。例如输入同步Godot 捕获到用户按下了“空格键”这个事件被godot-bevy捕获并转换成一个 Bevy 可以理解的InputEvent组件插入到某个代表玩家的实体上。逻辑计算Bevy 的系统检测到这个InputEvent根据游戏规则计算出玩家实体应该跳跃于是更新该实体上Transform组件中的translation.y值代表位置。变换同步godot-bevy的GodotTransformSyncPlugin插件会检测到 Bevy 世界中Transform组件的变化并将新的位置、旋转、缩放数据“推回”给 Godot 场景树中对应的那个Node2D或Node3D节点。渲染呈现Godot 引擎使用更新后的节点数据在下一帧渲染出玩家跳跃的画面。这种分离带来了巨大的好处你的游戏逻辑Bevy 端是纯粹的数据计算与渲染细节解耦更容易进行单元测试、逻辑复现和性能优化。而 Godot 端则专注于它最擅长的内容创作和表现。2.2 插件化系统按需构建你的引擎从v0.8版本开始godot-bevy引入了一个至关重要的设计全插件化架构。这不再是“一刀切”的集成而是一个“自助餐”式的模块化系统。在早期版本中库默认包含了所有功能变换同步、音频、输入等即使你的游戏只是一个简单的 2D 点击游戏用不到 3D 物理这些代码仍然会被编译进最终的可执行文件增加了二进制文件大小和潜在的开销。现在的插件系统彻底改变了这一点。核心库godot-bevy只提供最基础的桥梁和生命周期管理。所有高级功能如GodotTransformSyncPlugin变换同步、GodotAudioPlugin音频、BevyInputBridgePlugin输入处理都作为独立的、可选的插件存在。这意味着什么意味着你可以像搭积木一样构建你的“专属游戏引擎”。例如做一个纯 2D 的视觉小说你可能只需要核心库和输入插件。做一个 3D 动作游戏你需要核心库、变换同步插件、输入插件可能还需要物理插件如果使用 Bevy 的物理引擎。做一个音频体验项目你可能只需要核心库和音频插件。这种设计的优势极其明显更小的二进制体积没有用到的功能就不会被编译进去。对于发布到网页WebAssembly或移动平台每一 KB 都至关重要。更清晰的依赖关系从Cargo.toml和代码中你能一目了然地知道项目依赖了哪些功能便于维护和理解。更好的编译时间减少不必要的代码编译尤其是在开发迭代阶段能略微提升编译速度。更高的运行时性能每个插件只运行它必要的系统减少了每帧需要遍历和检查的代码路径。注意插件化是一把双刃剑。对于新手来说需要额外学习每个插件的用途和添加方式。建议在项目开始时先使用GodotDefaultPlugins它包含了所有标准插件类似于旧版行为快速搭建原型。当项目逐渐成熟并对性能、体积有要求时再根据实际 profiling性能分析结果逐步替换为精确的插件集这是一个更稳妥的工作流。3. 环境搭建与项目初始化实战理论说得再多不如动手搭一个。这里我会带你走一遍从零开始创建一个godot-bevy项目的完整流程并解释每一个步骤背后的原因。3.1 前置条件安装首先确保你的开发环境已经就绪Rust 工具链这是必须的。访问 rustup.rs 安装rustc、cargo和rustup。安装后在终端运行rustc --version确认版本至少为1.88.0这是godot-bevy的 MSRV。我推荐使用rustup default stable来始终使用稳定版。Godot 4 引擎从 Godot 官网 下载 Godot 4。godot-bevy目前主要支持 Godot 4.4.x 到 4.6.x具体看兼容性矩阵。建议下载“标准版本”Standard version它包含了 C# 支持这对于godot-rust的绑定生成有时是必要的依赖。下载后将可执行文件放在一个方便的位置并最好将其路径添加到系统的环境变量PATH中这样后续命令行操作会更方便。Godot-Rust 命令行工具godot-bevy底层依赖于godot-rustGDExtension。我们需要安装其配套工具来构建和编译本地库。在终端运行cargo install godot-cli安装完成后运行godot --help检查是否成功。这个godot命令是godot-cli提供的工具并非引擎本身它用于项目脚手架、构建等。3.2 创建你的第一个混合项目我们不从空白开始而是利用godot-cli的模板功能这是最可靠的方式。创建项目目录并初始化# 创建一个新目录并进入 mkdir my-godot-bevy-game cd my-godot-bevy-game # 使用 godot-cli 初始化一个 GDExtension 库项目 godot lib new执行命令后它会交互式地询问一些信息library name: 输入你的库名例如my_game_rust。这会决定生成的动态库文件名如libmy_game_rust.so、my_game_rust.dll。godot version: 选择4。rust edition: 选择最新的稳定版如2024。其他选项如作者、描述等可按需填写或直接回车跳过。修改Cargo.toml依赖 初始化完成后你会看到一个Cargo.toml文件。我们需要将其中的依赖从基础的godot替换为godot-bevy。用编辑器打开Cargo.toml将[dependencies]部分修改为[dependencies] godot-bevy 0.11.0 bevy { version 0.18, default-features false } godot 0.4关键点解析godot-bevy 0.11.0: 指定我们使用的核心库版本。请始终查看项目的 crates.io 页面或 GitHub 发布页以获取最新版本。bevy { version 0.18, default-features false }: 这是与godot-bevy 0.11.x兼容的 Bevy 版本。default-features false至关重要因为 Bevy 默认会启用渲染、窗口等后端这些在 Godot 环境下是冲突且不必要的。禁用默认特性可以避免编译错误和链接冲突。godot 0.4: 这是godot-bevy底层依赖的 GDExtension 绑定库版本必须与godot-bevy版本要求匹配。编写 Rust 入口代码 打开src/lib.rs文件将默认的内容替换为godot-bevy的基本结构。我们从一个最简单的、只打印日志的例子开始use bevy::prelude::*; use godot::prelude::*; use godot_bevy::prelude::*; // 这是 godot-bevy 约定的应用入口点宏。 // 它标记的函数会在 Godot 加载此 GDExtension 时被调用用于构建 Bevy App。 #[bevy_app] fn build_app(app: mut App) { // 目前我们不添加任何插件只使用最核心的功能。 // 这样我们的二进制体积最小。 godot_print!([Rust] Bevy App 初始化成功); } // 这个结构体和 #[gdextension] 宏是 godot-rust 的要求 // 用于向 Godot 注册扩展库。godot-bevy 在背后已经处理了大部分工作。 struct MyExtension; #[gdextension] unsafe impl ExtensionLibrary for MyExtension {}这段代码做了两件事在 Bevy App 构建时向 Godot 控制台打印一条消息定义了 GDExtension 的库入口。构建 Rust 库 在项目根目录下运行cargo build如果是开发调试使用cargo build编译为 debug 模式。如果是准备发布使用cargo build --release。编译成功后你会在target/debug或target/release目录下找到生成的动态库文件如libmy_game_rust.so、my_game_rust.dll、libmy_game_rust.dylib。配置 Godot 项目godot-cli new命令应该已经生成了一个基本的godot项目目录和一个extension/gdextension.toml配置文件。这个文件告诉 Godot 如何加载我们的 Rust 库。通常你不需要手动修改它但了解其内容有帮助[configuration] entry_symbol gdextension_rust_init # Rust 库的初始化函数 compatibility_minimum 4.3 # 最低 Godot 版本 [libraries] linux.debug res://target/debug/libmy_game_rust.so # Linux 调试库路径 linux.release res://target/release/libmy_game_rust.so windows.debug res://target/debug/my_game_rust.dll windows.release res://target/release/my_game_rust.dll macos.debug res://target/debug/libmy_game_rust.dylib macos.release res://target/release/libmy_game_rust.dylib关键点在于路径res://target/...它基于 Godot 项目的res://资源根目录来定位我们的 Rust 库。因此Godot 项目文件project.godot必须放在我们整个仓库的根目录与Cargo.toml同级这样res://才能正确映射。创建并运行 Godot 场景打开 Godot 编辑器选择“打开”并定位到你的项目根目录包含project.godot的目录。在场景面板中创建一个新的“2D 场景”。Godot 会自动创建一个Node2D作为根节点。选中这个根节点在右侧的“节点”选项卡中点击“添加子节点”搜索并添加一个Sprite2D节点。为Sprite2D指定一个纹理比如一个简单的图标或图片。重要暂时不需要写任何 GDScript。我们的 Rust 代码目前只是打印日志还没有与场景节点交互。点击编辑器顶部的“运行”按钮或按F5。如果一切配置正确你会在 Godot 编辑器底部的“输出”面板中看到来自 Rust 的打印信息[Rust] Bevy App 初始化成功。至此一个最小的godot-bevy项目就成功跑通了。你已经搭建起了 Godot 与 Rust/Bevy 通信的基础设施。4. 核心功能插件详解与实战应用现在让我们为这个“骨架”项目添加上血肉即各种功能插件。我将通过一个具体的例子创建一个可以用键盘左右键控制的精灵来演示几个核心插件的用法。4.1 变换同步让 Rust 逻辑驱动 Godot 节点这是最核心的插件之一。它负责将 Bevy 世界中Transform组件的数据同步到 Godot 场景中对应的节点上。更新 Rust 代码 修改src/lib.rs引入GodotTransformSyncPlugin并创建一个移动系统。use bevy::prelude::*; use godot::prelude::*; use godot_bevy::prelude::*; // 引入变换同步插件 use godot_bevy::plugins::core::transforms::GodotTransformSyncPlugin; #[bevy_app] fn build_app(app: mut App) { godot_print!([Rust] 游戏逻辑启动); // 添加变换同步插件 app.add_plugins(GodotTransformSyncPlugin::default()); // 添加我们的移动系统到每帧更新Update阶段 app.add_systems(Update, player_movement_system); } // 定义一个移动系统 // 这个系统查询所有拥有 Transform 和 Player 标记的实体 // 我们使用 WithPlayer 来筛选避免移动所有带 Transform 的节点 fn player_movement_system( mut query: Querymut Transform, WithPlayer, ) { // 目前我们只是让节点匀速向右移动 // 在下一节我们会结合输入插件让它受键盘控制 for mut transform in query.iter_mut() { transform.translation.x 2.0; } } // 定义一个简单的组件标记来标识我们的玩家实体 #[derive(Component, Default)] struct Player; struct MyExtension; #[gdextension] unsafe impl ExtensionLibrary for MyExtension {}在 Godot 中关联节点与实体 仅仅有 Rust 系统还不够我们需要告诉godot-bevyGodot 场景中的哪个节点对应 Bevy 世界中的哪个实体以及它拥有Player组件。在 Godot 编辑器中选中我们之前创建的Sprite2D节点。在右侧的“检查器”面板中点击“添加元数据”。我们需要添加一个特殊的元数据Metadata来标记这个节点。godot-bevy提供了一个方便的方法但为了理解原理我们先手动操作添加一个名为_godot_bevy_components的元数据类型选择“数组”。在这个数组中添加一个字符串元素内容为Player。这相当于告诉系统“当这个节点被同步到 Bevy 世界时请为对应的实体添加Player组件”。同时确保该节点拥有Transform2D对于Node2D属性因为GodotTransformSyncPlugin需要同步它。运行测试 重新运行游戏cargo build后再次在 Godot 中按F5。你应该会看到精灵节点开始自动向右移动。这说明 Bevy 系统中的transform.translation.x 2.0逻辑生效了并且GodotTransformSyncPlugin成功地将这个变化同步回了 Godot 的Sprite2D节点。实操心得手动添加元数据很麻烦且容易出错。在实际项目中强烈建议通过 Godot 编辑器的“附加脚本”功能编写一个简单的 GDScript 工具脚本或者利用godot-bevy未来可能提供的编辑器插件来自动化这个过程。目前你可以创建一个 GDScript在_ready()函数中为节点添加这个元数据这样更易于管理。4.2 输入处理将 Godot 的输入事件接入 Bevy现在让我们用键盘控制精灵而不是让它自动移动。这需要用到BevyInputBridgePlugin。更新依赖和代码 首先需要在Cargo.toml中明确添加bevy的default-features false我们已经做了但确保bevy版本正确。然后修改src/lib.rsuse bevy::prelude::*; use godot::prelude::*; use godot_bevy::prelude::*; use godot_bevy::plugins::core::transforms::GodotTransformSyncPlugin; // 引入输入处理插件 use godot_bevy::plugins::input::BevyInputBridgePlugin; #[bevy_app] fn build_app(app: mut App) { godot_print!([Rust] 游戏逻辑启动); // 添加插件 app.add_plugins(GodotTransformSyncPlugin::default()) .add_plugins(BevyInputBridgePlugin); // 新增输入插件 // 添加系统。注意顺序输入处理应在移动逻辑之前。 app.add_systems(Update, ( keyboard_input_system, player_movement_system.after(keyboard_input_system), // 确保先处理输入 )); } // 定义一些资源来存储输入状态 #[derive(Resource, Default)] struct PlayerInput { pub move_left: bool, pub move_right: bool, } // 系统从 Bevy 输入资源中读取按键状态并更新我们的自定义资源 fn keyboard_input_system( keyboard_input: ResButtonInputKeyCode, // Bevy 的标准键盘输入 mut player_input: ResMutPlayerInput, ) { player_input.move_left keyboard_input.pressed(KeyCode::KeyA) || keyboard_input.pressed(KeyCode::ArrowLeft); player_input.move_right keyboard_input.pressed(KeyCode::KeyD) || keyboard_input.pressed(KeyCode::ArrowRight); // 可选打印调试信息 if player_input.move_left || player_input.move_right { godot_print!([Rust] 输入状态: 左{}, 右{}, player_input.move_left, player_input.move_right); } } // 修改移动系统使其依赖于 PlayerInput 资源 fn player_movement_system( mut query: Querymut Transform, WithPlayer, player_input: ResPlayerInput, ) { let speed 5.0; let mut direction 0.0; if player_input.move_left { direction - 1.0; } if player_input.move_right { direction 1.0; } for mut transform in query.iter_mut() { transform.translation.x direction * speed; } } #[derive(Component, Default)] struct Player; struct MyExtension; #[gdextension] unsafe impl ExtensionLibrary for MyExtension {}配置 Godot 输入映射BevyInputBridgePlugin会将 Godot 的输入事件映射到 Bevy 的KeyCode等枚举上。但为了更好的跨平台兼容性我们通常在 Godot 中定义“输入映射”。在 Godot 编辑器中进入“项目” - “项目设置” - “输入映射”。添加两个动作“move_left” 和 “move_right”。为“move_left”添加键盘事件比如“A键”和“左方向键”。为“move_right”添加键盘事件比如“D键”和“右方向键”。这样无论玩家按哪个映射键Godot 都会触发对应的动作。BevyInputBridgePlugin能够捕获这些动作事件并转发给 Bevy。运行测试 重新构建并运行。现在按下 A/左方向键 或 D/右方向键你应该能看到精灵按照你的按键方向移动并且在控制台看到对应的输入日志。4.3 音频与更多插件GodotAudioPlugin的使用模式类似。它允许你在 Bevy 系统中触发 Godot 中定义的音频资源播放。例如你可以在玩家跳跃的系统中插入一个命令来播放“跳跃音效”。其核心思想是在 Bevy 端定义“播放音频”的事件Event然后由插件在 Godot 端监听这些事件并执行实际的音频播放。这保持了逻辑与表现的分离——Bevy 只知道“需要播放跳跃音效”而具体播放哪个AudioStream、音量多大、在哪个AudioPlayer节点上播放则由 Godot 端配置。其他插件如物理同步如果未来提供、自定义资源加载等都遵循类似的“Bevy 逻辑驱动Godot 表现执行”的模式。关键在于阅读godot-bevy的官方文档和示例了解每个插件提供的组件、资源和事件类型。5. 开发工作流、调试与性能优化将两个复杂的系统结合在一起开发工作流和调试策略需要一些调整。5.1 高效开发循环热重载有限支持纯粹的 Rust 代码修改目前不能在 Godot 运行时热重载。每次修改src/lib.rs后都需要执行cargo build重新编译。然而Godot 4 对 GDExtension 的支持有所改进在某些情况下如修改了函数实现但未改变签名可能不需要重启整个编辑器只需要重新运行游戏场景即可。最稳妥的方式是修改 Rust 代码 -cargo build- 在 Godot 编辑器中点击“停止”然后“运行”。Godot 部分的热重载Godot 场景、GDScript、着色器、资源等修改通常支持热重载。这意味你可以快速迭代画面、UI 和动画而无需频繁重启 Rust 逻辑。分离关注点利用这种架构的优势。将频繁变动的表现层内容粒子效果、UI 布局、动画状态机放在 Godot 端用 GDScript 或 VisualScript 处理。将稳定但性能关键的核心逻辑伤害计算、寻路算法、状态判断放在 Rust 端。这样可以最大化热重载的效益。5.2 调试技巧日志输出godot_print!宏是你的好朋友。它将信息输出到 Godot 编辑器的“输出”面板是调试 Rust 逻辑最基本、最有效的手段。可以输出变量值、系统执行顺序等。Rust 原生调试对于复杂的逻辑错误你需要使用 Rust 的调试器。VSCode安装CodeLLDB或rust-analyzer扩展。配置launch.json将调试目标指向编译出的动态库.so/.dll/.dylib。然后先启动 Godot 编辑器并从外部附加调试器或者配置 Godot 以等待调试器连接的方式启动。这个过程较为复杂需要查阅godot-rust和调试器相关文档。命令行可以使用rust-gdb或rust-lldb附加到 Godot 进程进行调试。性能分析Godot 性能分析器Godot 内置的性能分析器调试器 - 分析器仍然有效可以查看渲染、物理、脚本GDScript的开销。但其中“脚本”部分可能不包含 Rust 逻辑的耗时。Rust 性能分析对于 Rust 端的性能分析需要使用 Rust 生态的工具如perf(Linux)、Instruments(macOS)、VTune(Windows/Linux) 或flamegraph。你可以单独对 Rust 测试用例进行性能分析或者在集成环境下通过采样整个 Godot 进程来分析 Rust 代码的 CPU 开销。5.3 常见构建问题与排查链接错误undefined reference to ...这通常是因为 Bevy 的默认特性如render,wgpu与 Godot 的图形 API 冲突。反复检查Cargo.toml中bevy的依赖是否设置了default-features false。这是新手最容易踩的坑。Godot 报错Failed to load GDExtension ...路径问题确认extension/gdextension.toml中的库路径是否正确指向了target/debug或target/release下的文件。版本不匹配确保godot-bevy、bevy、godot-rust和 Godot 引擎的版本符合兼容性矩阵。使用不兼容的版本组合是导致加载失败的主要原因。依赖缺失在 Linux 上确保安装了必要的开发库如libx11-dev,libasound2-dev等。godot-cli或devenv环境通常能解决这个问题。运行时崩溃或无响应内存安全Rust 保证了内存安全但通过godot-rust的 FFI外部函数接口与 Godot 的 C 交互时如果违反了 Godot 的 API 使用规则如在错误的线程访问节点、未正确引用计数仍可能导致崩溃。仔细阅读godot-rust的文档理解其所有权和生命周期模型。系统顺序Bevy 系统的执行顺序很重要。确保产生数据的系统如keyboard_input_system在消费数据的系统如player_movement_system之前运行。可以使用.before()或.after()来明确指定顺序。变换不同步检查是否添加了GodotTransformSyncPlugin。检查 Godot 节点是否具有可同步的变换属性Node2D/Node3D。检查 Bevy 实体是否拥有Transform组件并且该组件被你的系统正确修改。使用godot_print!在移动系统中打印transform.translation的值确认 Bevy 端的逻辑是否正确执行。6. 进阶模式与架构思考当项目规模增长时你需要更清晰的架构来管理复杂度。6.1 状态管理对于游戏状态如主菜单、游戏中、暂停、游戏结束Bevy 提供了强大的States。你可以定义一个枚举来表示游戏的所有状态#[derive(States, Debug, Clone, Copy, Eq, PartialEq, Hash, Default)] enum AppState { #[default] Loading, MainMenu, InGame, Paused, GameOver, }然后在构建 App 时添加它app.init_state::AppState();。之后你可以为系统添加RunCondition让系统只在特定状态下运行例如app.add_systems(Update, game_logic_system.run_if(in_state(AppState::InGame)));。这能有效避免在菜单界面执行游戏物理模拟等错误。6.2 事件驱动通信除了通过组件和资源共享数据Bevy 的Event是进行松散耦合通信的利器。例如你可以定义一个CollisionEvent#[derive(Event)] struct CollisionEvent { pub entity_a: Entity, pub entity_b: Entity, pub force: f32, }物理检测系统在发现碰撞时发送这个事件collision_events.send(CollisionEvent { ... });。而伤害计算系统、音效播放系统、粒子效果系统都可以独立地监听EventReaderCollisionEvent这个事件并做出反应彼此之间无需直接引用。这种模式使得系统更容易复用和测试。6.3 与 Godot 场景的深度交互有时你需要在 Rust 逻辑中更直接地操作 Godot 场景树比如动态创建节点、查询复杂的节点关系。godot-bevy通过GodotSceneTree资源提供了这个能力。你可以通过ResGodotSceneTree来获取 Godot 场景树的访问接口然后使用godot-rust的 API 进行高级操作。但要注意频繁地跨 FFI 边界调用会带来性能开销应尽量将逻辑批量在 Bevy 端处理完毕再通过插件同步到 Godot。6.4 打包与分发最终你需要将游戏分发给玩家。这个过程包含两部分编译 Rust 部分为发布模式cargo build --release。确保所有依赖特性都已正确设置以生成最小、最快的二进制文件。使用 Godot 导出项目在 Godot 编辑器中像导出普通 Godot 项目一样操作“项目” - “导出...”。关键步骤是在导出预设中确保包含了你 Rust 库生成的动态链接库文件.so,.dll,.dylib。这些库文件需要放在与 Godot 可执行文件或打包后的游戏包同级目录或者在一个能被 Godot 运行时找到的路径下如res://子目录。你需要在导出后手动将它们复制到正确位置或者编写导出后脚本自动化这个过程。对于不同平台Windows, Linux, macOS你需要分别用对应目标x86_64-pc-windows-msvc,x86_64-unknown-linux-gnu,aarch64-apple-darwin编译 Rust 库并将正确的版本与对应的 Godot 导出包一起分发。这条路虽然初期搭建有一定复杂度但它为高性能、高可维护性的游戏开发打开了一扇新的大门。它特别适合那些逻辑复杂度高、实体数量多、对性能有极致要求的项目例如模拟经营、策略游戏、大型 RPG 的战斗系统或是任何你觉得 GDScript/C# 开始成为瓶颈的地方。