fix(coroutine): 修复Timing单例初始化逻辑

- 添加了GFramework.Godot.extensions命名空间引用
- 修正了Timing实例获取逻辑,避免重复创建已存在的实例
- 将AddChild操作包装在WaitUntilReady回调中确保正确添加到场景树
- 添加了WaitUntilReady的Action回调重载方法
- 实现了节点准备就绪后执行回调的功能
- 保持了原有异步等待ready信号的核心功能
- [release ci]
This commit is contained in:
GeWuYou 2026-02-01 14:34:56 +08:00
parent af583c101c
commit 4943fc5c70
2 changed files with 38 additions and 7 deletions

View File

@ -2,6 +2,7 @@
using GFramework.Core.Abstractions.coroutine; using GFramework.Core.Abstractions.coroutine;
using GFramework.Core.coroutine; using GFramework.Core.coroutine;
using GFramework.Core.coroutine.instructions; using GFramework.Core.coroutine.instructions;
using GFramework.Godot.extensions;
using Godot; using Godot;
namespace GFramework.Godot.coroutine; namespace GFramework.Godot.coroutine;
@ -62,16 +63,17 @@ public partial class Timing : Node
var tree = (SceneTree)Engine.GetMainLoop(); var tree = (SceneTree)Engine.GetMainLoop();
_instance = tree.Root.GetNodeOrNull<Timing>(nameof(Timing)); _instance = tree.Root.GetNodeOrNull<Timing>(nameof(Timing));
if (_instance != null)
if (_instance == null)
{ {
_instance = new Timing return _instance;
{
Name = nameof(Timing)
};
tree.Root.AddChild(_instance);
} }
_instance = new Timing
{
Name = nameof(Timing)
};
tree.Root.WaitUntilReady(() => { tree.Root.AddChild(_instance); });
return _instance; return _instance;
} }
} }

View File

@ -49,11 +49,40 @@ public static class NodeExtensions
/// 如果节点尚未进入场景树,则等待 ready 信号。 /// 如果节点尚未进入场景树,则等待 ready 信号。
/// 如果已经在场景树中,则立刻返回。 /// 如果已经在场景树中,则立刻返回。
/// </summary> /// </summary>
/// <param name="node">要等待其准备就绪的节点</param>
/// <returns>表示异步操作的任务</returns>
public static async Task WaitUntilReady(this Node node) public static async Task WaitUntilReady(this Node node)
{ {
if (!node.IsInsideTree()) await node.ToSignal(node, Node.SignalName.Ready); if (!node.IsInsideTree()) await node.ToSignal(node, Node.SignalName.Ready);
} }
/// <summary>
/// 如果节点尚未进入场景树,则等待 ready 信号后执行回调函数。
/// 如果已经在场景树中,则立即执行回调函数。
/// </summary>
/// <param name="node">要等待其准备就绪的节点</param>
/// <param name="callback">节点准备就绪后要执行的回调函数</param>
public static void WaitUntilReady(this Node node, Action callback)
{
// 检查节点是否已经在场景树中
if (node.IsInsideTree())
{
callback();
return;
}
_ = WaitAsync();
return;
// 异步等待节点准备就绪并执行回调
async Task WaitAsync()
{
await node.ToSignal(node, Node.SignalName.Ready);
callback();
}
}
/// <summary> /// <summary>
/// 检查节点是否有效: /// 检查节点是否有效:
/// 1. 非 null /// 1. 非 null