ゲームを作っていると、「一定時間待機するが、途中で何かキーを押したらスキップできる」みたいな処理を入れたいときがよくあります。
「一定時間待機する」は
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 さんに教えていただきました。どうもありがとうございました😌