From 4943fc5c705e575098b1ddbff0dc5c8820384e71 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Sun, 1 Feb 2026 14:34:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(coroutine):=20=E4=BF=AE=E5=A4=8DTiming?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=E5=88=9D=E5=A7=8B=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了GFramework.Godot.extensions命名空间引用 - 修正了Timing实例获取逻辑,避免重复创建已存在的实例 - 将AddChild操作包装在WaitUntilReady回调中确保正确添加到场景树 - 添加了WaitUntilReady的Action回调重载方法 - 实现了节点准备就绪后执行回调的功能 - 保持了原有异步等待ready信号的核心功能 - [release ci] --- GFramework.Godot/coroutine/Timing.cs | 16 +++++----- GFramework.Godot/extensions/NodeExtensions.cs | 29 +++++++++++++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/GFramework.Godot/coroutine/Timing.cs b/GFramework.Godot/coroutine/Timing.cs index 3b850c2..7e22f49 100644 --- a/GFramework.Godot/coroutine/Timing.cs +++ b/GFramework.Godot/coroutine/Timing.cs @@ -2,6 +2,7 @@ using GFramework.Core.Abstractions.coroutine; using GFramework.Core.coroutine; using GFramework.Core.coroutine.instructions; +using GFramework.Godot.extensions; using Godot; namespace GFramework.Godot.coroutine; @@ -62,16 +63,17 @@ public partial class Timing : Node var tree = (SceneTree)Engine.GetMainLoop(); _instance = tree.Root.GetNodeOrNull(nameof(Timing)); - - if (_instance == null) + if (_instance != null) { - _instance = new Timing - { - Name = nameof(Timing) - }; - tree.Root.AddChild(_instance); + return _instance; } + _instance = new Timing + { + Name = nameof(Timing) + }; + tree.Root.WaitUntilReady(() => { tree.Root.AddChild(_instance); }); + return _instance; } } diff --git a/GFramework.Godot/extensions/NodeExtensions.cs b/GFramework.Godot/extensions/NodeExtensions.cs index b45a82f..ac93cd8 100644 --- a/GFramework.Godot/extensions/NodeExtensions.cs +++ b/GFramework.Godot/extensions/NodeExtensions.cs @@ -49,11 +49,40 @@ public static class NodeExtensions /// 如果节点尚未进入场景树,则等待 ready 信号。 /// 如果已经在场景树中,则立刻返回。 /// + /// 要等待其准备就绪的节点 + /// 表示异步操作的任务 public static async Task WaitUntilReady(this Node node) { if (!node.IsInsideTree()) await node.ToSignal(node, Node.SignalName.Ready); } + /// + /// 如果节点尚未进入场景树,则等待 ready 信号后执行回调函数。 + /// 如果已经在场景树中,则立即执行回调函数。 + /// + /// 要等待其准备就绪的节点 + /// 节点准备就绪后要执行的回调函数 + 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(); + } + } + + /// /// 检查节点是否有效: /// 1. 非 null