一人でプロダクト（ゲーム）を作る時に考えていること

# はじめに
これは僕がiPhoneゲームを作る時考慮している内容です。
既にいくつものゲームを出しているので、今では空気のようにやっていて忘れていることもあるかもしれません。

参考までに[僕が作ったゲーム](https://itunes.apple.com/jp/developer/townsoft/id489489181)のリンクを貼っておきます。（良かったら遊んでください）
他にも作ったのですが、いつだかの時期にアップデートしないとStoreから削除するよと言われて削除されてしました。

# 企画フェーズ

## 作るものを決める
まずは、何をどのように作るかを決めます。
僕の場合は初めからきっちり決めるのではなく、ある程度の方向性を見出したら作るものをリスト化します。
またEvernoteを使っていて、電車の中とかで思いついたネタなどはiPhoneでEvernoteにメモったりしています。

## 作る機能をリスト化
初めにどんな機能が必要であるかを箇条書きしておくと、プロダクト全体の見通が良くなる。
例えば[Vanitas](https://itunes.apple.com/jp/app/id1341251506)を作る場合は以下の機能が必要になる。

* タイトル画面
* 町画面
    * 町の人
    * お店
    * 宿屋
    * 神殿
    * 錬金
    * etc...
* 冒険中画面
    * 画面横スクロール
    * 祈り使用
    * 宝箱
    * etc..
* ステータス画面
* 履歴画面
* 設定画面
* 戦闘画面
* 課金画面＆処理
* チャット画面＆処理
* スレッド処理
* キャラクターモデル
* 戦闘履歴モデル
* etc...

などのようにおおよそ必要な画面や処理を箇条書きで書いておきます。
先ほども書いたように僕は思いついた時に記載しておかないと忘れてしまうので`Evernote`のようなPCでもスマホでも書き込めるツールが便利でした。

## マネタイズ
これをきっちり考えられる人は、売り出し方に拘ってしまう傾向にある気がします。
なので、この部分はおぼろげながら考えておくと良いです。
初めにマネタイズだけ考えてしまうと、お金儲けの匂いが強くなったものが出来上がってしまいます。

かと言って、マネタイズについて考えていないと息の長いプロダクトは作れないのである程度だけ考えておきましょう。

### 余談
僕はゲーム以外にも色々なサービスを作ったがことごとく失敗しています。
その理由の一つがこのマネタイズだった。
マネタイズできないプロダクトはどこかで息切れしてしまうので、どうやってお金を儲けるかは企画時にある程度考えておきましょう。

スマホゲームの場合は「Apple」や「Google」がマネタイズの手段を用意してくれているのでこのプラットフォームをつかいうのが前提となるので少し楽になります。

## どういう人に使ってもらえるか？
言い換えると誰を助けるのか？を考えられると良いです。
ただ、僕の場合は想像力が貧困なので僕が遊びたいゲーム。僕が使いたいサービスを作ることになってしまいました。
そのため10年以上もマネタイズができず、貧困の中でゲームを作ってました。

最終的には僕が遊びたいゲームがある程度ニーズと一致した。そのおかげで細々と生きていけるようになった。
これは結果論なので参考にはならないと思うが、`継続は力なり`を実践した形になった。

## プレスリリースの文言を考える
経験則だが、早いうちに`AppStore`に載せる文言を書いておくとプロダクトの方針が定まりやすい。
僕の場合は`1日5分から遊べるRPG`というキャッチフレーズを`AppStore`に載せることを決めていたため、途中で方針がブレにくかった。

自分に完成イメージを植え付けるのはとても重要で、完成イメージを明文化しておくとモチベーションにもつながるのでおすすめである。

# 作成フェーズ

## 選定
プロダクトを作る以上、作成フェーズは避けて通れないです。
なので、どの方法で作るのが一番良いのかを試行錯誤する必要があります。

結果論で書くと、得意だからという理由で古い技術を使うのはやめた方が良いです。
僕は当初`Rails`というWebフレームワークが得意だったのだが、スマホゲームをRailsで作るとサーバーの用意が必要だったりするためやめました。
結果的に`Objective-c`を選択したのですが、この選択が功をそうしました。

よかった理由は以下です。

* コンパイル言語であるためスペルミスが減った。
* テストコードを書かなくてもある程度正常に動いてくれた。
    * 一人で作る時のテストコードはかなりのコストがかかる。これはやってみると分かる。
* Swiftへの以降ができた。
    * Swiftはシンタックスも分かりやすく省略コードも書きやすく、開発効率が大幅にアップした。
* Appleがバージョンアップの面倒を見てくれる
    * XCodeが次バージョンのSwiftにコードを自動的に変換してくれるため、常に最新を追いやすかった。

特に1番目と4番目のメリットは大きかった。
これをスクリプト言語で作っていたらスペルミスに悩まされただろうし、アップデートが多い`Rails`で作っていたら情報収拾とアップデート作業に大きな時間を取られていたでしょう。

とにかくどの技術を使って作るかの選定は重要です。
選定する時間は多くとっても、あとで回収できるほどのコストの差が発生するので色々検証しておくと良いです。

技術を選定する時に重要だと思う項目を列挙しておきます。

* 自分は細かいか？大雑把か？などの自分の性格
* プロダクトを作り終えるまでにどれくらい時間がかかるか？（規模）
* 何人で作るか？
* どんな媒体で配信するか？
* サービスをどれくらい継続するつもりか？

これらを加味して選択すると良いでしょう。
このように書くと`サービスは永遠と継続する予定だ`という人もいると思う。なので書き換えると`どれくらいサービスを継続すれば黒字になるのか？`を考えておくといいでしょう。
そうしないと、失敗した時に引き際がわからなくなってしまいます。

### ちなみに僕の場合
僕の場合はiPhone一択にしました。
マルチプラットフォームのものを作る場合はテストがネックになると考えたです。
iPhone/Androidの様々な解像度に合わせたテストを個人で作ると考えた時にゾッとしたのでiPhoneのみを考えました。
（作った後にはメンテナンスが控えていることをお忘れなく）

一人で作る場合はどうしても`楽しさ`が必要になります。
その楽しさを求めるために、僕が興味のある`OpenGL`を生で触って見たかったというのもあります。
これをiPhone/Androidの両方で実装するのは難しいと判断した、技術的要因もありiPhone一択になりました。

そして、その結果・・・・
スマホゲームで7年近くほぼ無収入で趣味としてゲームを作り続けることになりました・・・・。
（WebゲームやWebサービスもほぼ無収入で作ってました。そのお金にならないゲームやサービスのメンテナンスは本当に苦痛でした・・・）

この経験は一回味わうと嫌になるが、ポジティブに考えると勉強にもなります。
お金を儲けないプロダクトがどれほど自分の負担になるかを身を以て知ることができるからです。
そして、企画やマネタイズの重要性を知り次に活かせるようになります。
（7年も無収入だった僕が書くと説得力に欠けますが・・・）

##### 技術的経緯（おまけ）
僕もプログラマーの端くれなので、当初は生OpenGL2系をガリガリ書いていた。
しかし、生コードを書くと多くの時間を消費する上に僕のような半端なプログラムコードだとバグが多く出てしまう。
なので、途中からCocos2dに乗り換えた。

Cocos2dは素晴らしいフレームワークで`SpriteKit`でも似たようなコードを採用している。
今まではガリガリ`OpenGL`のコードを書いて`FPSタイマー`を自前で実装して・・・というプログラムが一切不要になった。
これは良い時代が来たと思っていたが、長くは続かなかった。

ある時期に、`Cocos2d-x`が中国に買収されてしまったのだ。そしてその時期に`Cocos2d`の開発は停止した。
この時に`ベンダーのフレームワークは途中でサポートがなくなる`という恐怖を味わった。

新しいPCを買ったときにベンダー(Cocos2d)がフレームワークを配信していない上に`Git`も封鎖されてしまっている事をしり、古いゲームのメンテナンスがとても困難になった。
ベンダーの`Git`をクローンしている`Git`を見つけて、なんとか新しいPCに環境を入れて、新しいiOSに対応するためにフレームワークに手を入れて・・・。
と、本当に苦しんだ。

なので、そのあとはApple社が出している`SpriteKit`に乗り換えた。
`SpriteKit`は`Cocos2d`ライクだけれど、パワー不足の上Appleがいくつかの機能を見限っている気がした。
そのため`Cococa`+`SpriteKit`という異質な組み合わせでゲームを作ることになってしまった。
（Appleは完全には見切りをつけないっぽいので`SpriteKit`は細々とサポートされると踏んでいる。）

結局のところ`Unity`が強すぎるため`SpriteKit`や`CocosCreator`などは淘汰されていくのかもしれません。
でも、僕は`Unity`のプログラムの組み立て方が性に合わなかった（ゴリゴリコードを書きたい）ので`Unity`の選択はできませんでした。
（上記の選定で書いている`性格`の部分が`Unity`を受け付けませんでした。ただ、未来永劫やらないわけではないと思いますが。）

## ググラビリティの確認
選定の一環ですが、作る時に必要な情報がgoogle検索で見つかるかどうかは事前に知っておく必要があります。
あとでわからないことがでて来た時に調べることもできず、聞くこともできない状況になると自分で調べて実装しなければなりません。
文献があると無いでは大きなコストの差を生みます。

## UI/UXについて
僕はデザインセンスが皆無なので、デザインに関しては様々なゲームをやって研究しました。
それでもベストな状態には持っていけてないのですが、僕個人が0からものを作るよりもはるかにましなものができました。

デザインで重要なのは`パーツの配置`です。
どこにどの情報を出せばユーザーが見てくれるのか？
この配置が重要になります。

これはとにかく色々なゲーム（Webサイト）を見て、真似をして実際に使って見てわかりやすいかを試行錯誤するしか無いです。
この部分は僕にとってもっとも苦手な分野でしたので、今でも苦戦中です。

でも、この出し方で売り上げが大きく変わることは間違い無いので手を抜かずに作り上げましょう。
どうしても難しい場合は`ランサーズ`や`クラウドワークス`などを使ってお金で解決しましょう。
どんなに良いものでも、見にくくて使いにくゲーム（サービス）は売れません。

※AppStoreのスクリーンショットとアイコンは超重要です。

## 新しい試みのチェック
作りたいものの中でコアとなるコード。そして今までの自分の経験でやったことがない分野。
例えば`ドラゴンクエスト`のゲームを作る時に`マップデータからマップをレンダリングする`などの今までにやったことがない試みがある場合は、サンプルコードを作るなどで予めチェックをしておくことが重要です。
新しい試みは自分が経験したことがないため、どれだけのコストが発生するかわかりません。

なので、先に確認しておきコストが大きくなりそうなら仕様変更も検討しておくことをおすすめします。
僕が初めてOpenGLでゲームを作る時には

* pngファイルをiPhoneに描画できるか？
* 描画した部分だけをアニメーションできるか？
* 衝突判定は正しくできるか？

などを先にチェックしてからゲームを作りました。

この新しい試みですが、これを全く入れずにプロダクトを作ってしまうと、特徴がないありきたりなものが出来上がる可能性が高くなります。
ですので、できるだけこの新しい試みは必ず入れましょう。
そして、事前に検証しておきましょう。

それがプロダクトのためでありプログラマーのやりがいになります。

## その他
他にも書いていませんが、アプリのログやアナリティクスをどうするか？
クラッシュ時にどのように対応するか？
過度なアクセスがあった時にどうするのか？
脱獄ユーザーをどのように対応するか？

などなど、様々なことに悩まされます。
これらのことは出来るだけサービスで解決した方がいいです。
アプリのログやアナリティクス、クラッシュ対応、アクセス過多、プッシュ通知などはGoogleのFireBaseを使えばほとんど解決します。

脱獄についてはStack over flowを見ればある程度の解決策が乗っています。
個人で作る場合はとにかく、自分でハードを持たないようにすることです。
ハードを持つとそれが負債になり、撤退障壁が上がるのでよほどのことがない限りは何かしらのサービスを使うことをお勧めします。

## いざ作成
一人で作成し始めると

* この実装はこれで正しいのだろうか？
* 作っているものをみんなが使ってくれるだろうか？
* 本当に完成するのだろうか？

長く時間をかければかけるほどこのような思いが出てきます。
正直に言って、本当に辛い時期が長く続きます。

初めは楽しかったプログラムでも、どう工夫しても（独りで）人海戦術を使わなければならない局面を迎えることがあります。
その時に終わりの見えない作業に気が遠くなったりします。

大丈夫です。
必ず出来上がります。

でも、このような思いが駆け巡ってきた時のために他の仕事も残しておきましょう。
例えば

* 自分が好きな工夫を凝らす必要があるプログラム部分
* SppStoreの文言の調整
* マネタイズの思案

なんでも良いので、心が折れた時にやれる楽しい仕事を確保しておきましょう。
これは二人以上で作成している時には感じない、独りの時にだけ感じる特別な感情でこれに打ち勝たないとプロダクトはできません。

ここはもう精神論ですが、頑張れば出来上がります！
自分を信じてやりましょう。

# 販売フェーズ

## 金額を決める
開発がある程度進んでくると、この販売について考えなければなりません。
注意する点は、開発が終わる頃ではなくある程度進んだ時に考えることです。
開発が終わってからだと、どの機能をどの値段で販売するかを考慮しにくい状態になっています。

作ったもの全てが買い切りならば初めに値段を考えていると思うので問題ないです。
問題なのが一部の機能を売ったりする場合です。
その`マネタイズに関わる一部の機能`の範囲を決めて値段を決めておく必要があります。そして、特にその部分ではバグを出さないようにしましょう。
無料の部分でバグを出してもユーザーはあまり怒りませんが、お金を出して使った機能に対してはユーザーの非難が発生する可能性があります。

なので、開発してある程度作成の目処がたったら金額を決めていきましょう。
有料の部分の機能は特に気合いを入れて作る必要があります。出来上がってからでは魂が篭っていないため、売りにくいでしょう。

## ユーザーは本当にお金を払うのか？
こればかりは市場に出して確認した方が良いです。
自分でシミュレーションをしても良いのですが、個人レベルでのシミュレーションは自分の物差ししか無いので無理だと思った方がいいです。

なので、ここは似たようなビジネスモデルを見つけ出して`実際に自分でお金を払って`みて、そのビジネスが提供してくれる価値を自分で感じてみましょう。

僕の場合は`プログラム`ばかりやっていたのでこの辺りはとても苦戦しました。
お金に関わる仕事していない人（給料をもらっているだけの人）は大抵ここで潰れます。
自分が不得手だと思っている部分はできるだけ他の模倣をしましょう！

いくつものプロダクトを出せる人なら、マネタイズの部分をちょいちょい変えながら市場の反応を見るといいです。

## 広告を出す
お金ではなく広告掲載で報酬を得る場合はどのように広告を出すと目に留まりやすいかを考えましょう。
他のゲームをやって、押しやすい広告は何か？邪魔な広告は何か？を常に考えて出す必要があります。

例えば、スマホの画面の上部にバナー広告を出しているゲームを見る場合がありますがこれはほとんどタップされないと思っていいです。
人間の目は手元に行きがちなのと、画面上部はタップしにくエリアです。

かと言って上部と下部に広告を出すと広告アプリっぽくなってしまいます。
色々な広告を出してみて、自分が許容できるエリアに広告を出すようにしましょう。

## 出稿する
ゲームもサービスも使ってもらわないとマネタイズはできません。
よほど優れたゲームで色々なメディアが取り上げてくれるならまだしも、通常はユーザー100人を確保するのにも苦戦します。
その場合に広告を出向することも検討しましょう。

これは、自分のゲーム（サービス）はユーザーが集まればマネタイズができると確証ができた時に行いましょう。
参考ですが30日間でARPUが300円を越えれば出稿を考えても良い状態だと思います。
ただ、出稿は大抵1万/1日くらいかかるので出す時には本当に注意して出しましょう。

ここ、さらっと書いていますがとっても泥臭くやってます。
色々なメディアに打診したり、Twitterで告知したり。
つまらないゲームには全く連絡が返ってこなくて落ち込んだりします。

# 最後に
お金を儲けられる商品を作ることは本当に難しいです。
例えば僕のこの記事を見て作り始めた人がいたとしても、10人中9人は失敗するでしょう。

しかし、自分の力だけで多少でもお金が手に入った時には歓喜に震えます。
うまくいけば人生が変わります。

そして、技術者ならば失敗しても大きな経験を得ることができます。