diff --git a/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs b/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs index fc1defa60..b78cc9eb3 100644 --- a/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs +++ b/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs @@ -2,6 +2,8 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using System.Threading; + using HeavenStudio.Util; using Jukebox; using Jukebox.Legacy; @@ -101,7 +103,7 @@ namespace HeavenStudio.Games public static ClappyTrio instance { get; set; } MultiSound clapSounds = null; - BeatAction clapAction = null; + CancellationTokenSource clapAction = null; private void Awake() { @@ -188,7 +190,10 @@ namespace HeavenStudio.Games clapSounds.Delete(); if (clapAction != null) - clapAction.Delete(); + { + clapAction.Cancel(); + clapAction.Dispose(); + } } public void Clap(double beat, float length, double gameSwitchBeat) diff --git a/Assets/Scripts/Util/BeatAction.cs b/Assets/Scripts/Util/BeatAction.cs index a52ac6582..5a04d26c3 100644 --- a/Assets/Scripts/Util/BeatAction.cs +++ b/Assets/Scripts/Util/BeatAction.cs @@ -1,16 +1,13 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using Cysharp.Threading.Tasks; +using System.Threading; namespace HeavenStudio.Util { public class BeatAction { - private int index; - private List actions = new List(); - private Coroutine coroutine; - private MonoBehaviour behaviour; - public delegate void EventCallback(); public class Action @@ -25,43 +22,44 @@ namespace HeavenStudio.Util } } - public static BeatAction New(MonoBehaviour behaviour, List actions) + public static CancellationTokenSource New(MonoBehaviour behaviour, List actions) { if (behaviour == null) { Debug.LogWarning("Starting a BeatAction with no assigned behaviour. The Conductor will be used instead."); behaviour = Conductor.instance; } - BeatAction beatAction = new BeatAction(); - beatAction.actions = actions; - beatAction.behaviour = behaviour; - beatAction.coroutine = behaviour.StartCoroutine(beatAction.BeatActionRoutine()); + CancellationTokenSource cancelToken = new CancellationTokenSource(); + RunAsync(behaviour, actions, cancelToken.Token).Forget(); - return beatAction; + return cancelToken; } - IEnumerator BeatActionRoutine() + static async UniTask RunAsync(MonoBehaviour behaviour, List actions, CancellationToken token) + { + try + { + await BeatActionAsync(behaviour, actions, token); + } + catch (System.OperationCanceledException) + { + Debug.Log("BeatAction cancelled."); + } + } + + static async UniTask BeatActionAsync(MonoBehaviour behaviour, List actions, CancellationToken token) { int idx = 0; - WaitUntil waitUntil = new WaitUntil(() => Conductor.instance.songPositionInBeatsAsDouble >= actions[idx].beat || !Conductor.instance.isPlaying); while (idx < actions.Count) { - yield return waitUntil; + await UniTask.WaitUntil(() => Conductor.instance.songPositionInBeatsAsDouble >= actions[idx].beat || (!Conductor.instance.isPlaying) || behaviour == null, cancellationToken: token); - if (!Conductor.instance.isPlaying) - yield break; + if (behaviour == null || !Conductor.instance.isPlaying) + break; actions[idx].function.Invoke(); idx++; } - this.actions = null; - yield break; - } - - public void Delete() - { - behaviour.StopCoroutine(coroutine); - this.actions = null; } } } \ No newline at end of file