NNWORKS-48時間のゲーム開発備忘録を頒布しました。

GGJ2019に参加した自分がいろいろやったことを書いてます。

頒布してめっちゃ疲れましたが良かったです。 この本を作るにあたって使ったものたちについてこんどブログあげます。

100部もっていってももしかしたら捌けたかもしれません。 それくらい多くの人が立ち読みしていってくれました。

現金と後払いの比率は7:3くらいで現金のほうが多い感じだったんですが傾向としては13時くらいまでは5:5くらい。ソレ以降は現金の比率が増えていった感じでした。

ダウンロード版に不具合があった場合は教えていただけると嬉しいです。

寝ます。

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

GlobalGameJam2019 中野会場に参加してきてゲームを1本リリースしました。

できたもの

play.google.com

globalgamejam.org

使ったもの

  • Zenject
  • UniRx

GGJ2019が終わりました。

お疲れ様です。 GGJ2019が無事終わりました。

成果物はNoxAppとかであそべるんでぜひあそんでください!

今回のチーム

今回は以下のような構成でした

初日

企画決定ー仕様まで(ロイヤルホストで4時間会議)

18時にチーム結成とお題発表があったので速攻でロイヤルホスト 最初の1時間くらいはもう本当決まらなくて飯食いつつできることとか聞いてた

今回のテーマの事を聞かれたらどういうふうに回答する?とテーマビデオと同じようなことをしてみた。

あなたにとってHomeとはどういうもの?意味?みたいな

寝る場所、言って帰ってくる場所、故郷、遠い場所、思い出の溜まっている場所 等

そこから家から出ていって帰ってくるという表現はどうか?そして最後には遠い故郷に帰ってしまう。 日常を繰り返すゲームみたいなのはどうだろうか? 日常を繰り返していって変化するものってなんだろう…お金…健康…情熱…

家から出て街に行ってなにかをする。みたいな…

そうして仕様や構造等を考えていきました。

表現と実装をみんなで考えた

今回企画職の人が居なかったので僕はとにかくどういう表現が良いか?それを実現するにはどういう仕様が良いのか?という順で掘り下げていきました。

これが良い手法かはわかりませんがとにかく些細なことですら3人でこれってなんだろう?と考えてそのままロイヤルホストで3人は仕様を作っていきました。 これは僕のゲームジャム経験上掘り下げないままで居るとそれぞれのメンバーが同じワードで構築された違うゲームをイメージしており、その結果二日目の作業に集中したいタイミングで大きくズレてしまい軌道修正やその問答で時間を食われるといった事が起きないようにする為です。

プレイヤーができる事ってなんだろう。それをしたらどうなるんだろう。この言葉はどんな定義だろうか。 このまとまりのことをこう呼ぼう。この定義にはこういう要素がある。この要素はこういう意味で使う。

とかそういった事をガンガンしていきました。

この時点で画面の遷移の数や画面に表示するもの、画面でできること等を8割くらい決めました。 そして4時間ロイヤルホストで楽しい仕様決めの時間を使いました。

開発環境の構築とバックアッププランの用意

今回はGithubを使いました。PROなので(Githubの有料会員の事)

自分以外Githubは初めてだったので今回はGithubDesktopを入れてもらいました。 最低限最新のプロジェクトを落としてきて変更を適用できる。という所までは試してもらいました。

また、今回は大きく分けてプログラマ1人とリソース担当が2人という構成だったのでSlack上で予めGithubがうまくいかない場合は素材のやり取りをSlackで行うと決めていました。

これは事前に決める事で各自で臨機応変Github運用が事故っても判断できるようにという理由で行いました。

自宅に帰り1人だし設計をしてから挑もうとした

した・・・がしかし破綻してた!!

二日目

設計はだめだったので愚直に作り直す事に…

もうなんか設計頑張ってGGJ終わったあとでもなんとかなるようにしたいなーって思ったんですけど上手く行かず 逆に小さい範囲の設計はできるけど全体設計が苦手だということに改めて気がついたのでちょっと今後の課題が見えて大変良かったです。

2日目のよるにアートリソースがたくさん上がって来てそこから10時間くらいでゲームサイクルは完成しました。 遊べるようになった!やった!おやすみ!@!!!!!って感じで寝ました。

三日目

12時くらいに起きて作業開始 やった事としてはAndroidのビルド環境構築、演出の追加、わかりやすさの向上、できごとデータを追加等

ブラッシュアップ的な所を中心にしました。

また、日をまたぐと小さいイベントがランダムに発生するという仕様もここで追加しました。 ついでにNaichiさんが公開しているランキングをサクッと実装する仕組みも追加しました。

Naichiさんありがとーーーー!!!!

blog.naichilab.com

発表会

GooglePlayにアップ済みだったのでGooglePlayで検索してそこからアプリを開くっていうデモをしました。 これがやりたくてGooglePlayにアップしてるといっても過言ではありません。

また、発表ではZoomというビデオ会議アプリを使い遠隔で行いました(今思えば中野会場でもよかったかもって思ったけど行かなかったから実装できた事もあったのでまあいっかなという気持ち)

振り返り

2年ぶりのGlobalGameJamですが今回ぼくがやりたかった事がいくつかありました

  • 多言語の対応
  • 発表会時にリリース
  • ゲームの完成

概ね今回はこの自分の中でのミッションが達成できた良いゲームジャムだったと思います(多言語化対応の仕組みは下の下ですがアセットの使い方を調べる時間を捨てた分手間はかかるが手軽に使えました。コードは毎回ひどかったです)

あまり良くなかった点としては後半は自分の作業タスクにかかりきりでチームメンバーの様子をみる余裕がなかったことだと思います。 実装はできたけどメンバーにとってどうだっただろうか?という事はちょっと心残りです。(リリースできたりゲームが動いていたりとかそういう所は良い体験になったと言ってもらえたので救われました)

また、自分は完成させるというミッションをゲームジャムでは常にもってるのでどうしてもチャレンジが足りないなと思ったりします。 今回のGGJは2014年のGGJでの経験が多くベースになっています。 例えばタイトルの選択肢自体が多言語化選択になっていたり…意図的によくわからない選択肢を入れてみたり… 5年経って改めてGGJ2014は自分に大きな影響を与えていたと感じたGGJでした。

※2014年の作品はこちら globalgamejam.org

今後の展開

特に無いです。 1月中はブラッシュアップするかもしれませんがそれ以降は更新するつもりはありません(こういう事がしたいと連絡があれば対応するかも)

ちゃんと作るとしてもそれはそのGGJの作りではなく新しいプロジェクトとして開発することになると思います。

2年ぶりで不安でしたが無事に完成して本当良かったなと思います。

GGJまで24時間を切ったのでGGJでためになる記事集

早く会場に来ちゃったときの読み物にどうぞ

www.slideshare.net

www.slideshare.net

qiita.com

qiita.com

note.mu

docs.google.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; /*追加*/ }