async Task levelSystem() { int currentLevel = this.level; Debug.Log($"level {currentLevel}"); var cancelation = new CancellationTokenSource(); cancelOnDisable.Add(cancelation); // パワーアップアイテムを定期的に出現させる(終わりを待たない) spawnPowerUpCyclically(1f, 5f, cancelation.Token); // 敵を倒すなどのイベントを待つときはTaskCompletionSourceを待つことで実現できる // var tcs = new TaskCompletionSource<bool>(); // Task<bool> t = tcs.Task; // // await Task.Run(async() => { // await Task.Delay(2000); // tcs.SetResult(true); // }); // var r = await t; // await spawnEnemySerialCyclically(level + 1, level, 2, 2, cancelation.Token); await levelEnemy(cancelation.Token); await AwaitHelper.Delay(5, cancelation.Token); // 終わりを待たないタスクを終了させる cancelation.Cancel(); cancelOnDisable.Remove(cancelation); }
async Task spawnEnemy2Serial(int count, float speed, CancellationToken token) { for (int i = 0; i < count; i++) { var y = UnityEngine.Random.Range(0, 1.0f); Vector3 spawnPoint = mainCamera.ViewportToWorldPoint(new Vector2(1, y)); spawnPoint.z = 0; var enemy_ = Instantiate(enemyPrefab, spawnPoint, Quaternion.identity); var enemy = enemy_.GetComponent <Enemy>(); Vector3 delta = new Vector3(-3, 0); if (player.transform.position.y > spawnPoint.y) { delta = Quaternion.Euler(0, 0, -25) * delta; } else { delta = Quaternion.Euler(0, 0, 25) * delta; } enemy.Delta = delta * speed; float delayTime = 0.7f / speed; await AwaitHelper.Delay(delayTime, token); } }
async Task spawnEnemy1Serial(int count, float speed, CancellationToken token) { var verticalCenter = mainCamera.ViewportToWorldPoint(new Vector2(1, 0.5f)).y; Vector3 spawnPoint; if (player.transform.position.y < verticalCenter) { spawnPoint = mainCamera.ViewportToWorldPoint(new Vector2(1, 0.8f)); } else { spawnPoint = mainCamera.ViewportToWorldPoint(new Vector2(1, 0.2f)); } spawnPoint.z = 0; for (int i = 0; i < count; i++) { var enemy_ = Instantiate(enemyPrefab, spawnPoint, Quaternion.identity); var enemy = enemy_.GetComponent <Enemy>(); enemy.Delta *= speed; float delayTime = 0.7f / speed; await AwaitHelper.Delay(delayTime, token); } }
// Update is called once per frame async void Update() { axis.Update(); if (axis.ChangePositive) { if (buttonOnce) { return; } buttonOnce = true; GameObject o = GameObject.Find("PushAnyButton"); if (o != null) { var flasher = o.GetComponent <FlashTextMeshProUGUI>(); if (flasher != null) { flasher.interval = 0.2f; // メインスレッドで2秒後に処理を行う await AwaitHelper.Delay(2f); Debug.Log("load scene"); SceneManager.LoadScene("GameScene"); } } } if (Input.GetKeyDown(KeyCode.Tab)) { SceneManager.LoadScene("KeyCheckScene"); } }
// パワーアップアイテムを定期的に出現させる非同期メソッド async Task spawnPowerUpCyclically(float startDelay, float intervalSec, CancellationToken token) { Debug.Log("spawnPowerUpCyclically"); await AwaitHelper.Delay(startDelay, token); while (true) { Debug.Log("spawnPowerUpCyclically spawn"); spawnPowerUp(); await AwaitHelper.Delay(intervalSec, token); } }
async void Start() { fireAxis = new AxisChange("Fire1"); cancellationTokenSource = new CancellationTokenSource(); var context = SynchronizationContext.Current; var token = cancellationTokenSource.Token; try { await AwaitHelper.Delay(21f, token); SceneManager.LoadScene("TitleScene"); } catch (TaskCanceledException) { } }
async Task level2Enemy(CancellationToken token) { int count = 2 + level; int roundCount = 2 + level; float startDelay = 3; float interval = 3; float speed = (float)level * 0.5f + 1.0f; await AwaitHelper.Delay(startDelay, token); for (int i = 0; i < roundCount; i++) { await spawnEnemy2Serial(count, speed, token); await AwaitHelper.Delay(interval, token); } }
public async void OnDamage() { particle.Emit(100); particleObject.transform.localPosition = transform.localPosition; // Playerを参照している箇所があるので、Destroyしてはいけない this.gameObject.SetActive(false); fishOptions.ForEach(opt => { opt.enabled = false; }); var context = SynchronizationContext.Current; await AwaitHelper.Delay(2f); SceneManager.LoadScene("GameOverScene"); }