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

雑なやつ AppAnnieからモバイル市場年鑑2019が公開されました。

同僚に教えてもらったんですけどPUMLのダイアグラムの出力ってShift+Ctrl+Pでできるんですね。 とこのショートカットを教えてもらった後に右クリックのメニューにも居ることが発覚しました。

そんな感じで久しぶりの雑なやつです(社会復帰1回目)

モバイル市場年鑑2019

AppAnnieからモバイル市場のレポートが公開されました。 モバイル市場で戦ってる人もそうじゃない人も読み応えのあるレポートだとおもうのでこの機会に是非みてみてはいかがでしょうか 特に各国の情報とか日本市場を中心にしている人にとっては面白いのではないでしょうか なんていうか日本だととっくに撤退したアプリなのに海外だと主要なアプリだったりとか そういうものがざっくりわかる資料だと思います。

モバイル市場年鑑 2019:知っておくべき最重要トレンド - App Annie Content

f:id:enpel715:20190117215711p:plain

資金決済法の話

storialaw.jp

ch.nicovideo.jp

Youtuberはじめました。独学で研究している動画手法についてのメモです。

再開しました。 去年くらいから試験的にやっててたまーに気分転換に動画投稿してたんですけど今年からはちょっと気持ちを入れてやっていこうかなと思っています。

以前から趣味的にやってた投稿をしっかりやっていくために最近いろんな動画を見て研究していますが改めてYoutuberやVtuberの人たちの編集には驚かされます。 というよりコストがすごい。

すぐできるものから手間のかかるものまでたった5分の動画をつくるのにもどれだけかかっているのだろうか?と思うとなんていうか一人で回してるヒカキンは本当すごいなーって思いますし1動画30分くらいの長時間動画を作っている人たちも裏が少し想像できて驚きます。

というわけでなんというか色々見ながら素人の動画だけど見てもらうためには?を研究しているのでその備忘録を書いていきます。

動画の手法

分かる範囲でできる動画を編集する手法をメモしていきます。 書いてる内容は自分がこういう効果あるんじゃない?とか素人なりに考えた事なのでなんかあったら教えてください。 というかなんか他にもこういうのがあるよってあったら教えてください。

オープニング動画

水溜りボンドとかヒカキンとかの動画でよく見る気がする。 VTUBERでやってるところあるかな・・・ 毎回お決まりの音楽とアニメーションでこれから始まりますよと視聴者に意識させる効果がありそう

導入の挨拶

例えばキズナアイの「はいどーもー」とかヒカキンの「ブンブンハローユーチューブ」とかそういうの こういうのあったほうがなんとなくシャキッと動画が始められる気がします。 オープニング動画と似たような効果だと思いますけどこっちは始まりましたよって意識させられそう?

エンドロール

お決まりのエンドロール演出とか たまにエンドロール->おまけ みたいな感じで動画が終わるところもあったりします(すしラーメンりくの動画とかでなんか多い気がする)

字幕

喋ってる内容をそのまま書くだけでも良いと思う。 フォントとかもこだわると字幕の印象も変えられて良いかもしれない? あと英語字幕とかを用意するとなお良いかもしれない。

サムネイル

普段使っててもそうだし実際タイトルを読むより先にまずサムネイルを見る。 なんだったらサムネイルで見るかどうか決めるみたいなところあるきがするのでサムネイルは作りましょう。

多言語対応

めっちゃコスト高いですけど単純に動画を見れる人を増やすという意味でも大事な気がします。 英語対応とか中国対応とか… コアなファンが居るVTUBERとかは翻訳対応を有志がやってくれてその後Youtubeの字幕機能ではなくて海外向けの字幕を編集でちゃんと入れてるところもあったりします(音声は日本語のままですけど)

チャンネル登録・高評価のお願いとか動線

なんか効果あるらしいです。 動画の間に登録お願いしますみたいな絵を挟んだりすることもあるっぽい あとよくあるのは動画の終わりによろしくおねがいしますって言うみたいなのはYoutube見てると見たことあるんじゃないでしょうか。 効果どれくらいあるかわからないけど

プラットフォーム

Youtubeが多いですけどYoutube以外のプラットフォームにも出しましょうというアレ 例えばニコニコ動画も良いと思うし中国向けに出すならbilibiliとかもいいですよね(実際VTUBERは日本ではそこまででもないけど中国だとすげー人気みたいなVTUBERが居たりします。白・銀髪ロリが人気らしいです)

終了画面

これはYoutubeだけ?かもしれないんですけどYoutubeでは動画の最後に終了画面っていうチャンネル登録への動線とか他の動画への動線とかを付けられる機能があります。 動画の終端から5秒~20秒迄設定できます。 これ動画編集の時点でその部分を想定しておかないと変なタイミングになったりするので注意必要だと思います。

なんか知ってる人いたら教えてください

こういう本良かったとかなんかそういうの知ってる人いたら教えてください… 現状は他人の動画を見て研究したりしてる感じなのでまたなんかあったらメモ書き的に書きます。

抱負とかとか

新年あけましておめでとうございます。 もう今日から仕事始めという人も多いんじゃないでしょうか。自分は1月7日からなのでまだゆっくりしてますがそろそろ社会復帰の為にブログの記事を再開しました。

新天地へ

転職先への出社日は7日からになります。 色々あってお財布事情はまだ厳しいんですがやりたいことも増えてるのでがんばりたい・・・

引っ越しを年内に検討しています。

Youtube活動再開しました

基本的にはゲームの配信とか中心だと思うんですけどなんか興味のあることに手を出すきっかけとして始める感じです。

同人活動

C95から個人サークルをはじめました。 2019年はコミケには参加して行こうとおもっています。

抱負

とりあえず年内にYoutubeで1000人登録くらい目指してみたいです。飽きやすいんで続くかわかりませんけど目標をしっかりもっていたほうが良いと思うので。。。 同人ゲーム開発の方も遊べる形で体験版でもいいのでリリースしたいです。デジゲー博あたりで あと体重を90台に戻します…

そんな感じですがよろしくおねがいします。

/*コードブロックに言語名を表示*/ 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; /*追加*/ }