第3話 新しい開発環境に思う
長い人生において、いろいろなプログラミング言語やゲームエンジンといった開発環境を試しているのは、好奇心が原動力というよりも、現在使っている環境に不満があるというのが大きい。
想定した機能がない、特定のゲームが効率的に開発できない、思想が違う、手に馴染まない、そうした直接的な理由もあれば、遊べる実行環境が少ない、ライセンスが好ましくない、有料、自由度が低い、更新頻度が低いなどの間接的な理由もある。そうした不満が原動力になって新しい開発環境を試し始めるのだが、当然「毎回初心者に戻る」という問題が発生する。
この「初心者に戻る」イメージは、RPGの転職に近い。レベルは1に戻るけど、過去に上げた能力値や、獲得したスキルがゼロになるわけではない。ゲーム開発については、プログラミング言語の知識と、ゲームエンジンの知識が持ち越しできる「経験値」になる。
世の中にはプログラミング言語の種類が多いが、現在メジャーなプログラミング言語はそれほど大きな違いがあるわけではない。最初は特定の開発目的があって尖っていた言語も、多くの人に利用されるようになると、他の言語と同じことができることを要求されてどんどん似た機能が追加されていく。そのために、メジャーな言語ならたいてい同じような機能が実装されている。
ファイル操作がどの言語でもあったり、クラスやオブジェクトの仕組みが似ていたり、ラムダ式が存在したり、非同期処理があったり……、便利な機能は他のプログラミング言語にもどんどん波及していく。どこかで一度学ぶと他の言語に移動してもそれほど困らない。
そのため新しいプログラミング言語を使いはじめても、「たぶん、この機能がどこかにあるはず」という勘所が働き、検索して探すことができる。それぞれの機能は、ちょっとずつ違うやり方で入っていたりするが、それほど大きな違いはない。また、違いがあっても「こう違う」とどこかで誰かが解説している。
今回、
このGodotは、Unityがライセンス関係でやらかして揉めたタイミングで、移行先として注目された。そして、その後急速にユーザー数が増えた。この時期に、私もUnityに不満を持っていたのだが、すぐにGodotに移行することはなかった。理由は、独自のGDScriptというスクリプト言語を採用しているからだ。独自言語だと、その環境向けに作成したプログラムを他の環境に持ち出すことができない。「一蓮托生になるのは嫌だなあ」と思い、手を出さないでいた。
その後、いろいろと候補を調べて一年ほどPythonとPygameでプログラムを書いてみた。そこには少し別の意図もあった。Pythonを少し集中的に学ぼうというものだ。その甲斐もあって、商業サイトで記事を書いたり、動画講座を作ったりという方向性でPythonを学んだ結果をアウトプットすることができた。
そして年末になり、PythonとPygameでSRPGを作ろうとしはじめたのだが、すぐに茨の道だと気が付いた。設計思想がだいぶ違うので、実現するために書かないといけないコードが多く、さらにメンテナンスもかなり面倒くさい。そんなときにBluskyで「Pygameは向いていないだろう」と言われて、「そうだよなあ、第二候補だったGodotを試すか」と考えを変えた。そして、チュートリアルの2Dゲームと3Dゲームを作り、ドキュメントも一通り読んでGodotへの移行を決めた。
まだ、累計数日しか触っていないのだがGodotはかなり好印象だ。100点満点なら75~80点ぐらいとったところか。Godotについて、よかったところについて少し書こうと思う。
まず、ゲームエンジンの違いについて軽く説明する。ゲームエンジンは大きく分けると、メインループ系と、非メインループ系がある。メインループ系は、メインループを回したり、Update関数やDraw関数が毎フレーム呼び出されて、そこにロジックを書くのが中心のものだ。Pygameはこのタイプだ。
対して、UnityやGodotは非メインループ系になる。オブジェクトがエージェントのように個別に振る舞い、オブザーバー パターンで疎結合している。オブザーバー パターンを日本語に訳すなら、観測的相互反応といったところだろうか。
この設計の違いは、開発規模に影響する。一人やごく少人数で開発する場合は、メインループ系の方が管理しやすい。しかし、ある程度以上の人数で分業する場合は、非メインループ系の方が作業効率が上がる。Godotは非メインループ系で、Unityの仲間になるのだが、個人的にはUnityよりも好印象だった。
Godotはまず、開発環境が軽い。130MBほどの実行ファイル1つで終わる。ファイルも軽いし、動きも軽快で、起動するごとに面倒な認証もなく、とてもストレスが低い。
また、作成するプロジェクト内のファイルも軽い。Unityでゲームを作るとすぐに1GBを超えるが、Godotはおそらく、同じ内容のゲームを作ると数十MB~百数十MBぐらいで収まると思う。また、内部的な設定ファイルが全て簡単なテキストなので、Gitなどで差分を取れる。
あとは、プロジェクトのツリーやリソース構造もシンプルだ。Unityのように、いったんプレハブにして……みたいな工程がなく、ツリーもシーンも全てノードで、かなり簡素だ。簡素だからといってチープなわけではない。UIコンポーネントはきちんと揃っているので開発効率はよい。
ただ、プログラミング初心者には、少し難しいだろうなと思う部分もある。オブジェクト同士が通知をし合うオブザーバー パターンの部分は、プログラミング初学者には少しハードルが高いと思う。オブジェクト間のデータのやり取りがコードから見えないので直感的ではない。こうした部分は、密結合のメインループ系の方が分かりやすい。
また、コードが大規模になってくると、把握しづらい部分もあるだろうなと感じている。ここは整理を上手くしないと破綻しそうだ。
あとは、情報収集の難しさだ。バージョンが4系になって1年ちょっとで破壊的変更が入っている。そのため検索で情報を得るのは、調査に慣れていない人には大変だろう。また、Unityよりも情報が少ないので変なバグを踏むと解決が難しそうだとも感じる。
とりあえず数日触った感想としては、生産性はよさそうなのでこのまま続けていくつもりである。
さて、もう一つ今回は話題を追加しておく。それは、プログラムの整理についてだ。慣れていない環境でプログラムを作ると、ファイルをどう切り分けて、フォルダー構成をどのようにしていくのか知見がない。ベストプラクティスがどのようなものなのか分からないまま、プログラムを書いていくことになる。
たいていゲームを作るときは、表現したいものが先にあり、開発環境が目的に百パーセント適合していることはまれだ。だから、妥協とすりあわせをしながらゲームを開発していく。人によっては、ゲームエンジンの方向性に沿ったゲームだけを作る場合もあるだろうが、そういうのはまれだろう。ゲームを個人で開発する人は、たいていわがままなので、ゲーム開発環境をねじ伏せていく必要がある。
こうして開発していくと、ある程度進んだところで「ぐわあ、なんか厳しい」と思う瞬間が来る。新しい環境でゲームを作っている場合は、そうしたタイミングで、二度、三度、プログラムを全面的に書き直して最適化を図る。初心者なりにゴールを推測して組み立てていったものの、ルートが違うことを把握して、道をたどり直すわけだ。
私はちょくちょくSNSで「同じものは三回作らないとよくならない」みたいなことを言う。これはこうした経験から来ている。一回目を作る段階で、二、三度作り直す。さらに、二回目を作り、三回目まで作ると、作り直しの工程がなくなる。その状態まで来て初めて、開発環境を理解してきたなと感じる。
つらつらと書いてきたが、Godotについてはまだ「書き散らし」の段階である。目的を実現するコードを書いて、それを整理して先に進むということを繰り返す段階だ。どこかで全面的にプログラムを書き換える必要が生じるだろう。また、ファイル構成も大幅に変える必要があるはずだ。
その作業については、Godotはちょっとサポートが弱いなと感じている。プログラム間のリンクが自動で追随しないようなので、手作業で修正しないといけなさそうだ。
とりあえず今日の時点で、リスト形式のダイアログは作れたので、次はマップ周りを整理していこうと思う。マップについては、データを外部で作成してインポートできる仕組みにしたい。最終的なゲームの表現に合わせて、データ構造や画像ファイルの構成も考えないといけない。
今回作るゲームでは、久し振りに土木の要素も入れたいなと思っている。昔iモードで作ったSRPGでは、橋を建設したりといった土木要素を入れていた。最終的に入れるかどうかは別として、そうした表現を可能にする余地は残しておきたい。
マップの実験が終わったらシーン遷移で、そこが終わるとまたマップに戻り、さらに作り込んでいく予定だ。
おまけ:
いろいろな同人誌や、ゲームを作って公開しています。ぜひ見てください。
最近、ゲームブックも書きました。遊んでください。
https://crocro.com/shop/
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます