# Godot 集成教程 > 深入学习如何将 GFramework 与 Godot 引擎完美集成,创建高性能的游戏应用。 ## 📋 目录 - [Godot 特定功能](#godot-特定功能) - [节点生命周期管理](#节点生命周期管理) - [信号系统集成](#信号系统集成) - [资源管理优化](#资源管理优化) - [性能优化技巧](#性能优化技巧) - [常见集成模式](#常见集成模式) - [调试与测试](#调试与测试) ## Godot 特定功能 ### 1. 节点生命周期绑定 GFramework.Godot 提供了与 Godot 节点生命周期的无缝集成,确保框架初始化与 Godot 场景树同步。 ```csharp using GFramework.Godot.architecture; public class GodotGameArchitecture : AbstractArchitecture { protected override void Init() { // 注册核心组件 RegisterModel(new PlayerModel()); RegisterSystem(new PlayerControllerSystem()); RegisterUtility(new AudioUtility()); } protected override void InstallModules() { // 安装 Godot 特定模块 InstallGodotModule(new AudioModule()); InstallGodotModule(new InputModule()); } } ``` ### 2. Godot 模块系统 创建与 Godot 节点深度集成的模块: ```csharp [ContextAware] [Log] public partial class AudioModule : AbstractGodotModule { private AudioStreamPlayer _musicPlayer; private AudioStreamPlayer _sfxPlayer; // 模块节点本身 public override Node Node => this; public override void Install(IArchitecture architecture) { // 注册音频系统 architecture.RegisterSystem(new AudioSystem()); architecture.RegisterUtility(new AudioUtility()); } public override void OnAttach(Architecture architecture) { // 模块附加时的初始化 Logger.Info("Audio module attached"); // 创建音频播放器 CreateAudioPlayers(); } public override void OnDetach(Architecture architecture) { // 模块分离时的清理 Logger.Info("Audio module detached"); CleanupAudioPlayers(); } public override void OnPhase(ArchitecturePhase phase, IArchitecture architecture) { switch (phase) { case ArchitecturePhase.Ready: // 架构准备就绪,开始播放背景音乐 PlayBackgroundMusic(); break; } } private void CreateAudioPlayers() { _musicPlayer = new AudioStreamPlayer(); AddChild(_musicPlayer); _sfxPlayer = new AudioStreamPlayer(); AddChild(_sfxPlayer); } private void CleanupAudioPlayers() { _musicPlayer?.QueueFree(); _sfxPlayer?.QueueFree(); } private void PlayBackgroundMusic() { var music = GD.Load("res://assets/audio/background.ogg"); _musicPlayer.Stream = music; _musicPlayer.Play(); } } ``` ### 3. 节点池化系统 实现高效的 Godot 节点池化,避免频繁的创建和销毁: ```csharp using GFramework.Godot.pool; public class BulletPoolSystem : AbstractNodePoolSystem { private Dictionary _scenes = new(); public BulletPoolSystem() { // 预加载场景 _scenes["player"] = GD.Load("res://assets/scenes/PlayerBullet.tscn"); _scenes["enemy"] = GD.Load("res://assets/scenes/EnemyBullet.tscn"); } protected override Bullet CreateItem(string key) { if (_scenes.TryGetValue(key, out var scene)) { return scene.Instantiate(); } throw new ArgumentException($"Unknown bullet type: {key}"); } protected override void OnSpawn(Bullet item, string key) { // 重置子弹状态 item.Reset(); item.Position = Vector2.Zero; item.Visible = true; item.SetCollisionLayerValue(1, true); item.SetCollisionMaskValue(1, true); } protected override void OnDespawn(Bullet item) { // 隐藏子弹 item.Visible = false; item.SetCollisionLayerValue(1, false); item.SetCollisionMaskValue(1, false); // 移除父节点 item.GetParent()?.RemoveChild(item); } protected override bool CanDespawn(Bullet item) { // 只有不在使用中的子弹才能回收 return !item.IsActive && item.GetParent() != null; } } ``` ## 节点生命周期管理 ### 1. 自动生命周期绑定 使用 GFramework 的扩展方法自动管理节点生命周期: ```csharp [ContextAware] [Log] public partial class PlayerController : CharacterBody2D, IController { private PlayerModel _playerModel; public override void _Ready() { // 设置上下文 _playerModel = Context.GetModel(); // 注册事件监听,自动与节点生命周期绑定 this.RegisterEvent(OnPlayerInput) .UnRegisterWhenNodeExitTree(this); // 监听属性变化,自动清理 _playerModel.Health.Register(OnHealthChanged) .UnRegisterWhenNodeExitTree(this); // 连接 Godot 信号,自动清理 this.CreateSignalBuilder(AnimationPlayer.SignalName.AnimationFinished) .Connect(OnAnimationFinished) .UnRegisterWhenNodeExitTree(this); } private void OnPlayerInput(PlayerInputEvent e) { // 处理玩家输入 ProcessInput(e); } private void OnHealthChanged(int newHealth) { // 更新 UI 显示 UpdateHealthDisplay(newHealth); // 播放受伤动画 if (newHealth < _playerModel.PreviousHealth) { AnimationPlayer.Play("hurt"); } } private void OnAnimationFinished(StringName animName) { if (animName == "hurt") { AnimationPlayer.Play("idle"); } } } ``` ### 2. 延迟初始化模式 对于需要在特定时机初始化的组件: ```csharp [ContextAware] [Log] public partial class AdvancedController : Node, IController { private bool _initialized = false; public override void _Ready() { // 不立即初始化,等待特定条件 this.WaitUntil(() => IsInitializationReady()) .Then(InitializeController); } private bool IsInitializationReady() { // 检查所有依赖是否准备就绪 return HasRequiredComponents() && Context.HasModel(); } private void InitializeController() { if (_initialized) return; Logger.Info("Initializing advanced controller"); // 执行初始化逻辑 SetupComponents(); RegisterEventListeners(); StartUpdateLoop(); _initialized = true; } private void SetupComponents() { // 设置组件 } private void RegisterEventListeners() { // 注册事件监听器 this.RegisterEvent(OnGameStateChanged) .UnRegisterWhenNodeExitTree(this); } private void StartUpdateLoop() { // 启动更新循环 SetProcess(true); } } ``` ### 3. 安全的节点操作 使用 GFramework 提供的安全扩展方法: ```csharp public partial class SafeNodeOperations : Node { public void SafeOperations() { // 安全获取子节点 var player = GetNodeX("Player"); var ui = FindChildX("UI"); // 安全添加子节点 var bullet = bulletScene.Instantiate(); AddChildX(bullet); // 安全的异步操作 this.WaitUntilReady() .Then(() => { // 节点准备就绪后的操作 InitializeAfterReady(); }); // 安全的场景树遍历 this.ForEachChild(child => { if (child is Sprite2D sprite) { ProcessSprite(sprite); } }); } private void ProcessSprite(Sprite2D sprite) { // 处理精灵 } private void InitializeAfterReady() { // 初始化逻辑 } } ``` ## 信号系统集成 ### 1. SignalBuilder 流畅 API 使用 GFramework 的 SignalBuilder 进行类型安全的信号连接: ```csharp [ContextAware] [Log] public partial class SignalController : Node, IController { private Button _button; private Timer _timer; private ProgressBar _progressBar; public override void _Ready() { InitializeComponents(); SetupSignalConnections(); } private void InitializeComponents() { _button = GetNode