GGJ2019のメインループの実装の話

前回のお話

enpel.hatenablog.com

メインループ

今回は特別複雑な遷移が無かったので最終的に次のようになりました。

    async UniTask GameLoop()
    {

        mapController.ShowNextEvent();
        while (IsAlive)
        {
            playerStatusView.HideEffect();
            mapController.SetDayCount(date.day);
            await timeView.Show(date.time).First();

// マップから選ばれるまで待つ
            var placeSelectionData = await mapController.SelectEventAsObservable().First();

            playerStatusView.ShowEffect(placeSelectionData.Item1.effect);
            var isAccept = await mapController.ShowSelectionView();

            await mapController.CloseSelectionView();
            
            if (!isAccept)
            {
                continue;
            }

            var eventData = placeSelectionData.Item1;
            ApplyEffect(eventData.effect);
            
            playerStatusView.SetStatus(money.Ratio, health.Ratio, enthusiasm.Ratio, 0.3f);
            await mapController.EventView.Show(placeSelectionData.Item1, placeSelectionData.Item2);

            await mapController.EventView.Close();



// 1日が終わったら毎日の出来事を実行
            var isDayIncrement = date.Increment();
            if (isDayIncrement)
            {
                var daily = dailyEventData.GetAtRandom();
                ApplySafeEffect(daily.effect);
                playerStatusView.SetStatus(money.Ratio, health.Ratio, enthusiasm.Ratio, 0.3f);
                
                dailyView.Play(daily);
            }
            mapController.ShowNextEvent();
        }

        await mapController.ResultView.Show(date);

        await mapController.ResultView.Close();
        
        sceneLoader.Load("Title");
    }

もう名前とか色々とん???ってなる感じの所もあったりするんですがまあざっくりこんな感じです

await...await... って書くのすごく楽でした。 実際今回のゲームの仕様だったのと1人だったのでガシガシつくれるようにこうしてみました。

途中で書き方かわってたりするのはちょっと良くないというかこっちのほうがいいなーみたいなので書き方変えてみたりしてました。 1人だから・・・ゆるして・・・

実は重大なバグが一個あるんですが進行に影響というよりゲーム難易度に影響があるだけで今回はもうリリースしたりランキングもあるので修正しません。 この企画を次作る時があったら検討します・・・(デバッグする時間と人は無かった…)

http://enpel.hatenablog.com/entry/2019/01/28/014812?_ga=2.84097311.705539512.1548577783-1775612417.1479750787

一度IObservableをHotにしてないのに発火されなくてなんぞーー?!???ってなって1時間くらい潰してました。 その時に役立ったのはこちら

GitHub - OrangeCube/AsyncSample201809

非同期完全理解勉強会のやつですね。感謝感謝

connpass.com

/*コードブロックに言語名を表示*/ pre.code:before { content: attr(data-lang); display: inline-block; background: #ccc; /*カラーコード変更*/ color: #666; padding: 3px; position: absolute; margin-left: -20px; /*表示位置を調整*/ margin-top: -30px; } pre.code { padding-top: 30px !important; border:2px solid #ccc; /*追加:コード表示部分の枠設定*/ background:#f8f8f8; /*追加:コード表示部分の背景色*/ position:relative; /*追加*/ }