public IEnumerator Periodic() => UniTask.ToCoroutine(async() => { var raisedTime = new List <DateTime>(); var count = 0; var complete = new UniTaskCompletionSource(); PlayerLoopTimer timer = null; timer = PlayerLoopTimer.StartNew(TimeSpan.FromSeconds(1), true, DelayType.DeltaTime, PlayerLoopTiming.Update, CancellationToken.None, _ => { raisedTime.Add(DateTime.UtcNow); count++; if (count == 3) { complete.TrySetResult(); timer.Dispose(); } }, null); var start = DateTime.UtcNow; await complete.Task; Between(TimeSpan.FromSeconds(0.9), raisedTime[0] - start, TimeSpan.FromSeconds(1.1)); Between(TimeSpan.FromSeconds(1.9), raisedTime[1] - start, TimeSpan.FromSeconds(2.1)); Between(TimeSpan.FromSeconds(2.9), raisedTime[2] - start, TimeSpan.FromSeconds(3.1)); });
public IEnumerator StandardTicks() => UniTask.ToCoroutine(async() => { foreach (var delay in new[] { DelayType.DeltaTime, DelayType.Realtime, DelayType.UnscaledDeltaTime }) { var raisedTimeout = new UniTaskCompletionSource(); PlayerLoopTimer.StartNew(TimeSpan.FromSeconds(1), false, delay, PlayerLoopTiming.Update, CancellationToken.None, _ => { raisedTimeout.TrySetResult(); }, null); var sw = Stopwatch.StartNew(); await raisedTimeout.Task; sw.Stop(); Between(TimeSpan.FromSeconds(0.9), sw.Elapsed, TimeSpan.FromSeconds(1.1)); } });