年末年始なのでGodotでゲームでも作ってみる 3日目

今日の目標

  • 複数のSceneを使う(Instancingを試す)

GodotにおけるSceneの扱いについて

Godotでは複数のNodeをまとめて一つのSceneとして扱うことができる。Sceneは.tscnファイルとしてプロジェクト内に保存される。そして、Sceneの中では保存されている別のScene(.tscnファイル)を読み込んで、自身のSceneのNodeツリーの中に組み込むことができる。(Instancing)

Godotのゲームでは、Scene(tscn)ファイルを多数用意して、必要に応じて親Scene内でインスタンスを作る(Instancing)というフローが発生するので、まずtscnファイルを作る/親Sceneに子Sceneを追加するというのがどういうことなのかを、コードを書く前に確認しておく。

検証用のプロジェクトの作成

子となるSceneの作成

先に「子」として親SceneにインポートするSceneを作る。いらすとやからダウンロードしてきたハエの画像に、Labelで「HAE」というキャプションをつけたものをHae.tscnというファイル名で保存した。

親となるSceneの作成

次に親となるSceneを作成する。新しいSceneの作成はSceneメニューのNew Sceneから行う。ここでも「2D Scene」を選択して空の2D Sceneを作成した。

子Nodeのインスタンス化(Instancing)

Scene dockにあるチェーンのボタン(Instanc Child Scene)を押すと、他のSceneのインスタンスを取り込むことができる。

先ほど作成したHae.tscnを選んでOpenするとSceneの下にHae.tscnのインスタンスが追加された。

同様の手順で、一つのSceneに複数のHae.tcsnのインスタンスを作っていくことができる。

この状態でHae.tscnに戻ってラベルの中身を書き換えてみる。

保存して親Sceneの方に戻ってみる。

すると親Sceneの方に追加されていたHae.tscnのインスタンスのラベルも全てKANIに書き換わった。Instance Child Sceneを使って他のSceneを追加した場合、その時点でのSceneの内容がそのままコピーされるわけではなく、「実行時に、指定されていたSceneの内容からインスタンス(コピー)が作られる」という挙動になる。

まとめ

無理ないペースで進めようと思ったら、まだコードを一切書いていないのに三日経ってしまった。今年の年末年始休みは短いので間に合うのか不安だが、今日は大晦日なのでゆっくりしたい。

年末年始なのでGodotでゲームでも作ってみる 2日目

初日はサンプルを動かすところまでで力尽きてしまったので、今日はドキュメントを読み進めながら新しいプロジェクトを作るところまで進みたい。

今日の目標

  • Hello worldを目指す

ドキュメントを読む

Godotはドキュメントが充実している。残念ながら日本語の翻訳は追いついていないようだが、少なくとも英語版については分かりやすくてしっかりしたドキュメントが用意されていて、最初の導入はそれを読めばなんとかなりそうだ。

Step by stepガイドには、エディタの説明やGodotに登場する設計・思想の説明が用意されている。Godotのエディタは比較的シンプルで直感的に使えるが、Your first look at Godot’s editorあたりを読んで各UIパーツの名前を覚えておくと、以降ドキュメントなどを読み進めやすくなる。

Scenes and nodesInstancingのページには、シーンやノード、オブジェクトのインスタンス生成などについての説明がある。このあたりの考え方はUnityやSceneKitなどとかなり近しいので、その辺りに触れたことがある人はスキップしても問題ないのではないかと思う。

新しいプロジェクトを作る

このStep by stepのScenes and nodesを読み進めながら、新しいプロジェクトを作ってみる。

Project ManagerのNew Projectから新しいプロジェクトを作る。RendererにはOpenGL ES 3.0とOpenGL ES 2.0のいずれかを選択できる。今回は特に古いデバイスで動かしたいとかブラウザ上で動かしたいというような目的はないので、OpenGL ES 3.0を選んだ。

Sceneを作る

Godotには他のゲームエンジンと同様にSceneという概念がある。一つのゲームの中に「オープニングシーン」「メニューシーン」「バトルシーン」「結果表示シーン」のように複数のSceneを含めることができる。

後で理解すれば良い話だが、Sceneは「複数のNodeから構成されるNode」でSceneの下に別のSceneを読み込んでくっつける、というようなこともできる。Sceneという名前からは少しイメージしにくいがキャラクターやUIなど、グループで管理した方が都合が良いNodeもSceneとして作って利用することができる。

Godotアプリケーションでは、最低一つのScene(メインシーン)を作成する必要があるので、とりあえずシンプルなシーンを一つ作ってそれを実行してみる。

画面左上のScene dockからシーンを追加することができる。明示的に2D Sceneや3D Scene、User Interfaceを作っても良いし、他のNodeからSceneを作ることもできる(SceneはただのNode)。2D Sceneを作ってからそこにNodeを設置した方が分かりやすそうな気もするが、とりあえずドキュメントに従ってLabel nodeをRoot nodeとするSceneを作るため、Other Nodeを選択する。

作成できるNodeの種類がリストアップされる。Label nodeを選択してCreateを実行するとLabel nodeが作られる。

Labelという名前のScene(Node)が作られた。

追加されたLabelにはまだテキストが入力されていないので、InspectorからText欄に適当な文字を入力する。Inspectorでは他にも左寄せ/中央揃え/右寄せといったアラインメントの設定やクリッピング(Textが長くなった場合にLabelのサイズを拡張するのか、元のサイズを維持して表示を省略するのか)などの指定が可能。

テキストを指定したら、実行して表示を確認したい。GodotはScene単位でプログラムを実行する。Sceneを実行する前に、作成したSceneをファイルとして保存する必要がある。Label.tscnというファイル名で保存した。

エディタ右上のPlaytest buttons郡の中に、「Play Scene」というボタンがある。このボタンをクリックすると現在エディタで作業中のSceneを実行して動作確認することができる。

Hello Worldを画面に表示できた。ウィンドウを閉じるか、エディタのPlaytest buttonsにあるStopボタンを押すとプログラムを終了できる。

ちなみに、Play Sceneの代わりにPlayボタンを押すと上記のようなダイアログが表示される。ここでSelect Currentを押すと、現在編集中のSceneがこのアプリケーションのメインシーン(アプリケーション起動時に一番最初に実行されるScene)として設定されることになる。後で、メインシーンを別のSceneに変更したい場合はProject Settingsメニューから設定し直す必要があるので一応頭に入れておく。

なお、Labelを表示するだけのSceneを作る場合はLabelをルートノードにしたSceneを作っても良いが、通常のSceneには複数のNodeが含まれることになる。複数のNodeを追加する場合は最初に2D Sceneをルートノードとして追加して、その下にAdd Child Nodeでノードを追加していけば良い。

イメージの追加

画像を追加する場合は、まずFinderからFileSystem dockにドラッグしてインポートを行う。

FileSystemにインポートされた画像をWorkspaceにドラッグすると、その画像を使ったSpriteノードが作成される。

まとめ

公式ドキュメントに従って、エディタの簡単な使い方とScene / Nodeの追加の仕方を学んだ。もうゲームは半分完成したといっても過言ではないだろう。あとはスクリプトの書き方を学び、作るゲームの内容を考え、素材を用意して実装し、プログラムの書き出しについて学ぶぐらいしか作業は残っていないはずだ。コンディション維持のために今日はこれぐらいにしてストレッチに励もうと思う。

年末年始なのでGodotでゲームでも作ってみる 1日目

特に深い理由はないものの、今年の年末年始は久しぶりにゲームでも作ってみようかという気分になった。Godot Engineというフリーのゲームエンジンが気になっていたので、今回は休みの間気力が続く限りGodot Engineを試してみようと思う。

Godot Engineとは

Godot EngineはiOS / Android / Windows / macOS / HTML5…など様々な環境に対応したゲームを作ることができるゲーム開発環境で、無料で利用することができる。2D/3Dの両方に対応している。登場する概念や設計・思想はUnityやCocos2d、SpriteKitなどといった近年のゲームエンジン/フレームワークのそれに近しく、ドキュメントも充実しているので学習の材料として良さそうだったので、今回これを勉強していくことにした。

今日の目標

  • Godotをインストールする
  • Godotでサンプルプロジェクトを開いて実行してみる

新しいことを始めるときに、全容が見えないうちに高すぎる目標を掲げることは避けたい。初日は環境を構築してサンプルが無事に動いたら上出来ぐらいのテンションで行きたい。

Godotのインストール

公式サイトからGodotの最新版をインストールする。2021年12月29日現在の最新版は3.4.2。

DownloadページからGodotをダウンロードする。独自言語であるGDScriptが使えるStandard版とC#が使えるMono版がある。せっかくなので独自言語であるGDScriptを使うStandard版をインストールした。なおbrew caskを使ってもインストールできるようだ。Zipファイルを解凍して出てきたGodot.appをApplicationsディレクトリに移動するだけでインストールは完了。

起動してみたところ。「プロジェクトが一つもないけど、Asset Libraryにある公式のサンプルでもみてみる?」とのことなので「Open Asset Library」を開いて公式サンプルを見てみようと思う。

Asset LibraryのDemoのリストを見ていると、Skeleton2D DemoというシンプルそうなDemoがあったので、こちらを試してみよう。

詳細画面で「Download」を押すと、Asset Libraryからローカルにプロジェクトがダウンロードされる。

ダウンロードしたデモをインストールする場所を指定する。Project Pathには実在する空のフォルダのパスを指定する。

「Install & Edit」を選ぶと、指定した場所にプロジェクトがインストールされエディタが起動する。

エディタの右上にある「Play」を押すと、プロジェクトを実行して動作を試すことができる。

ゲームが起動した。矢印キーでキャラクターを操作できる。

ゲームを終了してエディタに戻ったら、「Quit to Project List」でプロジェクトを閉じてプロジェクト一覧画面に戻ろう。

プロジェクト一覧画面(Project Manager)に行くと、今開いていたSkeleton2D Demoプロジェクトがリストアップされている。別のデモを試したいときは画面上部のタブを「Asset Library Projects」に切り替えると、そこから先ほどのようにデモを検索してインストールすることができる。

まとめ

インストールはバイナリをzipからコピーするだけ、パスの設定なども不要で躓く点はなかった。サンプルプロジェクトも動いたことだし、今日はここまでにしておいてあとは体調を整えることにでも時間を使いたい。プログラマーはやはり体が資本。少し寒いがランニングにでも行こうと思う。アスファルトの上を走ると膝が痛くなるのが悩みだ。ずっと昔スポーツで膝の半月板を痛めたことの後遺症だと思っていたが、少し前にCTをとってみたらそれが原因ではなく姿勢の悪さ(骨盤の歪み)が原因だと言われた。実際、その後足を組むのをやめて、ストレッチの時間を増やしてから膝の痛みはかなり軽減した。そんなことを思い出した。明日は公式ドキュメントを読みながらプロジェクトを作ってみよう。