Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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);
        }
    }
Ejemplo n.º 3
0
    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);
        }
    }
Ejemplo n.º 4
0
    // 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");
        }
    }
Ejemplo n.º 5
0
    // パワーアップアイテムを定期的に出現させる非同期メソッド
    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);
        }
    }
Ejemplo n.º 6
0
    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) {
        }
    }
Ejemplo n.º 7
0
    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);
        }
    }
Ejemplo n.º 8
0
    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");
    }