ゲーム開発チーム「丸ダイス」の開発ブログです! 公式サイトはこちら

Unityゲームをモバイルリリースする道のり。何に時間がかかったか

こんにちは!丸ダイスです。

先日、Unityで開発したゲームのモバイル版をリリースしました。

https://twitter.com/dice_maru/status/1253657786283520001

前に出した時に苦労した覚えがあって、PCで遊べる完成したゲームでもモバイル版を出すのはとにかく大変というイメージがあります。

…みんなあるよね?あってほしい。

なので、「結局、何にどれだけ時間がかかったか?」をまとめておこうという記事です。

「このゲームをモバイルで出そうかな?」と思った時、やるかどうか、何を削るかの判断にきっと役に立つはず!

※ 実は、正確に言うとiOS版がリリース出来ていません。Appleの審査が通らないからです(というか審査してくれない…)。が、ビルドや公開準備など開発側としてやることは終わってるので、かかる時間の比較の上では不問ということにしています。

画面の再設計して、バーチャルパッドで遊べるようにした(14時間)

結構悩むことに。

元のゲームは1画面1ステージなので、広告やバーチャルパッドを置く「隠れてもいい場所」がない。

f:id:marudice:20200425170204p:plain:w300

なので、元のゲーム画面を縮小する↑こんなのを作りかけたけど、メットボーイを参考にゲーム画面を分割した操作しやすい方法をひらめいて…   f:id:marudice:20200425171042p:plain:w400

こうなった。

https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631?locale=ja-JP:titleを使うのは初めてだったが、やりたいことはシンプルだったので半日でほぼ動くように。

f:id:marudice:20200425170657p:plain:w400

このバーチャルパッド設定が必要だったので、ついでに「設定」「クレジット」「課金」など、オリジナル版にない追加UIは画面レイアウトだけ作った。(設定画面は過去作から使いまわし)   TMProでのSprite Assetを勉強。元はキー操作(R)だったHowToを絵文字でやるように差し替えて終了。

f:id:marudice:20200425171936p:plain:w400

外国語への翻訳(7時間)

いい機会なので、GoogleSpreadSheetのテキストを一発でcsvにして取り込めるようにワークフローを整備しました。

f:id:marudice:20200425172321p:plain

Google翻訳最高!!知らない言語もとりあえず翻訳は出来ます。

今までせいぜい 日本語、英語、中国語 までだったのが、それら含めて(一応)9言語が選べるように!

ひたすらプロジェクト中にKEYを入れて、日本語をSpreadsheetに移す作業(つらい・・)。

まとめて翻訳出来るとはいっても

f:id:marudice:20200425172426p:plain

おす」が「男性」に…。ちがうんや…。

こういう誤翻訳は起こるので、気付いたら直しました。

英語は流石に一通り誤訳がないか読みました。

他は明らかにおかしい中国語に気付くくらいでほぼ読めないのでそのまま。

なんとなく、自動翻訳は

  • 日本語→(中国語、韓国語)
  • 英語→(ヨーロッパ系言語)

としてみたけど、効果があったかは不明。

文字溢れ

f:id:marudice:20200425173050p:plain

和「かいだんづくり( ◜◡◝ )」→ 独「Treppen Herstellung💢」

ドイツ語は・・ドイツ語はな・・・・。

Text Mesh Pro のAuto Sizingを使って文字が縮むようにしました。

1言語しか表示されないとUI上でのRect設定が適当だったりするので、文字が出る要素は一通りチェックする必要があった。

セリフの翻訳

f:id:marudice:20200425173158p:plain

口語なので自動翻訳が難しい。翻訳がダメだった時の萎え度も高いので、本当はネイティブに頼みたいところ。

今話題のDeepL翻訳を試してみました。

f:id:marudice:20200425173245p:plain

あれ?結構いい感じじゃね?知らんけど。 Heh hehがカワイイです。

ちなみに、Google翻訳はこちら

f:id:marudice:20200425173338p:plain

SpreadSheetと違って手動で翻訳しないとダメだけど、デモ1つごとにコピペ1回で済みそうだったのでDeepLで。

面倒なので、英語以外は英語からのGoogle翻訳で済ませる。

セリフの多いゲームではないけど、DeepL翻訳の英文は都度チェックして訳しやすいように日本語を調整したので、数時間はかかった。

f:id:marudice:20200425173508p:plain

翻訳終わり!Heh heh!

プライバシーポリシー表示の組み込み(3.5時間)

f:id:marudice:20200425173952p:plain

こういうヤツ。うっとうしいですよね。実装する方も面倒くさい思っています…。

でも、こうして各アプリが同意を取るおかげで、GoogleさんやAppleさんの利用規約がゆるくなってる・・・はず。

初回のみの言語切替も作りかけたけど、自動判定出来そうだったのでボツに。

広告をゲーム遷移に組み込む(4時間)

AdMobSDKの組み込み

GoogleMobileAdsSDKの最新版unityパッケージをGitHubからもらってくる。 何度かやってるのでほぼ秒。実機でちゃんと出るかはともかく…。

バナー広告の検討

AdMobのサポートページとかを見てうまくやると、Editor上でもバナー広告のサイズ感を再現可能。

それでダミー広告で画面を隠してみて…

f:id:marudice:20200425174353p:plain

諦めました。

パズルゆえ考えてる時間が長いので出したかったが、流石にプレイ体験を損ないすぎる… 遅れてくる企画の敗北です…

全画面広告

シンプルに、パズルをクリアして次のパズルが始まる直前に全画面広告。画面に広告タイマーを表示。

f:id:marudice:20200425174639p:plain

遊ぶ側の広告への憎しみを忘れないために、Editor上でも出来るだけダサいデザインでダミー広告が出るように。

f:id:marudice:20200425174911p:plain

この、このクソ広告め・・・。消えろ!消えろ!!!

Androidで実機ビルドする(6.5時間)

一旦広告だけある状態で実機確認。

他のも組み込んだ後にダメだと、どこまでなら動くか切り分けるのが大変に…。

一度ビルドを走らせると平気で30分とか待たされて、Androidコマンドライン部分(結構最後の方)で失敗…、少し変えてもう一度、また30分…。

NDKがどうだの.jarがgradleでdeprecatedだのがConsoleに吐かれるも、中間処理がいっぱい挟まってるので何が原因か全く分からない。

あぁこれ…最高にモバイル版ビルド作業…って感じ

素直にAndroid ビルドはExport Projectに変えて、Android Studioを使って自分でapkをビルドします。

f:id:marudice:20200425175610p:plain

意味不明なエラーを気合で直して、ようやくデバッグ版の.apkが出来ました。たった2時間半で済んでよかった   その後KeyStore準備とか何やかんやあってrelease版が出来た。

ようやく実機で遊べる状態になるも、広告が表示されない…。

とりあえず放置しました

広報用のトレーラー動画 (7時間)

気が重かったけど、ストアページやGoogle 広告などいろいろ便利なので、作らざるを得ない。

今までトレーラーは同人ゲームまとめ動画向けに 1~3分くらいの尺で作ってたのですが(https://www.youtube.com/watch?v=P2CYM9GtNFEhttps://www.youtube.com/watch?v=7ie43FNA5JA

ストア向けの動画はApp Storeの30秒が一番短い制限です。今回はこのショートPV一本に絞ってサッと作りました。  

www.youtube.com

出来た。 30秒だと必然的に「本題!ドヤドヤ!終わり!」みたいな構成になるけど、その方が要点がまとまった良いPVなのでは…という気もしますね。

日本語版もついでに作って終了。

Android実機で広告が出ない…(12時間)

時間が経てば動くやろ と思っていたけど、待てど暮らせど広告が表示される気配はなし。

PlayServiceResolverって何だ。イチから勉強するか。aarって誰だ。Androidのシミュレーターなら出るのか。ええいNCMBは一回外すぞ。っていうか意味が分からないログが多すぎてどれがクリティカルなのか全然分からない…。

最終的に、未公開アプリのデバッグビルドなのに本番広告が出るリクエストになってしまっていた…? ようで、テスト広告はなんとか実機で見られました。

が、言ってることが分からないログと警告は特に消えず……。

つらさの主な原因は、UnityからAndroid Studioなどの実機用エディタに移ると全てがブラックボックス化されることでしょうか…。

f:id:marudice:20200425180727p:plain

アプリ内課金 (0時間。中止)

これ以上ネイティブプラグインで苦しむのが嫌だったので中止しました。 

(ゲーム内コンテンツに比べ圧倒的に買われない広告削除くらいしか課金要素はないし)

Androidのストア登録(3.5時間)

気合で登録しました。空いてる空欄をひらすら埋める作業…。

f:id:marudice:20200425181148p:plain:w400

広報用のテキストは他のプラットフォームとかでプレスリリースで便利なのでテキストとして保存します。

広告メディエーションの導入(5時間)

AdMob広告を使う際、いろんな業者から競売されるようにすると不思議な力で単価が上がるらしいのでチャレンジしてみました。知らんけど。

Google AdMob のメディエーションガイド を読んで各メディエーションを組み込みます。

AdMob単体の広告に苦労したのに比べると、思ったより組み込みは楽でした。Googleのドキュメントがとても分かりやすいのも良いです。

AppLovin(実装難易度 3)

新しく広告を作るために、一度メディエーションなしでSDKを組み込まないといけない。逆にメディエーションを使うと直接呼び出しが出来なくなる(両方を含めてビルド出来ないため)。

ドキュメントが分かりにくい。テストビルドにいきなり本番っぽい広告が出る。

全体的に作りがモッサリしてるが、コンソールの項目の少なさも含めて庶民派な感じでちょっと可愛い。

UnityAds(実装難易度 1)

Cloudビルドとかとダッシュボードが統合されてて、Unityチョットデキルとハードルが低い。ランタイム実装も何も要らないので大変楽。

Facebook Audience(実装難易度 4)

広告以外にも機能が膨大にあるようで、ブラウザコンソールがめちゃくちゃ複雑。

2つのコンソールをまたいでIDをたくさん作らされてそれぞれを正しく接続しないといけない。AdMobのドキュメントがないと絶対無理。

もちろん当然のようにFacebookのアカウントと関連付けられる(イヤだ…)

ランタイム実装は何も要らないのは楽だが、広告テストに必要なAdvertising Identifierのために結局実機実装が少し必要。

IronSource(実装難易度 2?)

アプリを公開してないとうまく出来ない雰囲気で諦めた。

公開さえしてればなんか簡単そうな雰囲気だった。

Free Aspectに対応(1時間)

カメラの描画範囲はタテにもヨコにも伸ばせなかったので、いわゆる黒帯でお茶を濁しました。さみしいけど致し方なし。

2:1 f:id:marudice:20200425183058p:plain:w400

4:3 f:id:marudice:20200425183120p:plain:w400

AppStoreへのアプリ登録(3.5時間)

基本的には Google Playのコピペなんですが、スクリーンショットや動画の解像度指定が厳しく、さらに複数要求されます。   Photoshopバッチ処理やAfterEffectsの出力をいじって、スクリーンショット11枚(英語8枚+日本語3枚)と動画2本(英語・日本語)を3つの解像度に分裂させて、33枚のスクリーンショットと6本の動画を生成。

(正直、アス比対応を黒帯にしたのはそうしないと各解像度のスクリーンショットを作るのが面倒になるというのも・・)

事前予約・プレスリリースの準備と発信(5時間)

この当たりから想像以上の長期化でしんどくなってメモが適当ですが、時間は正確です。

予約トップ10

予約トップ10でアプリの事前予約を登録して

PR TIMES

PR TIMESでプレスリリースを出す準備をしました。

内容はストア広報の内容と大きく変わりませんが、各サイトのフォーマットに合わせます。

リリース時のオペレーション

実際にリリースしたら、下書き準備したプレスリリースを発射して、予約トップ10のリリースしたぞいボタンを押します。

iOS実機でビルド・実行する(10時間)

(ちなみに、古かったMacのOSを最新に上げるのに5時間くらいかかりましたが、それは入れてません)

Certificate全く分からない

iOSのビルドはCertificate, mobile provision というアプリの証明書のような仕組みを組み込まないとダメです。

調査と組み込みに結構時間がかかった…。

iOS版の広告準備

AdMob広告や各メディエーションの登録と実機確認をiOSで改めてやりました。 2回目なので前よりはマシです。

iOSが審査してもらえない……(10時間)

詳細は伏せますが謎のリジェクトをくらってしまい、そもそもアプリを審査してもらえてないです。

既存のアプリをアップデートしてみたり、1週間ほどいろいろ試しましたが、諦めました。

ぶっちゃけて言うと、今後も含めてiOS版が出るかはApple様次第です。 正直そこそこ不愉快なのですが、どうにも出来ません…。

まとめ

iOSは一旦保留ということにしましたが、4/24金曜日になんとかリリース出来ました

この記事の目的がモバイル版対応の作業コストを正しく見積もりことなので、各項目をカテゴリに分類してみました。

カテゴリ かかった時間
モバイル版仕様の実装 22.5
広報素材の作成 8
多言語対応 7
アプリストア 6
広告SDKを組み込む 10
想定外の問題対処 27
実機ビルド 11.5
広報作業 5

f:id:marudice:20200425203018p:plain

実機ビルドも広い意味では問題対処ですが、モバイルリリースではほぼ必ずぶつかる壁なので別にしました。

合わせると半分近く、約40時間近くを問題対処に使っていました。実機ビルドに慣れてきたり問題が起こらなければこれらはほぼゼロになるはず。

一方、モバイル版仕様や素材作成、翻訳、広報などは制作作業なので、リリース経験が増えてもあまり減らない作業コストです。

評価

お気づきかと思いますが、3月末から期間にして約1ヶ月、オリジナルゲームの開発よりもはるかに時間がかかりました。

集計する前は、「1作品20時間くらいでモバイル対応して、ゲームジャムに参加する度にリリース!」と出来たらいいなと思っていたのですが、現実的には慣れたとしても40時間、2週間くらいはかかりそうな印象です。

ゲームジャム作品で言えば、3割をモバイルリリースに進めるくらいがコスト対効果として適切かなぁ…。