GFramework/GFramework.Game/coroutine/CoroutineScopeExtensions.cs
GeWuYou ef2e718efe feat(coroutine): 完善协程系统接口设计与实现
- 实现ICoroutineContext和ICoroutineHandle接口,提供协程上下文和句柄的标准定义
- 重构CoroutineContext实现ICoroutineContext接口,统一协程上下文访问方式
- 修改CoroutineHandle实现ICoroutineHandle接口,标准化协程控制方法
- 扩展ICoroutineScheduler和ICoroutineScope接口,增加ActiveCount属性和Launch方法
- 优化CoroutineScheduler线程安全性,添加线程ID检查防止跨线程调用
- 为WaitForSeconds、WaitUntil、WaitWhile添加Reset方法支持状态重置
- 重构CoroutineScopeExtensions移除类型转换,使用接口方法替代具体类型
- 改进GlobalCoroutineScope添加TryGetScope方法,使用TryGet模式替代异常控制
- 优化CoroutineHandle取消逻辑,确保取消时正确触发OnComplete事件
- 统一各协程组件的XML文档注释,完善参数和返回值说明
- [skip ci]
2026-01-21 00:06:01 +08:00

62 lines
2.3 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 System.Collections;
using GFramework.Game.Abstractions.coroutine;
namespace GFramework.Game.coroutine;
/// <summary>
/// 为ICoroutineScope提供扩展方法支持延迟执行和重复执行协程功能
/// </summary>
public static class CoroutineScopeExtensions
{
/// <summary>
/// 在指定延迟时间后启动一个协程来执行给定的动作
/// </summary>
/// <param name="scope">协程作用域</param>
/// <param name="delay">延迟时间(秒)</param>
/// <param name="action">要执行的动作</param>
/// <returns>协程句柄,可用于控制或停止协程</returns>
public static ICoroutineHandle LaunchDelayed(this ICoroutineScope scope, float delay, Action action)
{
return scope.Launch(DelayedRoutine(delay, action));
}
/// <summary>
/// 创建一个延迟执行的协程例程
/// </summary>
/// <param name="delay">延迟时间(秒)</param>
/// <param name="action">要执行的动作,可为空</param>
/// <returns>协程迭代器</returns>
private static IEnumerator DelayedRoutine(float delay, Action? action)
{
yield return new WaitForSeconds(delay);
action?.Invoke();
}
/// <summary>
/// 启动一个重复执行的协程,按照指定间隔时间循环执行给定动作
/// </summary>
/// <param name="scope">协程作用域</param>
/// <param name="interval">执行间隔时间(秒)</param>
/// <param name="action">要重复执行的动作</param>
/// <returns>协程句柄,可用于控制或停止协程</returns>
public static ICoroutineHandle LaunchRepeating(this ICoroutineScope scope, float interval, Action action)
{
return scope.Launch(RepeatingRoutine(interval, action));
}
/// <summary>
/// 创建一个重复执行的协程例程
/// </summary>
/// <param name="interval">执行间隔时间(秒)</param>
/// <param name="action">要重复执行的动作</param>
/// <returns>协程迭代器</returns>
private static IEnumerator RepeatingRoutine(float interval, Action action)
{
// 持续循环执行动作并等待指定间隔
while (true)
{
action?.Invoke();
yield return new WaitForSeconds(interval);
}
}
}