GFramework/GFramework.Godot/coroutine/CoroutineExtensions.cs
GeWuYou 5a056fca84 feat(coroutine): 添加协程组合扩展功能并优化节点存活检查
- 为SendCommandCoroutineWithErrorHandler方法的onError参数添加默认值null
- 新增CoroutineComposeExtensions扩展类,提供Then方法实现协程顺序组合
- 优化CancelWith扩展方法,改进节点存活检查逻辑
- 使用LINQ All方法简化节点存活状态检查代码
- 添加完整的XML文档注释支持
2026-02-01 12:25:11 +08:00

69 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using GFramework.Core.Abstractions.coroutine;
using GFramework.Core.coroutine;
using Godot;
namespace GFramework.Godot.coroutine;
public static class CoroutineExtensions
{
/// <summary>
/// 启动协程的扩展方法
/// </summary>
public static CoroutineHandle RunCoroutine(
this IEnumerator<IYieldInstruction> coroutine,
Segment segment = Segment.Process,
string? tag = null)
{
return Timing.RunCoroutine(coroutine, segment, tag);
}
/// <summary>
/// 让协程在指定节点被销毁时自动取消
/// </summary>
public static IEnumerator<IYieldInstruction> CancelWith(
this IEnumerator<IYieldInstruction> coroutine,
Node node)
{
while (Timing.IsNodeAlive(node) && coroutine.MoveNext())
yield return coroutine.Current;
}
/// <summary>
/// 让协程在任一节点被销毁时自动取消
/// </summary>
public static IEnumerator<IYieldInstruction> CancelWith(
this IEnumerator<IYieldInstruction> coroutine,
Node node1,
Node node2)
{
while (Timing.IsNodeAlive(node1) &&
Timing.IsNodeAlive(node2) &&
coroutine.MoveNext())
yield return coroutine.Current;
}
/// <summary>
/// 让协程在多个节点都被销毁时自动取消
/// </summary>
/// <param name="coroutine">要执行的协程枚举器</param>
/// <param name="nodes">用于检查是否存活的节点数组</param>
/// <returns>包装后的协程枚举器</returns>
public static IEnumerator<IYieldInstruction> CancelWith(
this IEnumerator<IYieldInstruction> coroutine,
params Node[] nodes)
{
// 持续执行协程直到任一节点被销毁或协程执行完毕
while (AllNodesAlive(nodes) && coroutine.MoveNext())
yield return coroutine.Current;
}
/// <summary>
/// 检查所有节点是否都处于存活状态
/// </summary>
/// <param name="nodes">要检查的节点数组</param>
/// <returns>如果所有节点都存活则返回true否则返回false</returns>
private static bool AllNodesAlive(Node[] nodes)
{
return nodes.All(Timing.IsNodeAlive);
}
}