UniTask.Delay にスキップ機能を追加する

ゲームを作っていると、「一定時間待機するが、途中で何かキーを押したらスキップできる」みたいな処理を入れたいときがよくあります。

「一定時間待機する」は

await UniTask.Delay(delay_ms)

で、「途中で何かキーを押したらスキップ」は

await UniTask.WaitUntil(() => Input.anyKeyDown)

で、それぞれ実現できるので、これをWhenAnyで融合すれば良いのですが、いちいち書くのも面倒なので、以下のようなメソッドを作りました。

using System;
using System.Threading;
using UniRx.Async;
using UnityEngine;

public static class UniTaskHelper
{
    public static async UniTask DelaySkippable(int delay_ms, Func<bool> cond)
    {
        var cts = new CancellationTokenSource();

        await UniTask.WhenAny(
            UniTask.Delay(delay_ms, cancellationToken : cts.Token),
            UniTask.WaitUntil(cond, cancellationToken : cts.Token)
        );

        cts.Cancel();
    }
}

以下のようにして使います:

await UniTaskHelper.DelaySkippable(1000, () => Input.anyKeyDown);

Input.anyKeyDown の部分を変えれば、好きな条件でスキップできるようになります。

※ このコードの原型は、naichi さんに教えていただきました。どうもありがとうございました😌

The coloring of this site is Dracula PRO🧛🏻‍♂️
This website uses the FontAwesome icons licensed under CC BY 4.0.

2020 GIGA CREATION