» VR開発メモトップへ

Godot Engineメモ

最終更新日:2022年09月16日

オープンソースのゲームエンジンGodotの特徴やTipsをメモしています。

更新履歴

(2022年9月16日)Godot 4ベータ版がリリースされたのを一部反映、「W4 Games社について」を追加
(2022年6月16日)Godot 4へのプロジェクト変換機能について追記
(2022年4月21日)Brotliのオプション指定を削除
(2022年4月8日)Visual Studio CodeのC# Tools for Godot拡張について追記
(2022年4月7日)「パフォーマンス最適化について」を下のほうに移動、RenderDocについて追記


Godotとは

GodotはオープンソースのC++製2D/3Dゲームエンジンです。

もともとは2007年頃から元アルゼンチン在住のJuan Linietsky氏(現在はスペインに移住)とAriel Manzur氏が開発していたインハウスゲームエンジンですが、2014年にMITライセンスでオープンソース化されました。以後、Patreonで支援を募ったりMozillaMicrosoftEpic GamesMeta等から都度開発資金の支援を受けつつアクティブに開発が進められています。

Windows、macOS、Linux、iOS、Android、ブラウザと一通りのプラットフォームにアプリをエクスポートできます。スクリプトは独自言語のGDScriptですが、C#やC++も使用できます。

また、Godotのエディタ自体がGodot Engineで動いているという特徴があり、ブラウザ版エディタのWeb Editorや、Android版のエディタも動作しています。

2022年9月現在、Godot 3.5が安定版で、大きな変更のあるGodot 4がベータ版としてリリースされています。Godot 4の正式版は年内を予定とのことです。

全機能を手っ取り早く把握したい場合、List of featuresを一読するのがおすすめです。

デモプロジェクト集がGitHubのGodot demo projectsにあります。masterブランチはGodot 4向けで、3.4ブランチ等がGodot 3向けです。ブラウザ上で動作するデモを見ることができます。

Godot Engineの名前の由来と読み方について

公式のプレスキットによれば、名前の由来はサミュエル・ベケットのフランス語の戯曲「ゴドーを待ちながら(Waiting for Godot)」で、言語によってGodotの読み方は異なりますが、通常戯曲と同じように発音されるとのことです。「ネイティブの英語話者はゴドー(“GOD-oh”)を推奨」とのことで、日本語でも戯曲通り「ゴドー」でしょうか。

なお、実際にはいろんな読み方をされていたり、創始者のJuan Linietsky氏自身スペイン語読みゴードット(“Go-Dot”)と発音していたりするのですが、裏話として、Godotはもともとただのコードネームだったのが、逆転裁判にゴドーという同名のキャラクターが登場したことで正式名称に決まったそうで、こちらの由来からもやはり「ゴドーエンジン」になりそうです。

W4 Games社について

Godotのメイン開発者のJuan Linietsky氏、Rémi Verschelde氏らがGodotのエコシステムを強化するため(たとえばゲーム専用機のサポート等)にW4 Games社を設立し、2022年9月にシードで850万ドルを調達したとのことです。ちょうどLinuxに対するRedHatのような存在をイメージしているようです。

マスコットキャラ的なものはある?

GodetteないしGodot-chanというキャラクターがあります。エイプリルフールのジョークにもされました。ライセンスはCC-BY 3.0だそうです。

座標系について

3D座標系はY-upの右手座標系です。OpenGLの標準に合わせているとのことです。

Godot was born on Linux+OpenGL and it uses the OpenGL standard (like Maya) and it’s proud of it’s roots.

Zマイナスが前方で、Vector3.FORWARDが(0, 0, -1)になっています。

ビルド(エクスポート)するには

実行ファイル一式を生成する処理をGodotではエクスポートと呼んでいます。

Project > Exportを開いて、Add…でターゲットのプラットフォームを追加します。初回はGodotのバージョンごとに600MBほどのテンプレートファイルをダウンロードする必要があります(赤字でメッセージが出ます)。

テンプレートファイルの正体は、全プラットフォームのビルド済みのGodotエンジンランタイム一式です(Editor > Open Editor Data/Settings Folderを開いてtemplatesフォルダの中を見てみてください)。Godotはこのランタイムにプロジェクトのアーカイブデータを添付して実行ファイル一式を生成するようになっています。エンジン本体に手を入れない限りは重い「ビルド」が必要ないため、イテレーションが非常に高速です。

スクリプト言語について

Godotではいろんな言語を使用できますが、Godot Community Poll 2021によれば81%のユーザーがGDScriptをメインに使っているようです(次点がC#で13.3%)。

GDScript

GDScriptはGodot Engineの独自言語です。拡張子は.gdで、Pythonのようにインデントして記述します。

コーディング環境はGodotにコードエディタが内蔵されているほか、Visual Studio Codeのgodot-tools拡張があります。Visual Studio Codeのほうが高機能ですが、Godotのコードエディタでは再生中に.gdを保存するとホットリロードされて便利です。

GDScriptはバイトコード(.gdc)にコンパイルされパッケージされます。AOTコンパイルやJITコンパイルは現在行われていないため、パフォーマンス的にはC#より一桁遅いようです(optional typingを使用すると若干速くなるようです)。Releaseモードでエクスポートすると実行時のチェックが省略され速くなるようです。バイトコードの暗号化が可能です。

C#

静的型付け言語が好みでパフォーマンスが欲しい場合はC#をとされています。ベータ版のGodot 4では.NET 6に対応しています。

Editor > Editor Settings > Mono > Editorで使用するIDEを選択でき、Visual Studio、Visual Studio Code、Riderに対応しています。

APIはGDScriptのAPIをそのままPascalCaseにした感じになっています。GDScriptの_physics_processがC#では_PhysicsProcess、get_nodeがGetNodeといった感じです。

パフォーマンスについて、「ベンチマークではC#のほうが最大4倍速かったが、Godot本体とのやり取りに高コストなマーシャリングが必要」という記述があります。また、HTML5プラットフォームではC#はMonoのILインタプリタを使用して実行するため速度が遅いようです。

C#を使用すると、依存する.NETのDLL群(System.dll等)とGodotSharp.dllが.pckファイルに含まれ、そのぶんサイズが大きくなります(約30MB)。テンプレートのbcl(Base Class Library)フォルダに事前ビルドされているようです。

プロジェクト内の.csファイルは「プロジェクト名.dll」というファイルにコンパイルされます。

[Export]を変更したときにInspectorに反映させるには、右上のBuildボタンまたはAlt+Bでビルドする必要があります。

GDScriptからC#のコードを呼び出したり、C#からGDScriptのコードを呼び出したりできます(Cross-language scripting)。

GDNativeについて

C++やその他のさまざまな言語を使用したい場合、Unityのネイティブプラグインに相当するGDNativeがあります。GDNative APIを使って、Nodeを拡張するコードをGDScriptのように書くことができるようです。(エンジンビルドと同様)ビルドツールとしてSConsを使用するようです。

GodotでC++を使用する別の方法としてモジュールがあり、モジュール単位で有効・無効にしてエンジン本体と一緒にビルドします。

3Dモデルのインポートについて

glTF、COLLADA、OBJ、FBX等のインポートに対応しています。プロジェクトのフォルダにファイルを置けばインポートされます。

BlenderでglTFをエクスポートする場合、File > Export > glTF 2.0でフォーマットはglTF Separateを選択します。glTF Embeddedや.glbだと.materialファイルが巨大になったり、テクスチャのインポート設定を調整できないようです。

Godotで.gltfファイルが見つかるとダイアログが表示されるのでNew Inheritedを選択して.tscnとして保存します。シーンに直接.glb等を配置すると更新を保存できず"Requested file format unknown"エラーが出ます。

Godot 4では.blendファイルを直接インポートできるようです。

FBXのインポートはGodot独自のインポーターを使用しています。

インポートしたアセットのサイズについて

プロジェクトの.importフォルダにインポートで変換されたファイルが生成されています。エクスポートするとこのファイルがそのまま.pckファイルにパッケージされます。

シェーダーについて

GodotのシェーダーはGLSLをベースにした独自言語で、拡張子は.gdshaderです。GLSLのシェーダーを利用する方法の解説があります。

また、ノードベースのVisualShaderもあります。

Godotで使用できるシェーダーを集めたGodot Shadersというサイトがあります。

ネットワーク対応について

中レベルのレイヤーにENetWebSocketWebRTC(データチャネルのみ)のNetworkedMultiplayerPeerの実装があります。

高レイヤーでは任意のNetworkedMultiplayerPeerを使用してシーンツリーを同期します。

VR対応について

Godot Engine VR開発メモ」を参照してください。

Godot 4について

Godot 4は現在ベータ版がリリースされています。Godot 3からの破壊的変更が多数あります。下記ページに新機能がまとめられています。

Godot 4ではノード名やAPIが多数変更になります。2Dのノードと3Dのノードを区別しやすいように3Dのノードにはサフィックス3Dがつきます。Godot 4.0 alpha 10Godot 3のプロジェクトをGodot 4に変換する機能が追加されました。--convert-3to4オプションで動かすようです。

物理シミュレーションについて、Godot 3ではBulletを使用していますが、Godot 4では新エンジンのGodot Physicsがデフォルトになるとのことです。

リアルタイム大域照明のSDFGIが使えるようになります。Linietsky氏がUE5のLumenとの比較ツイートをしています。シーンにWorldEnvironmentノードを追加して、Sdfgi > Enabledをチェックすると有効になります(Godot 4.0 alpha 5ではSDFGIはVRではまだ動かないようです)。

Godot 4のグラフィックスAPIはVulkanとGLES3に集約されるようです。PCはGLES3、ウェブもSafariがWebGL2に対応したのでGLES3で大丈夫、iOSとmacOSではANGLEを使用、GLES2のサポートは一応2Dゲーム向けに残されるかもとのことです。

Godot 4ではWebGLサポートに必要なproduction-readyなOpenGLレンダラーがまだないためHTML5のテンプレートが含まれていないとのことです。

Godot 4は.NET 6に対応しています。

GDScriptにasync/awaitが追加されています。

Godot 4でProject Settingsの項目が少ない

Project Settingsを開いて右上のAdvanced Settingsを有効にすると表示項目が増えます。

アンチエイリアスを有効にする方法がなかなか分からずはまりました(Advanced Settingsを有効にするとRendering > Anti Aliasingが出てきます)。

プロジェクトをGitでバージョン管理するには

Version Control Systemsのページに.gitignoreするフォルダ・ファイルが書かれています。

Godot 4では新規プロジェクト作成時にそのままCreate & Editすると.gitignoreが生成されるので(.godotフォルダがignoreされています)そのままgit initすればオーケーです。

プラットフォームごとのメモ

HTML5

iOS Safariで頻繁にクラッシュするというissueが立っており、モバイルブラウザでの安定動作については要確認です。

ランタイムの出力サイズ

Godot 3のWebAssemblyランタイムのReleaseモードのサイズはGDScript版で約17MBありますが、Brotliで圧縮すると約4MBになります(Brotli v1.0.4あたりでbrotli HelloGodot.wasm等で圧縮して、ウェブサーバーで圧縮配信します)。これにローダーのJavaScript(圧縮前0.4MBほど)と.pckを加えたサイズが配信サイズになります。

C#を使用すると.pckに.NETのライブラリ群が含まれ、圧縮前17MB強、Brotli圧縮して約5MBになります。ランタイムのWASMとあわせると約9MBからになってしまいますので、配信サイズを小さくしたい場合はGDScriptのみを使用するのがよさそうです。

テクスチャフォーマット

Project > ExportのHTML5プラットフォームのVram Texture Compressionで、デスクトップとモバイル(iPhone・Android)それぞれ対象となるプラットフォームのスイッチをオンにする必要があります(それぞれオンにしないとテクスチャが表示されません)。

For DesktopがオンだとS3TC圧縮テクスチャ(.s3tc.stexファイル)が、For MobileがオンだとETC圧縮テクスチャ(.etc.stexファイル)が.pckに格納されます。両方オンにするとPCとiPhone・Android両対応になりますが、出力サイズが増えます。

C#の実行速度についての注意

現在HTML5プラットフォームではC#はMonoのILインタプリタを使用して実行されるため速度が遅いようです。

iOS

エクスポートするには、Exportウィンドウに警告が表示されている通り、App Store Team ID、Identifier、Required Iconsの設定が必要です。少なくとも120x120、76x76、1024x1024の3種類の画像ファイルを用意する必要があります。

“Failed to export the project for platform ‘iOS’“のエラーダイアログが表示される場合は、Godotエディタ本体のOutputウィンドウにエラー詳細が表示されています(上記のアイコンの解像度違い等で発生します)。

Android

Androidビルドをするにはビルドのためのセットアップが必要です。Exporting for Androidの指示に従ってAndroid StudioおよびSDK・ツール一式、OpenJDKをインストールし、署名ファイルを作成してパス設定をします。

以下、はまったことの補足です。

SDKのインストールについて(Windows)

上記ページではsdkmanagerを使用して必要なSDK・ツール一式をインストールする方法が紹介されています。Android Studioをデフォルトでインストールすると、sdkmanager.batはC:\Users{ユーザー名}\AppData\Local\Android\Sdk\tools\binに格納されています。

このsdkmanager.batですが、AdoptOpenJDKを使用して実行すると

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

のようなエラーが出ます。以下のようにAndroid Studioに同梱されているOpenJDKを使用すると上手くいきます。

set JAVA_HOME=C:\Program Files\Android\Android Studio\jre
sdkmanager.bat --sdk_root=C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\tools\bin ...

署名について

Godot 3.3からjarの署名にjarsignerではなくapksignerを使用するように変更されています。adbとjarsignerのパス設定が残っていますがすでに使用されていません(3.4で消えるらしい?)。

古いバージョンのAndroid SDK Build-Toolsがインストールされていると署名に失敗することがありました。下記のようなエラーで実機へのインストールに失敗します。

Could not install to device: adb: failed to install
...
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl1028936773.tmp/base.apk: Attempt to get length of null array

Android StudioのSDK管理画面で右下のShow Package DetailsをチェックしてExporting for Androidで指定されているものより前のバージョンをすべてアンインストールすると解決しました。

開発効率化のための機能

Debug > Deploy with Remote Debugをオンにしてウィンドウ右上の実行ボタンを押すと、動作中の実機のシーンをエディタで操作できます。

Debug > Small Deploy with Network Filesystemをオンにすると、実行ボタンでアセットを全部転送せずUSB経由で読み込みが行われるようです(Androidのみ)。アセットが多いプロジェクトのテストに便利なようです。

パフォーマンス最適化について

場所がちょっと分かりにくいですが、コードエディタの下のDebuggerタブを選択して上のProfilerタブを選択するとプロファイラが使用できます。スクリプトや物理シミュレーションの実行時間等を確認できます。

ビューポート左上のPerspective > View FPSをオンにするとフレームレートが、View Informationをオンにするとドローコールや頂点数等を確認できます。

GPUのプロファイリングについて、Windowsエクスポートした実行ファイルについてRenderDocが使用できるのを確認しています。RenderDocのLaunch ApplicationタブのExecutable Pathに実行ファイルのパスを入力してLaunchします。Vulkanの設定をする必要があります。Event Browserの時計のアイコンで実行時間が表示されます。

Godot 3でGLES 2だと下記エラーが出ます。GLES 3、またはGodot 4のVulkanだとRenderDocが使用できます。

OpenGL. Context not created via CreateContextAttribs. Capturing disabled.
Only OpenGL 3.2+ contexts are supported.

Godotのエンジンビルドをするには

Godotのエンジンの設定を変えてビルドする必要がある場合があります。使用しないモジュールを無効にしてサイズを減らしたりできます。

下記ページに説明があります。

WindowsではC++ビルドができるVisual Studio 2019とPython 3.5以上があればビルドできます。ビルドシステムにSConsを使用しているのでインストールし、GitHubからクローンしたプロジェクトをビルドします。

$ git clone https://github.com/godotengine/godot.git
$ python -m pip install scons
$ scons -j[使用コア数] platform=windows

しばらく待つと(うちのRyzen 9 5950X機で3分ほどでした)binフォルダに実行ファイルができます。また、

$ scons p=windows vsproj=yes

でVisual Studioのソリューションを作成して、Visual Studio上でデバッグ実行できます。

リリースビルドはtarget=release_debugを、テンプレート(エディタのないGodotエンジン)をビルドするにはtools=noを設定するようです。その他、詳細や各プラットフォームのビルドは公式ドキュメントを参照してください。

Tips

コーディングスタイルについて

Project organizationのページにプロジェクトの構造のガイドラインがあります。

  • フォルダやファイル名はsnake_caseで(C#スクリプトを除く)。models、characters、levelsといった名前のフォルダが例示されています。
  • ノード名はPascalCase

再生中にシーンツリーを見るには

SceneドックでLocalタブからRemoteタブに切り替えます。Editor Settings > DebuggerのAuto Switch To Remote Scene Treeをオンにすると自動的にRemoteになります。

ユーザーの入力を処理するには

Project > Project Settingsを開いて、上のInput MapタブでActionとそれに対応するキーボードやジョイスティック等の操作を登録します。GDScriptで以下の要領で入力を処理できます。

if Input.is_action_pressed("{アクション名}"):

シーンの環境を設定するには

環境光・スカイボックス・ポストエフェクトを使用するには、シーンにWorldEnvironmentノードを追加します。ビューポート左上のPerspectiveメニューのView Environmentをオンにするとビューポートの表示に反映されます。

スカイボックスを設定するには、下記の要領でHDR画像等を設定します。

WorldEnvironmentノードの設定は、Camera3DノードのEnvironmentを設定すると上書きできます。

日本語を表示するには

フォントファイル(.ttf/.otf/.woff)を使用して表示できます。ノードのFontにDynamicFontを設定して開き、Font Dataのところでフォントファイルをロードします。

LineEdit等で日本語フォントを指定すれば日本語入力もできるようです。

動画を再生するには

VideoPlayerコントロールを使用してWebM(.webm)、Ogg Theora(.ogv)の再生ができるようです。HTML5ではパフォーマンスの問題があるとのことです。H.264は2027年まで特許で使えないようです。

マルチプレイヤーの動作チェックについて

(Godot 4)Debug > Run Multiple Instancesを変更すると最大4つまでのインスタンスを同時に実行できます。

ゲームをポーズしたい

Sceneの階層の特定のNodeのみ動作を停止させることができます(Pausing games)。また、InspectorでPauseのModeを設定すると、親のNodeをポーズしても止まらないようにできます。

プロジェクトを整理するには

Project > Tools > Orphan Resource Explorerでリソースの参照数が確認できるので利用できそう?

CIを構築したい

CLIでコマンドラインからエクスポート等ができます。

InspectorのTransformがいつも折りたたまれている

Editor SettingsのInterface > Inspector > Disable Foldingをオンにすると常時展開になります。

PCKファイルについて

.pckファイルはGodot独自のパッケージ形式です。エクスポート時にプロジェクトをアーカイブして添付されるほか、実行時に読み込むこともできます(ProjectSettings.load_resource_pack()を使用)。プロジェクトのファイルを置き換えることができるので、DLCやパッチの配布に使用できます。

.pckファイルはgodotdecGodot RE Toolsを使うと中を見ることができます。

テクスチャのインポート設定について

こちらのエントリが参考になりそうです。

ASTCは圧縮(インポート)が遅いため対応しない方針?

.s3tcファイルはUnityのDXT1からDXT5に相当?

カメラアングルを簡単に調整するには

ビューポートでマウスの右ボタンを押しながらWASD/QEキーで視点を調整し、Cameraノードを選択して、ビューポート左上のPerspectiveメニューからAlign Transform with Viewを実行(またはCtrl+Alt+Mキー)すると簡単です。

プラットフォームの判定をするには

OS.has_feature("Android")

エクスポートサイズを小さくする方法

Export PCK/Zipでzipファイルとして出力して、含まれているファイルおよびファイルサイズを確認すると便利です。

また、エクスポート設定のResourcesタブで使用するシーンだけ選択すると、選択したシーンで使用されているソースのみパッケージされ省サイズになります。

ウィンドウの背景を透過させるには

(Godot 3)Project SettingsのDisplay > WindowでPer Pixel TransparencyのAllowedとEnabledをオンにして、以下を呼びます。

get_tree().get_root().set_transparent_background(true)

さらにBorderlessをオンにするとウィンドウ枠を消せます。

コンソールウィンドウについて

WindowsでGodot 3のエディタを起動するとコンソールウィンドウが一緒に表示されます。Editor > Editor Settings…のInterface > Editor > Hide Console Windowをオンにすると起動後すぐ閉じるようになります。

macOSではデフォルトでコンソールウィンドウが表示されません。表示するには、GodotをShow Package Contentsで開いてContents/MacOS/Godotを実行します。

Unityのあれはどこにあるの?

Unityからの移行ガイドページがありました。

  • GameObjectに相当するものはNodeです。
  • Updateに相当するのが_process、FixedUpdateに相当するのが_physics_processです。Project Settings > Physics > CommonのPhysics Ticks Per Secondで物理シミュレーションのフレームレートを設定できます。補間を有効にするにはGodot 3.5以降でPhysics Interpolationを使用します。
  • UnityのPrefabの代わりに、GodotではSceneの中にSceneを追加できます。Sceneドックで右クリック > Instantiate Child Sceneです。子シーンのインスタンスに変更を加えるには、子シーンを右クリックしてEditable Childrenをオンにします。ノードを右クリックしてSave Branch as Sceneでツリーからシーンを作れます(Unityのプレハブ化に相当)。
  • Unityの[SerializeField]にほぼ相当するものは@export(GDScript)または[Export](C#)になります。
  • Tweenが標準で組み込まれています(Godot 4.0でTweenを試してみる)。
  • DontDestroyOnLoadの代わりに、Project SettingsのAutoLoadタブにSceneおよびNodeを登録すると、どのSceneからでもアクセスできます(Singletons)。
  • VR機能がエンジン本体に組み込まれています。UnityのXR Interaction Toolkitに相当するGodot XR Toolsアドオンがあります。
  • Unityのネイティブプラグインに相当するGDNativeがあります。
  • Terrainはありませんが、HeightMap terrain pluginというアドオンがあります。

便利なショートカットキー

  • Fキーで選択しているオブジェクトにフォーカスします。ビューポートがSelect Modeになっていて、マウスカーソルがビューポートの中にある必要があります。
  • Page Downでオブジェクトを接地させられます(Unreal EngineのEndキーに相当)。

以下φ(..)メモメモ中

書いた人:こりん(@korinVR
» VR開発メモトップへ