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); } } } }