#if GODOT using System.Threading.Tasks; using Godot; namespace GFramework.framework.godot; /// /// 节点扩展方法类,提供对Godot节点的扩展功能 /// public static class NodeExtensions { /// /// 安全地将节点加入删除队列,在下一帧开始时释放节点资源 /// /// 要释放的节点实例 public static void QueueFreeX(this Node node) { // 检查节点是否为空 if (node is null) { return; } // 检查节点实例是否有效 if (!GodotObject.IsInstanceValid(node)) { return; } // 检查节点是否已经加入删除队列 if (node.IsQueuedForDeletion()) { return; } // 延迟调用QueueFree方法,避免在当前帧中直接删除节点 node.CallDeferred(Node.MethodName.QueueFree); } /// /// 立即释放节点资源,不等待下一帧 /// /// 要立即释放的节点实例 public static void FreeX(this Node node) { // 检查节点是否为空 if (node is null) { return; } // 检查节点实例是否有效 if (!GodotObject.IsInstanceValid(node)) { return; } // 检查节点是否已经加入删除队列 if (node.IsQueuedForDeletion()) { return; } // 立即释放节点资源 node.Free(); } /// /// 如果节点尚未进入场景树,则等待 ready 信号。 /// 如果已经在场景树中,则立刻返回。 /// public static async Task WaitUntilReady(this Node node) { if (!node.IsInsideTree()) { await node.ToSignal(node, Node.SignalName.Ready); } } /// /// 检查节点是否有效: /// 1. 非 null /// 2. Godot 实例仍然存在(未被释放) /// 3. 已经加入 SceneTree /// public static bool IsValidNode(this Node node) { return node is not null && GodotObject.IsInstanceValid(node) && node.IsInsideTree(); } /// /// 检查节点是否无效: /// 1. 为 null,或者 /// 2. Godot 实例已被释放,或者 /// 3. 尚未加入 SceneTree /// /// 返回 true 表示该节点不可用。 /// public static bool IsInvalidNode(this Node node) { return node is null || !GodotObject.IsInstanceValid(node) || !node.IsInsideTree(); } } #endif