はろーぅ。ゆうきです。
今回は、日本初のインディー・ブロックチェーンゲーム「マギアストーン」を開発した上で得られた知識、
個人制作における、ブロックチェーンゲームの制作難易度
について、雑談ベースでお話していきます。
簡単か、難しいかで言われたら、難しいです。はい。
ええ、とても難しいです。専門知識がいくつも必要になってきます。
ただ、ちょっと誤解しないように。ブロックチェーンの部分が難しいのではありません。正確には、ブロックチェーンゲームを構成するための、ソシャゲ型のブラウザゲームを構築するのが大変難しいのです。
また、大変難しいとはいえ、やる気とメンターと時間さえあれば、私のような個人開発者でも、制作開始から半年でβ版までたどり着くことも可能です。
やればなんとかなります。やれば……。
以下が制作難易度を大きく上げている理由です。
・サーバーの構築・管理技術が必要
・Unityが使えない
・ブラウザゲーム用の素材が全然ない
・「Pixi.js」や「Three.js」の資料が全然ない
・JavaScriptの最適化が必要
・JavaScriptのメモリ管理が危ない
・「IPhone」と「Android」の両方で動作する保証がない
順に説明していきましょう。
マギストに使った技術の中で、体感的な難易度は以下の通り。
─────
・VPSサーバーの用意 → 普通。割となんとかなる
・CentOS(Linux)→ かなり難しい。セキュリティ強化も必要だし、一手間違えると、サーバーをまるごと破壊してしまう可能性すらある。初心者殺し1
・Ruby on Rails5 → すごく難しい。ワードプレスのオリジナルテンプレート制作やプラグイン制作(php)を10倍以上難しくした感じ。とにかく環境設定とかで事故る。覚えなければならないことが多すぎる。説明書が環境の違いで使えないことも多数。どおりでエンジニアは、この辺の技術で飯が食えるわけだと感心するぐらいに難しい。初心者殺し2
・Nginx → やや難しい。通常のプログラムと違い、コピペとかで済ませていると、どこかで爆死する。構文の理解が必要
・Capistrano → やや難しい。デプロイ環境は人それぞれなので、記事の説明通りに行くことは全然ない
・Unicorn → やや難しい。というか、UnicornよりCentOSが、より難しくさせている気がしなくもない
・Mysql → 扱うだけならそこそこの難易度程度なのだが、実はすごく難しい。RoRなら、ActiveRecordでSQLを多少サボれるが、それでもデータベースは難所。ちょっとミスると、DBが止まったり、セキュリティホールが発生したり、N+1問題を生じさせたり、書き方のミスでロード速度が致命的になったり、正規表現がしっかりしていなかったりと、トラブルには事欠かさない。初心者殺し3
・Html5 → 簡単とは言っていない。が、他の項目が鬼畜すぎて、簡単に見えてしまう。そして隙を突かれてひどい目に合うまでが形式美
・CSS → 底なし沼。難しいわけではないのだが、拘ると沼に引きずり込まれる。プログラマーなら、あまり関わらないのがいいのかもしれない
・JavaScript(ES7) → 大変難しい。というか、これ、ゲーム用の言語じゃない(これしか選択肢がないけど)。ただ動くだけのコードなら、かなり楽な部類に入るのだが、(ゲーム開発用ではない言語で)ゲーム開発となると話は別。特にスマホでの実行速度とか、メモリ管理とかがヤバい。初心者殺し4。GCナニソレオイシイノとかになりかねない。詳しくは下記の別の項目にて
・Ajax → 一部しか使っていないので、難易度は不明
・JQuery → 救世主。JSの地獄から貴方を救い出してくれることだろう。多分
・CanvasAPI → 簡単そうに見える悪魔。いや、実際には簡単に使える初心者向けのやさしーAPIなのだが、実行速度を良くしたいと感じるようになると、急に牙をむけてくる。この記事を書いた時点では、CanvasAPIをスマホで描画した場合は遅すぎるので、高速化に凄く悩まされる。最初から「Pixi.js」や「Three.js」や「PlayCanvas」に逃げたほうが無難
・Three.js → 凄く難しい。CanvasAPI を覚えて喜んでいる初心者を挫折させるには十分すぎるぐらいの難易度。GPU操作とスプライトの概念だけでも、初心者には重すぎると言うのに、そこへ3Dレンダリング等の高難易度のテクニックでトドメを刺しにくる。最適化やメモリ解放も大変。初心者殺し5
・Howler.js → 救世主2。WebAudioAPIを選択したら、その人には絶望が待っていることだろう(体験済)
─────
難しいが一体何個あるんだ!? というぐらいに、難しいが大量にあります。
そして、初心者の場合は、難しいに1個直面しただけで、すぐに挫折します。そのぐらいには難しいです。
今や「インディーゲーム制作といえばUnity!」と言えるぐらいにUnityが浸透していますが、大変残念なことに、現時点のブラウザゲームの制作でUnityは全く使えません。
おそらく、JavaScriptがゴm……じゃなくて、単純にブラウザゲームのような小さなCPUとGPUの環境では、こういった大規模なツールには合わないのでしょう。
この辺が原因かも。
・ライブラリを複数通すのは、JSでは致命的(速度面で)。JSは想像以上に遅い
・ダウンロード量は徹底して軽くしなければならない(UnityエンジンをDLする時点で終わっている)
・メモリ制限
はっきり言って、Unityではどうにもならない問題ばかり。
じゃあ、Unity無しで作ろう! ということになるわけなのですが、多分Unity慣れした人はUnityがないと窒息死します。はい。
依存しすぎも、考えものかもしれませんね。
あまり知らない方もいると思いますが、ブラウザゲーム用のフリー素材って、全然ないんです。
それは何故かというと、素材の利用規約に引っかかりやすいから。
ブラウザゲームはその性質上、素材ファイルがURLでそのまま置かれてしまったりすることになりやすいのですが、多くのゲーム素材では、そういった間接的に「再配布になってしまうこと」を嫌う傾向が強いので、使用できる素材が、かなり限られてきます。
商用フリーですら、ブラウザゲーだけは禁止になっていることもチラホラ。
ということで、画像や音楽は、基本自前で揃える必要があります。……全部、ね。
十分な描画速度が出せるブラウザゲームを作る場合、WebGLの操作が必須となるとため、(WebGLを直接触りたがる狂信者を除けば)必然的に「Pixi.js」か「Three.js」辺りのライブラリ(ラッパークラス)の使用を迫られるわけですが、まぁ、この2つの日本語の情報が、全然ない。
それどころか、英語ですら情報がない可能性もあります。また、WebGL(という名の極めて難しいシステム)の知識があることを前提とした説明とかも多数あり。
場合によっては、自身で研究しなければ使えない機能すらあります。
Unityや人気の言語等、枯れた技術の情報が、いかにありがたいかを思い知らされることでしょう。
この問題に対する解決策は、以下の記事が大変有効です。
JavaScriptは非常に遅い速度の言語(重い言語)であり、高速になる(特殊な)書き方を一つ入れるか入れないかだけでも、スマホでは速度が激的に変わります。
私のゲームも、上記の記事を片っ端からチェックしてみたら、スマホでのゲームの実行速度が従来の2倍以上になりました。
ブラウザゲームを作る場合、常にループ速度やループ回数、メソッドの呼び出し数に気をつける必要があります。
(C#でローカルゲームを開発していた頃には、全く考えられなかったことです……)
JavaScriptのメモリ管理の仕組みを知らないと、速攻でメモリリークを起こして、もれなくブラウザソフトが爆発します。
そもそも、通常のホームページや、Node.jsとかでは、そんなに長ったらしいJSのコードを書くことがないので、ページ移動したり、プログラムが終了したら即メモリ解放で困ることはないのですが、ゲームのようにメモリ管理とループ処理が大切なシステムだと、DOMやイベント等のメモリ解放などの要素が凄く不安になってきます。
(ちなみに、JSはイベント系のメモリ解放が面倒です。JQueryに任せるのが吉)
ただでさえ、CPUとGPU領域に気を使わなきゃいけなくて、コーディングに集中できないというに、そこにメモリ管理までのしかかると、もう大変!
三重苦がプログラマーに襲いかかることでしょう。
なお、PCゲームが作れる「DXライブラリ」とかだと、これらの問題は何一つ気にする必要がありません(メモリ管理はDXライブラリとかでも必要だけどブラウザゲームほどではない)。
これは、ブラウザゲーム特有の問題だったりします。
○ 「IPhone」と「Android」の両方で動作する保証がない
現時点だと「IPhone」が「WebKit限定」。
「Android」が「V8」エンジンですね。
これらの、JavaScriptエンジンは微妙にルールが違います。V8では問題ないコーディングでも、Webkitではエラーになるものもあります。
また、「IPhone」と「Android」では、音声ファイルや、WebGLの利用可能範囲、使用可能なJSのメソッド、ブラウザのルールとかにも違いがあるため、それらを事前に把握していないと、ひどい目にあったりします。
さらに、両方の機種でデバッグが必要となるため、「IPhone」と「Android」の両方の環境を用意して置かなければなりません。……お金が、足りない。
以上です。
ここまでは、あくまでブロックチェーンゲームを作るまでの技術であり、
・ゲームを面白くする
・ゲームに売れる仕組みを入れる
・エコシステムを構築する
等をしたいのであれば、また別の専門知識が必要です。
……「もっと気軽にブロックチェーンゲームが作れる」ようになってほしいですね。
(´∀`;)