アプリ「説教おじさん」のつくりかた
2年前に下書きのままリリースされていなかったのをみつけたのですいこうせずそのままリリースします。2018年9月くらいにかいてたみたいです。くまのレストランリリースする前くらいですね。
======================================================
この記事は先日思いつきでリリースした「説教おじさん」のざっくりした開発記録です。ゼロからリリースまでの主なイベントを書いたので参考になる人もいるかもです。
自己紹介
会社をレイオフされてから、自前のRPGツクールを作ってRPGをしばらく作っていましたが「償いの時計」「しあわせのあおいとり」イマイチお金にならないのでお金が欲しいなと思い、休憩がてらたまにはUnityで適当にアプリ作ろうかなと思いたち開発をはじめました。それが「説教おじさん」です
開発記録
前夜
Unity3Dは仕事で使っていたため慣れていたのですが(リードエンジニアやってました)、個人ゲーム開発で使用するのははじめてです。いままでは、cocos2dxもしくはebitenでアプリを作ったことしかありませんでした。それでは開発の記録を時系列でまとめていきます。
ざっくり企画
以前友人とインドネシアのゲームスタジオを訪ねる旅をしたのですが、途中暇すぎて説教おじさんごっこをしていました。どういう遊びかというとキャバクラにいってキャバ嬢に説教する設定の遊びです。意味分かんないですね。(ちなみにキャバクラは一回しかいったことありません。おもしろくはなかったです)ということで、最初は小鳥にエサをあげるだけのゲームを3日くらいで作ろうと思ったのですが、世の中には説教需要があるに違いないという確信を胸に説教欲を満たすためのアプリを開発することになりました。けんすうさんも説教ビジネスに可能性を見出していますよね!(r25の記事より引用)
とりあえずUnityでプロジェクトを作る
あまり愛がない感じのプロジェクトなので、もう手を抜きまくろうと真面目に作ることはやめました。シーンは一個、ZenjectとかUniRXみたいなファンシーなものは使わない。とにかく動けばいい!
Spineを学ぶ
さて、ベンチにすわったオッサンが捨てるシケモクを拾い続けるのがコアゲームプレイなので、オッサンのアニメーションを作らないといけません。そのためSpineの使い方を学びました。アニメーターが作ったデータを動かすことはしたことがありましたが自分でデータを作るのは初めてでした。一日程度でだいたい習得し、Skinの仕組みでアニメーションは同じでスキンだけ変えるということもできるようにしました。おじさんの絵ははなくそをほじりながら描きました。初期の説教おじさんは下みたいな感じでした。これが自分のイメージする説教おじさん像でしたね。背景はいらすとやから借りました(合計20点つかわなければ無料)。これでおじさんがシケモクを捨てるのを拾うゲームプレイができました。
マスターデータ管理
さて、ゲームを開発するにおいて、必ずマスターデータというものが必要になります。これはなにかというとショップに並べるアイテムだったり、レベルアップの経験値テーブルだったり、そういったデータです。今年のはじめに3ヶ月ほどアメリカの会社でゲームを作るバイトをしていたのですが、OSSで一部のライブラリを作らさせてもらいましたのでそれをそのまま使いました (https://github.com/wasedaigo/grille-xlsx). GoogleSpreadSheetでデータを入力してJSONで書き出すみたいなことをしています。今回はそれをmsgpackに変換してゲームに食わせました。スプレッドシートを更新してコマンドラインでコマンドを打つとゲームデータが更新される仕組みです。これは後ほどライブアップデートにも対応させました。(動的にゲームデータを更新する仕組み)
サーバーを構築しよう!
AWS入門
さて、手紙を送って、それに説教をするサイクルなわけなのですが、コレを実現するためにはサーバーが必須になります。AWSの管理画面にアレルギーを持っていた自分ですが、今回ちゃんと勉強することにしました。理由の一つが、「中国」です。GoogleAppEngineはもれなくブロッキングされているのでどうせならAWSで巨大市場狙っていこうぜ!と思って使うことにしました。中国にもまだみぬ説教おじさんが大量にいるはず!
Lambda
なんとなく気になっていたLambda。マイクロサービスができるとモテるということをきいていたのでチャレンジしてみようと思いました。これ使っておけばいい感じにスケールするしサーバー周りなにも手間がかからないよという夢のソリューションです。Golangで書けるし。ローカルで簡単にテストできないため、毎回serverlessを用いてアップロードするという残念な感じで開発していました。ユニットテストは今回はナシです。無駄無駄!というかgolangだと型があるんでテスト無くても一発で動いちゃうことはざらでした。もうnode.jsとかやりたくないなぁと思います、ホント。とりあえず、エンドポイントごとにマイクロサービス作ってしまうのは筋が悪くて、「説教おじさん」をまるごとひとつのマイクロサービスにしてしまうのが効率いいということがわかりました。費用面でもデプロイの手間の面でも良いです。
DynamoDB
GoogleAppEngineのDataStoreに慣れていたので理解が大変でした。とにかく貧弱。CapacityUnitの概念を理解するのが一番大変でしたね。サーバー代を節約したいのでかなり真剣にしらべました。お金が絡むと勉強の効率アップしますね。
Redis Labs
DynamoDBだけだと厳しいことが多々ありそうだったので(ランキングとか)Redisを補助的に導入することにしました。AWSだと真っ先に思いつくのがElastiCacheなのですが、ElastiCacheを使用したい場合Private VPCを使うことになるためNATGatewayのコストが発生します。それが月$30くらいになりそうな感じだったのでアホらしくなり代替手段をさがしたところRedisLabというのが良さそうということで使いはじめました。かなり良いです。
AWSのリージョンの選択
日本メインでやるから東京リージョンでいいやろ、とおもって東京リージョンにしたのですが、価格がOregonの1.5倍くらいということが判明しました。レイテンシは大きな問題になるゲームではないので、東京リージョンはやめてOregonにしました。
APIGateway
AWSとかつかっているともうお金を節約することに意識がいくのですが、APIGatewayがなにやらお金を余分に吸い取りそうな気配がありました。結論からいうとAPIGatewayを介さなくても、UnityのAWSSDKを使用して直接Lamda叩いてしまえば無料なのでそうすることにしました。(DDosアタックとかから守られない予感がちょっとするのですが、詳しい方いたら教えてください)
結果
努力の結果もあり、一銭も払わずサーバーが運営されております。毎月2000円くらい儲かっているようです。開発に3ヶ月以上かけたので開発費は永遠に回収できない予定です。
メモ書き
* 制限厳しすぎわろた
* RedisLab vs ElastiCache
* Private VPCをつかいたくない!NATGatewayが高い
* APIGateWayをどうするか?
* 直に叩くことでAPIGateway代払わなくて済んだ
* セーブデータ保存の正解がわからずつれえ
* UniRXのひとのやつでMsgpackが正解っぽい雰囲気
* ローカルとリモートにデータ持つのがつれえ
* ハッキングどうすんのみたいな
* md5
* サーバーで付与できるシケモク数を制御
* Cognitoを知る
* UsePool ?? IdentityPool?
* Unauthのときの挙動はどうなんだ。Persistencyは?謎謎謎
* 同じメッセージをうけとらないようにする工夫
* テストフライトがしょぼくてつらい
* PixelMatorがクラッシュしまくってつらい
* VBox/HBoxがつらい
* AndroidはもうIL2CPPいらんよね、めんどい
* ポップアップとかそういうシステムを雑に作ってしまってつらい
* 雑にコンフィグを動的更新する私であった
* フォントで苦しむ
* TextMeshProでの多言語対応が死ねる
* FontAtlas生成何が正解かわからん
* 多分?全部入りテキストをみつけた
* 結局uGUIにした。サイズが大きくなりすぎたりマテリアルの切り替えが面倒。
* Outlineは重めの代替コンポーネントですます
* ローカライズ対応
* GIF生成で苦しむ
* シーンを別にセットして録画できるようにした
* なかなかいいライブラリがみつからなかった
* 色数の問題(改造してパレットを初期化するようにする)
* GIFシェアで苦しむ
* UIActivityControllerでシェアするとダメ
* 絵文字で苦しむ
* ライブラリを拾ってくる
* バグっている
* 余計なUnicode文字が入り込むのを削除
* FILTER_EMOJIS_IOS_KEYBOARD (https://qiita.com/hirano/items/426685c92fc8eebc3e54)
* ローカル通知するときになんかクラッシュする
* FILTER_EMOJIS_IOS_KEYBOARD=0 にしないとそもそも入力できない
* pod 'GoogleUtilities', '5.2.0'
* 通知の実装にくるしむ
* まずどのライブラリにするかというところ
* AndroidManifest.xmlの設定漏れ
* リモート通知。最初うまくいかなかった。
* 同一デバイスをAWSSNS/GCM経由で複数回登録するとReason: Endpoint (.+) already exists with the same Token がかえる
*
* AmazonSNSで苦しむ
* Unityのドキュメントが古い。やる気ない。
* Firebaseを結局いれないとAndroidPNつかえないと知った時
* PNおくるとき古いフォーマットじゃないと送れない(GCM)
* 課金実装で苦しむ
* AndroidにおけるConsumableの扱いがよくわからんかった
* 勝手にリトライするのねへーみたいな。
* いい感じのコードを見つけるのに一苦労
* Unity UDPとUnity IAPが存在してわけわからんかった、ガン無視してコードで書くのが正解
* レシートのバリデーションどうするんだっけみたいな
* もう気合い、気合い
* 広告実装で苦しむ
* 本当にAdmobでいいのかわからない
* 中国対応の夢
* まともなライブラリがない。結局Admob
* メディエーションなにがいいのかわからない
* 日本のAdsはなぜか個人情報いれさせられて審査があって謎すぎる
* Androidだとイベントはスレッドで呼ばれる・・
* https://ads-developers.googleblog.com/2016/04/handling-android-ad-events-in-unity.html
* CarshReporterがクラッシュする
* Fabricしね・・
* ジャムおじさんでくるしむ
* さすがにまんまなのはよくないよね
* AppleStore
* タバコ駄目じゃんみたいな・・・
* Twitter連携つらし
* TwitterKit (サポートがなくなるらしい。とりあえずOAuthの部分だけ利用させてもらう)
* TwitterKit-Unityちゃんとインストール手順にしたがおう・・・
* Let’s Tweet (AssetStore)
* テラシュールの6年前の記事とか見る始末 (http://tsubakit1.hateblo.jp/entry/20120610/1339334050)
* upload/media なんとかGIFUpload実装に成功
* が、TwitterKitリジェクト(private API)とか・・・、Locationのパーミッションとるとか・・・、メンテも打ち切りだし・・・
* 共有機能いるかもあやしいし・・・
* やーめた!! (https://github.com/wasedaigo/TwitterGIFUploadSample)
* Deeplink
* Branch
* サイト作成
* 全画面動画の方法をしる…
* UniversalLinkがiOS11.2以降ちゃんとうごいていないらしい (https://blog.branch.io/notice-inconsistent-universal-link-behavior-on-ios-11-2/)
* $uri_redirect_mode=2でしのぐしか・・・ウーム。
* S3でファイルをホストする
* S3Client.GetObjectAsync
* BinaryReader
* Config & Tuning
* ユーザーの引き継ぎ機能
* ログインの並列化
* クリップボードにUserIDコピー
* プライバシーポリシー
* アプリ
* ストアページ
* ユーザー生成コンテンツ
* レポート
* ブロッキング
* ユーザーBAN
* フィルタ
* https://github.com/beastcrm/TinyTokenizer (分かち書き)
* http://javascript.g.hatena.ne.jp/edvakf/20101116/1289886927 (リンク切れ)
* 結局自分で書いた (正規表現でよかった)
* AdmobのMobile.Initialize()がクソ (ARNが一部のデバイスで起きる)
https://groups.google.com/forum/?hl=zh-Cnh-Cn#!category-topic/google-admob-ads-sdk/android/NBpj7fy7wYc
* クソであると言う部分
おわり
この記事が気に入ったらサポートをしてみませんか?