⚙️

【Godot Engine】カスタムテンプレートを作成する方法

2023/10/25に公開

Windows 11
Godot Engine 4.x

カスタムテンプレートを作成するメリット

カスタムテンプレートを作成すると以下のようなメリットがあります。

  1. バイナリサイズを最適化できる
  2. 一部のライセンス表記を省略できる
  3. PCKファイルを暗号化できる

Windows用カスタムテンプレートを作成する

カスタムテンプレートを作成するということは「Godot Engineからエディタの機能を抜いてソースコードからビルドする」ということになります。
公式エクスポートテンプレートは.tpzという形式ですが実体はzipファイルであり、各プラットフォーム向けのカスタムテンプレート(.exe, .apk, .zipなど)が含まれています。これをエディタからインストールすることでエクスポート可能になるのでした。

Godot EngineをWindows用にビルドするには以下のものが必要です。
当環境は以下のバージョンですが最新版でも問題無いと思われます。

  1. Visual Studio Community 2022
  2. Python 3.11
  3. SCons 4.5.2

※Visual StudioとPythonのインストール方法は割愛しますが
・Visual Studioインストール時に「C++によるデスクトップ開発」にチェックすること
・Pythonのインストール時に「Add python.exe to PATH」にチェックをすること
を忘れないでください。とても重要です。

2つともインストールが完了しましたら、SConsをインストールします。
コマンドプロンプトから次のコマンドを実行します。

cmd
pip install SCons

インストールが完了しましたら、scons -vと入力してバージョンが表示されることを確認してください。

次にGodot Engineのソースコードを入手します。
git cloneでも入手できますが、今回はzipファイルをダウンロードします。
ソースコードはこちらから入手できます。
https://github.com/godotengine/godot/tags

この記事では公式ドキュメントの解説にならって展開後のフォルダ名はgodotとしてCドライブ直下にあるものとします。

C:\godotでコマンドプロンプトを起動してください。
次のコマンドでGodot Engineをビルドします。

cmd
C:\godot>scons platform=windows target=template_release arch=x86_64

ビルドが完了するまで待ちます。
完了するとC:\godot\bin
godot.windows.template_release.x86_64.exeというファイルが生成されます。
これがカスタムテンプレートです。

あとは任意のプロジェクトでエクスポート時のオプションからカスタムテンプレートに先ほどのものを指定し、エクスポートできることを確認してください。
※ここでビルドしたものはリリース用のカスタムテンプレートですので「デバッグ付きエクスポート」のチェックを外してください。

基本的なビルド方法は以上になります。とりあえずここまでお疲れ様でした。
ここからは応用編です。

バイナリサイズを最適化する

custom.pyに指定する方法

Godot Engineにはいろいろな機能があります。
しかし2Dゲームでは3Dの機能が不要であるように、ゲームによっては一部の機能が不要になるでしょう。
それらを無効にすることでバイナリサイズの最適化が見込めます。

特定の機能を無効にする場合、ビルド時のオプションでdisable_3d=yesのように指定すればOKですが、それだと面倒ですね。

ここではcustom.pyというファイルにオプションをまとめて指定する方法で行います。
オプションの生成にはこちらのツールがとても便利です。
https://godot-build-options-generator.github.io/
チェックボックスから無効にしたい機能を選択してオプションを生成できます。

何を無効にすべきか?ということについてですが、公式ドキュメントの方で効率の良い最適化方法が解説されているのでぜひ参考にしてみてください。
https://docs.godotengine.org/en/stable/contributing/development/compiling/optimizing_for_size.html

生成したオプションはcustom.pyとしてC:\godotに保存します。
あとは先ほどと同じようにビルドすればOKです。custom.pyのオプションが参照されて無効にしたものはビルドされなくなります。

buildファイルに指定する方法

他の方法としてbuildファイルを指定する方法もあります。
まず任意のプロジェクトで「プロジェクト」->「ビルド構成プロファイルの編集」->「プロジェクトから検出」で使用していない機能のチェックを自動的に外し、プロファイル(ここではtest.build)をC:\godotに保存します。

そしたらビルド時のオプションでtest.buildを指定してビルドします。

cmd.exe
C:\godot>scons platform=windows target=template_release arch=x86_64 build_profile="test.build"

このカスタムテンプレートでゲームをエクスポートし、動作を確認してください。
私のケースではこの方法で約17%サイズを削減できました。

ちなみに気になったのでcustom.pydisable_3d = "no"と「3Dを無効にしない」ようにし、buildプロファイルで3Dエンジンを「無効」にしてみました。buildプロファイルを覗いてみると
"disable_3d": trueとなっています。
これでビルドした結果バイナリサイズが削減されていたのでどうやらbuildプロファイルが優先されるようです。

一部のライセンス表記を省略する

Godot Engineで開発したゲームをリリースするときにはライセンス表記が必要です。

Godot自体のライセンス表記については

  • Godot Engineを使用して作られたこと
  • ライセンステキスト、あるいは https://godotengine.org/license へのリンク

の記載があればOKのようです。

しかし公式ドキュメントによるとGodot Engineが使用している一部のサードパーティライブラリはライセンス表記が別途必要であると書かれています。

該当するものは以下の3つです。

  1. FreeType ... フォントのレンダリングに必要
  2. mbedTLS ... ネットワーク関係
  3. ENet ... ネットワーク関係

Free Typeはほとんどのゲームで使用することになるでしょう。
mbedTLSとENetはオフラインゲームでは使わないでしょう。

しかし公式エクスポートテンプレートを使用している場合は全ての機能が有効なのでライセンス表記が必要とのことです。
なので自前でカスタムテンプレートをビルドして使ってないものを無効にしてライセンス表記を減らすことができます。

つまりcustom.pyに以下のオプションを指定してビルドすればOKです。

custom.py
# Generated using https://godot-build-options-generator.github.io

module_enet_enabled = "no"
module_freetype_enabled = "no" 
module_mbedtls_enabled = "no"

※Free Typeに関してはほとんどのゲームで必要だと思うので有効にすることをおすすめします。

私の調べた限りだとFree TypeとENetは独自ライセンスのためライセンス表記が必要になるそうですが、mbedTLSはApache License 2.0です。Godotが使用するサードパーティライブラリの中にApache License 2.0のものは他にも含まれていますが、なぜこれだけ別途表記が必要なのかは分からなかったです...
Godot forumsではライセンス表記に関して質問が上がっているので興味ある方は読んでみてください。Godotのライセンスのリンクにサードパーティライブラリへのリンクもあるので結局それ一つで要件が満たせるのでは…という意見もあるようです。

PCKファイルを暗号化する

PCKファイルにはゲームに使われた素材などが含まれています。
しかしPCKからファイルを抽出する外部ツールもあるようです。
ここではデータをコピーから(可能な限り)防ぐためにPCKファイルを暗号化する方法を解説します。

まずは256bitのキーを生成します。
コマンドプロンプトからpythonと入力します

cmd
C:\godot>python

次のコードでセキュアな鍵を生成します。

python
>>> import secrets
>>> print(f"{secrets.randbits(256):x}")
125d6150c3ce1897af...7fb83b6a31cf900
>>> exit()

コマンドプロンプトから次のコマンドを入力して環境変数にキーをセットします。

cmd.exe
C:\godot>set SCRIPT_AES256_ENCRYPTION_KEY=125d6150c3...31cf900

後は先ほどと同じようにカスタムテンプレートをビルドします。

次に、エクスポート時のオプションで「暗号化」のタブから「エクスポートされたPCKの暗号化」と「暗号化インデックス(ファイル名と情報)」をオンにします。

「ファイル/フォルダーを含めるためのフィルタ」で暗号化するものを指定します。
デフォルトでは何も暗号化されません。*.*と指定すれば全てのファイルが暗号化されます。

「暗号化キー」に先ほど生成したキーをセットし、先ほどビルドしたカスタムテンプレートでゲームをエクスポートします。
エラーが出ることなく起動できることを確認してください。

暗号化されていないPCKファイルと暗号化されたPCKファイルをバイナリエディタやテキストエディタで開いて比較してみるとわかりますが、前者はソースコードやファイル名がチラホラ見受けられるのに対して後者は見当たりませんね。

ただ、データをコピーから保護する完璧な方法はありません。
暗号化を行うことでコピーまでの時間稼ぎはできますが、キー自体も結局はバイナリに含まれます。発見しにくいように工夫がされているようなのである程度時間は稼げるかもしれませんが、鍵を総当たりで探す必要がある訳ではないので、現実的な時間での解析は可能であることは念頭に置いといたほうがいいでしょう。

参考:
https://godot.community/topic/35/protecting-your-godot-project-from-decompilation

Web用カスタムテンプレートを作成する

※PythonとSConsのインストールは済ませておいてください。
Windows用にビルドしたときと同様Godot EngineのソースコードはCドライブ直下にあるものと仮定します。

Web用にビルドするにはEmscriptenが必要になります。
これはC/C++からWebAssemblyにコンパイルするために必要です。

主な流れは
https://docs.godotengine.org/en/stable/contributing/development/compiling/compiling_for_web.html
https://emscripten.org/docs/getting_started/downloads.html
を参考にしていますのでこちらも必要に応じて参照してください。

Emscriptenのインストールと有効化

以下のリンクから Code -> Download ZIP をクリックして入手します。
https://github.com/emscripten-core/emsdk
展開後のフォルダ名はemsdkとしてCドライブ直下にあるものと仮定します。

以下のコマンドで最新版のemsdkをインストール&有効化します。

cmd
C:\emsdk>emsdk.bat install latest
C:\emsdk>emsdk.bat activate latest

インストール済みのバージョンはemsdk listで確認できます。
バージョンを指定してインストールすることもできます。

cmd
C:\emsdk>emsdk list
C:\emsdk>emsdk.bat install 3.1.39

次にパスを通します。
その後C:\godotに移動してplatformsにwebが含まれていることを確認します。

cmd
C:\emsdk>emsdk_env.bat
Setting up EMSDK environment ...
...

C:\emsdk>cd C:\godot
C:\godot>scons platform=list
scons: Reading SConscript files ...
The following platforms are available:

        web
        windows

Please run SCons again and select a valid platform: platform=<string>

emsdk_env.batを実行後にコマンドプロンプトを閉じるとパスが消えるためplatformsにwebが含まれません。ビルド直前にemsdk_env.batをコマンドプロンプトから実行してください。

次のコマンドでWeb用のカスタムテンプレートをビルドします。
セキュリティ上の理由からeval()は無効にします。

C:\godot>scons platform=web target=template_release javascript_eval=no

ビルドが完了するとC:\godot\bin
godot.web.template_release.wasm32.zipというファイルが生成されます。
これがカスタムテンプレートです。

後はこのカスタムテンプレートで任意のプロジェクトをHTML5用にエクスポートし、ローカルで動作することを確認します。
※ここでビルドしたものはリリース用のカスタムテンプレートです。「デバッグ付きエクスポート」のチェックを外してエクスポートしてください。

ローカルで動作確認する

次のスクリプトでローカルサーバーを建てます。

server.py
from http import server

class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler):
        def end_headers(self):
                self.send_my_headers()
                server.SimpleHTTPRequestHandler.end_headers(self)

        def send_my_headers(self):
                self.send_header("Access-Control-Allow-Origin", "*")
                self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
                self.send_header("Cross-Origin-Opener-Policy", "same-origin")

if __name__ == '__main__':
        server.test(HandlerClass=MyHTTPRequestHandler)

このスクリプトをエクスポートしたプロジェクト内にserver.pyとして保存します。
そこでコマンドプロンプトを起動してpython server.pyと入力し実行します。
ブラウザのアドレスバーにlocalhost:8000と入力してアクセスすればフォルダ内のファイルが表示されるので*.htmlを実行し、動作することを確認します。
ゲーム配布時にserver.pyは含めないようにしましょう。

参考:
https://www.reddit.com/r/godot/comments/15ffl37/how_to_play_a_godot_4_html_project_locally/

脚注
  1. https://github.com/godotengine/godot/issues/72893#issuecomment-1588522725 ↩︎

Discussion