using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; namespace Code.GameplayServices { public class BonusService : MonoBehaviour { public static BonusService Instance { get; private set; } private void Awake() { Instance = this; } public bool CoinBoost { get; private set; } public bool Invincibility { get; private set; } private CancellationTokenSource _coinBoostCancellationTokenSource; public async UniTaskVoid GiveCoinBoost() { if (_coinBoostCancellationTokenSource != null && _coinBoostCancellationTokenSource.Token.CanBeCanceled) _coinBoostCancellationTokenSource.Cancel(); _coinBoostCancellationTokenSource = new(); try { CoinBoost = true; await UniTask.WaitForSeconds(5f) .AttachExternalCancellation(_coinBoostCancellationTokenSource.Token); CoinBoost = false; } catch { _coinBoostCancellationTokenSource.Dispose(); } } private CancellationTokenSource _invincibilityCancellationTokenSource; public async UniTaskVoid GiveInvincibility() { if (_invincibilityCancellationTokenSource != null && _invincibilityCancellationTokenSource.Token.CanBeCanceled) _invincibilityCancellationTokenSource.Cancel(); _invincibilityCancellationTokenSource = new(); try { Invincibility = true; await UniTask.WaitForSeconds(5f) .AttachExternalCancellation(_invincibilityCancellationTokenSource.Token); Invincibility = false; } catch { _invincibilityCancellationTokenSource.Dispose(); } } } }