using System;
using System.Runtime.CompilerServices;
using System.Threading;
namespace io.github.hatayama.uLoopMCP
{
///
/// Frame-based asynchronous waiting (main thread non-blocking)
/// UniTask.Delay()-style implementation for Unity Editor
///
public static class EditorDelay
{
///
/// Wait for the specified number of frames
///
/// Number of frames to wait (default: 1)
/// Cancellation token
/// Awaitable structure
public static DelayFrameAwaitable DelayFrame(int frameCount = 1, CancellationToken cancellationToken = default)
{
return new DelayFrameAwaitable(frameCount, cancellationToken);
}
}
///
/// Awaitable structure for frame waiting
/// Can be used with async/await
///
public struct DelayFrameAwaitable
{
private readonly int _frameCount;
private readonly CancellationToken _cancellationToken;
public DelayFrameAwaitable(int frameCount, CancellationToken cancellationToken)
{
this._frameCount = frameCount;
this._cancellationToken = cancellationToken;
}
public Awaiter GetAwaiter() => new(_frameCount, _cancellationToken);
///
/// Awaiter structure for async/await
///
public struct Awaiter : INotifyCompletion
{
private readonly int _frameCount;
private readonly CancellationToken _cancellationToken;
public Awaiter(int frameCount, CancellationToken cancellationToken)
{
this._frameCount = frameCount;
this._cancellationToken = cancellationToken;
}
///
/// Whether waiting is completed
///
public bool IsCompleted
{
get
{
_cancellationToken.ThrowIfCancellationRequested();
return _frameCount <= 0; // Complete immediately if 0 frames or less
}
}
///
/// Get result when waiting is completed
///
public void GetResult()
{
_cancellationToken.ThrowIfCancellationRequested();
}
///
/// Register continuation processing
/// Code after await is passed as continuation
///
public void OnCompleted(Action continuation)
{
_cancellationToken.ThrowIfCancellationRequested();
if (IsCompleted)
{
continuation();
return;
}
// Register continuation processing to EditorDelayManager
EditorDelayManager.RegisterDelay(continuation, _frameCount, _cancellationToken);
}
}
}
}