Вчера мне понадобилось выполнить действие с задержкой в классе, не являющимся MonoBehaviour, то есть я не мог использовать для этой цели корутину.
Опытные товарищи посоветовали использовать UniTask. Мне понравилось.
Делюсь получившимся кодом. Дополнительное требование было в том, что при повторном вызове метода предыдущий таймер должен был останавливаться, и запускаться новый.
public class FrenzyState
{
private CancellationTokenSource cancelStopToken;
public void Start()
{
// some useful code
cancelStopToken?.Cancel();
cancelStopToken = new CancellationTokenSource();
Stop(cancelStopToken.Token).Forget();
}
private async UniTaskVoid Stop(CancellationToken cancellationToken)
{
await UniTask.Delay(TimeSpan.FromSeconds(10), cancellationToken: cancellationToken);
// some useful code
}
}