はじめに
この記事は GameWith Advent Calendar 2018 の15日目です。
というわけで精神論を語りたいと思います。続編の予定はありません。あしからず。
誰を対象読者としているか
ゲーム好きのプログラマーであれば**「ゲームでも作ってみようかな」**と一度くらいは考えたことがあると思います。プログラムやソフトウェアを扱うことには長けているので、とりあえず無料で使えるゲームエンジンをインストールし、チュートリアルを終えるところまでをサクッと終わる。でも、肝心のそれ以降が一向に進まない。そんな経験はないでしょうか。
私もそんなゲーム好きのプログラマーの一員として三日坊主を繰り返してきましたが、このたび晴れてめでたくGooglePlayとiOSストアに自作ゲームをリリースできていません。
はっ? と思われたかもしれませんが、アドベントカレンダーの時期が来てしまい、他に書くネタが無いので許して下さい。完成させてない人間によるポエムほど空虚な物は無いことは重々承知してますが許して下さい。あと1~2ヶ月以内には……あるいは……リリースできると思いますので……。
備忘録として、あるいは**「お前はもう完成させるしかないんだぞ」**と自分自身に対する戒めのために、これまでの経験を書いていきます。
エンジニア的なメリット
まずは現実的な話から考えていきましょう。客観的な形でメリットを整理しておくことは大切です。
金銭面
金銭面から。これは絶望的と言っても過言ではありません。ゲームを作るだけの膨大な時間があるのであれば、その時間を副業にでも使った方がよっぽど金は稼げます。リリースしたゲームに広告を乗せれば多少の金銭は入ってくるとは思いますが、ゲームが飽食している現代において、自分らの作った個人制作ゲームが大ヒットし、ジャブジャブと収益が上がる可能性はどれだけあるでしょうか。少しググってみたら分かりますが、はっきり言って儲かりはしません。下手したらAppleの開発者登録代で普通に赤字になります。
冷静に考えれば金銭的なメリットは皆無です。そのため、ITエンジニア的な観点からどんなメリットがあるのかを考えてみます。
エンジニア的な学び
私の場合は開発プラットフォームとしてUnityを使用しているので、Unityがほんの少しだけ触れるようになります。UnityのスクリプトはC#で書かれているので、ほんの少しだけC#も触れるようになります。このようにして、これまでには無かったスキルセットが身につくことは確かです。それが今後役に立つかどうかは知りませんが……。
また、Unityを触っていると、VR・AR関係の技術発信を行っている人の記事が少しだけ理解できるようになります。親しみが湧くと言い換えても良いかもしれません。今のところVR・AR関係の技術はUnityにて製作されていることが多いのです。
TwitterのTLを眺めていたらUnityのエディタ画面が流れてくる、といった経験は無いでしょうか。ちょっとでも触れておくことで日々流れてくる情報への理解度が少しだけ高まります。VR・AR関係の技術をガッチリ追わずとも、ゲームを作っているだけでその辺りの技術に少しだけ親しみが湧くようになることはメリットと言えると思います。
その他にはエンジニア同士の会話で「土日に何してんの?」と聞かれたときに**「ゲーム作ってますね(ドヤ顔)」**と言えるようになることがメリットとして挙げられます。「朝から晩までずっとアニメ見てました」と言わなくて済むので、自分のちっぽけなプライドを守ることができるのです。良かったですね。
鉄は熱い内に打つ
初めのうちに主要な機能を作る
新しいことを始めるときは何事も一番初めのモチベーションが一番高く、徐々に落ちていくものです。ですので、モチベーションが高い時期にできる限りの実装を行います。このときに実装する対象の機能は、「ゲームでも作ってみようかな」と考えたときに頭に浮かんだゲームのイメージの中でも、最も根幹を成す機能です。
例えば、スーパーマリオであったら「十字キーの左右を押したら自キャラが動き、Aボタンを押すとジャンプをする。敵キャラは自動で動いていて、踏むと敵キャラが消える」というような機能です。ドラゴンクエストであったら「自キャラをマップ上で動かしていると、画面が切り替わり敵が出現する。UI上でコマンドが選択でき、たたかうをすると敵にダメージが入る」といった機能です。ぷよぷよであったら……という感じです。
上に挙げた例は適当ですが、とにかく**「これが最も大事だろう」**という機能をササッと作ってしまうことが大切です。できれば1~2週間くらいのプライベート時間を費やすとなんとか作れる、といったくらいの期間が理想です。
そのようにして、やる気がある時にそこそこの時間と労力をかけて一番大切な機能を作ります。これをすると何が起きるのか?
ゲームの中で一番主要な機能であるため、完成して動いている姿を見ていると**「あれ? ボタンを押すと画面内の物が押した通りに動くぞ。これはもしかしてもうゲームと言える代物なのでは? やった! ゲームを作れたぞ!」という錯覚**を起こすことができます。おめでたいですね。
コンコルド効果
その錯覚に加え、1~2週間程度のプライベート時間を費やしているため、ゲーム作りという作業に対してコンコルド効果が生じます。
「埋没費用効果 (sunk cost effect)」の別名であり、**ある対象への金銭的・精神的・時間的投資をしつづけることが損失につながるとわかっているにもかかわらず、それまでの投資を惜しみ、投資がやめられない状態を指す。**超音速旅客機コンコルドの商業的失敗を由来とする。
ゲーム製作への金銭的・精神的・時間的な投資が止められなくなるのです。完成に至らせるためにはとんでもない時間が必要だと分かっているのにも関わらず、ゲーム作りが止められなくなります。最高です。途中で止めたら**「今までにゲーム作りに費やしてきた時間は一体なんだったんだ……」**と、残念なことになってしまうため、どうしてもゲーム製作を止めることができなくなります。
時間が経ていくに連れ初めに持っていた「プログラムできるしゲームでも作ってみようかな」というモチベーションや、「あれ、結構簡単にゲーム作れるのでは?w」という幻覚は消滅して行きます。
ですが、純粋な気持ちが磨り減っていく一方で、コンコルド効果による「止められなさ」は時間が経つごとに高まっていきます。時間を費やせば費やすほど止めたときの損が大きくなるからです。
ゲーム作りのモチベーション(一定) = 純粋な気持ち(下がっていく) + コンコルド効果(上がっていく)
感覚としては、ゲーム作りへのモチベーションは常に不変になるように保たれている気がします。ちょうど帳尻が合うのです。よくできていますね。
このようにして最初の機能を完成させてしまえばそれ以降は安泰です。最初の内に勢いでやらかしましょう。そうすれば肩までどっぷりいくことができます。
できれば誰かを引き込む
ゲームの主要な機能が出来上がってしまえば抜け出せなくなるとはいえ、人は時に我に返ります。**「もしかしてゲームなんて作ってる場合ではないのでは? 自分はこれまで一体何をやっていたのだろう……」**と冷静になる瞬間は長い目で見れば必ずあるのです。
こんな時に助けになってくれるのがゲームを一緒に作っている暇人たちです。できればモチベーションと気分が高まっている内に、休日を暇そうに過ごしている独身彼女無しの人間を仲間に引き込んでおくと良いでしょう。暇な人間はプライベートの時間をゲーム製作に費やしまくっても平気にしがちです。我に返った時は仲間に引き入れた暇人たちとゲーム作りついて語りましょう。きっと正気を打ち消してくれるはずです。
また、仲間に引き入れた者に絵心がある場合には問題はより簡単になります。**「ちょっとゲームに使うグラフィック描いてよw」**と冗談半分で言ってみたら、けっこう良い感じのグラフィックが返ってきた、なんてことがあったりしたら最高ですね。そのけっこう良い感じのグラフィックを無駄にしないために、もう後には引けなくなります。
負担を最小限にして動くものだけを付け加える
できないことは諦める
ゲーム作りはあまりにもやらなければいけないことが多いです。プログラミング、絵、モデル、UI、エフェクト、音楽、ストーリー、キャラクター、etc。作るゲームのジャンルにもよりますが、放り込もうと思えば何でも放り込むことができます。
完成にこぎつけるまでの全てのパーツを1人で作れる人は、それだけでもうゲーム作り
という点においては天才として扱っても良いと思います。途方もない作業量を長期間に渡って続けられ、それを完成まで漕ぎ着けられるのは才能ですね。
**「ゲームでもちょっと作ってみたいなw」**程度のモチベーションから製作を始めた自分のような者は、それ相応の労力でそれ相応のゲームを作れば良いのです。高望みせず、労力を最小限に、動くものを作っていきます。
幸いなことに、Unityは世界で最も普及しているゲームエンジンの一つであるため、ググれば大概のことが検索に引っかかります。個人制作で作るゲームとしては十分すぎるほどの情報量です。Assetもサンプルコードもインターネット上に充実しているので、想定し得る機能のうち99%くらいは何かしらの情報が引っかかります。
自分の場合はちょっとでもヒントになるAssetやコードがあったらとりあえずエディタへ突っ込み、そこから改良していくという風にやっています。とりあえず突っ込んでおけば何らかの形で動くのでいくらか気が楽になるのです。
もし徹底的にググっても全く引っかからないような機能であったら諦めましょう。ゲーム作りのありがたい点の一つは、多少の機能を削っても完成させられるということです。もしその機能を諦められなければ頑張って下さい。頑張るしかありません。まあ、そんな時には**「これは誰も思い付いてない機能だから実装できればユニークな物になる」**とポジティブに捉えることもできますね。
最初から無理はしない
また、初心者なのに、最初からUnityで言うところのhierarchyやAssets内のフォルダやスクリプトのコードを綺麗にしようと思っても無駄です。最低限の秩序は保ちつつも、適当な部分は適当にしつつどんどん動く機能をくっつけていきましょう。最初からあれこれ悩んで実装の進捗がなく、ゲームシーン内の物が動かない状況が続くと、モチベーションは急速に減衰していきます。
自分の場合はプログラマ的な謎のプライドが発揮された結果、スクリプトを良い感じに書こうとしてUniRxというAssetを導入してみたりしました。C#のLINQによる書き方を強力にサポートしてくれるという代物です。詳しくはググって下さい。最初のうちは使ってみようと多少はあくせくしたものの、所詮は初心者、LINQによる書き方のありがたみは一切理解できないまま今に至ります。そもそもC#の基本文法すらそんなに分かっていないのですから当たり前ですね。
他にはUnityにあるAssemblyDefenitionといった機能をスクリプトフォルダに導入してみたりもしました。メリットを簡単に述べると、コンパイル時間を減少させたり、スクリプトごとの参照関係を分かりすくしてくれる代物です。詳しくはググって下さい。こちらについてはメリットは実感できたものの、様々な場面でエディタを再起動しないとエラーが出るわ、特定のAssetsを導入した時にこれまたエラーが出まくるわで、詳しくは書きませんが非常にしんどかったです。メリット以上のデメリットがあったような気がします。
上に挙げたもの(他にもいろいろ)の良さにいつか気づく日が来るかもしれませんが、今すぐではないでしょうね。少なくともゲームをリリースできた後であることは確かです。聞きかじりだけで適当に導入しても良いことは何も無いなと学びになりました。でも、大抵のAssetsや機能は驚くほど簡単に導入できるので、気になったら一度試してみるという姿勢は良いかもしれません。使えれば使えば良いし、使えなければ放棄すれば良いだけなので。やる気が無くなったらすぐに捨て去るという潔さが大切です。
締め切りは決めた方が良いのか
これは人に依ります。個人での製作で最も重要な点は**「楽しくやれるか否か」**です。
メリット
一般に締め切りを設けることによるメリットははっきりしています。期限が意識されることで集中力が高まり、作業効率が良くなることです。また、**「今日は疲れているからアニメでも見て寝ようかな。いやでも、今日サボったら来週までにこの機能を実装するという締め切りに間に合わない。とりあえずエディタを開いておかなきゃ」**といったように、サボりを抑制する効果もあります。
ところが、メリットがあるのであればデメリットも当然存在します。締め切りに間に合わせるようにゲームを作っていると、段々と疲れて来て楽しくなくなってくるのです。
デメリット
ゲームを作っている最中の時間は大きく分けると2つに分かれます。1つは**「完成した機能を動かしている時間」です。もう1つは「その機能を作っている時間」**です。完成した機能を弄っている時間はどちらかと言えば楽しいものです。自分で作ったゲームをプレイしている時よりもFallout76をプレイしてた方が圧倒的に楽しいという事実はあるにせよ、例えば役所に転出届けを出しにいくような時間と比較すれば自分のゲームも楽しめます。
面白さ
Fallout76 > 超えられない壁 > 自分で作ったゲーム > 役所に転出届けを出しに行く
役所に転出届けを出しに行くよりは自分の作ったゲームをプレイしてた方が面白いです! やったあ! 面白いゲームを作れてるぞ! よかったですね。
一方で、機能を作っている最中の時間はといえば、特に楽しくはありません。アニメを見るかゲームをしていた方が楽しいですね。これは間違いないです。それでも、できる限り面白くなるように努力することはできます。例えば、作業工程をどうにか省力化できないかとあれこれ悩んだり、スクリプトの整理をして作業環境を整えたり、ステージの配置をミリ単位で検討してみたり、など。こういうときは作業をしていても楽しめたりします。
ところが、締め切りを設けるとこうした作業中の余暇がほとんど消え去ります。意識が機能の完成
という目標1点に向かって集中してしまうからです。集中することによってどんどん機能はできていくにしても、徐々に余裕が無くなり楽しめていたことも楽しめなくなっていきます。自分は1ヶ月程度で無理になり、**「ゲーム作りをせずにアニメを見たい……でも自分で定めた期限は守らなきゃ」**という葛藤のもと、現実逃避へ走りがちになりました(葛藤した末に結局やらないパターンです)。
こうなってくると楽しい訳がありません。なんのためにゲームを作っているのか一切意味が分からなくなります。一緒にゲームを作っている者が**「ゲーム作りはなんと言っても楽しくなくちゃいけない」**と言っていましたが、これだけは正しいと思います。まぁ、プライベートでやる趣味であったら何にでも当てはまりそうなことですけどね。
良い感じにすれば良いと思います
世の中には締め切りやプレッシャーを自己に設けることで作業速度をブーストさせ、次々とできあがっていく制作物の中で快感を覚えるタイプの人も居ると思います。ですので、プライベートでのゲーム製作に締め切りを設けた方が良いのか、締め切りを設けない方が良いのかは一概に分かりません。締め切りがないと一生完成しないというのも真理だったりします。
いずれにせよ、**「楽しいか否か」**を基準にやっていき方は決めれば良いと思います。金にはならんし作業量は膨大だし他のゲームを遊ぶ時間は無くなるしで、しんどいばかりのゲーム製作を続けるためには楽しさだけが重要です。
大丈夫、もう完成させることでしか今まで費やした時間が報われることはありません。完成させる道しか目の前に残されていないのです。だから締め切りを設けずに楽しさを優先して作業してもゲームは完成するはずです。いつかきっと……
最後に
プライベートでゲームを作り始めてから早2~3ヶ月ほどが経ちました。完成には至ってないにせよ、これまでに学んだことは以上の通りです。これ以外にも副次的にC#とUnityの知識がちょっとだけ付きましたし、何かを作ってみるというのは良いことですね。
また、この記事を書いたことでますます完成させないわけにはいかなくなりました。こうやってあえて自分を追い込むのも完成に至らせる手法です。楽しさが失われない程度に、ほどほどにはしないといけませんが。
追記:
Unity部、もしくはゲームを作る部の活動報告ということにしておいて下さい。