見出し画像

GDExtensionシンプルに環境構築するよ Pt.1

GodotエンジンのGDExtenstionの環境構築に関する記事です。

GDExtenstion試してみてます。数日色々やってみて、ようやくGodotのプロジェクトにエラー無く認識されるビルドが通りました。サンプルコードのビルドが通っただけなのでここからが本番なんですけど、忘れないうちに、気づきや理解をこの記事に書いていこうと思います。

【スペック】
・Godot 4.1
・Windows10/11でWindows10/11アプリ向けのdllを作る

【方針】
・ストレージ容量をできるだけ使わない
・パソコンをクリーンに保つ
 →直置き可能なツールはできるだけインストールせずに使う
 →環境変数等の設定も最小限にとどめる

普段からお仕事などでプログラムたくさん書く人にとっては、公式ドキュメントに書いてある内容や、Youtubeの解説動画だけで、環境構築するには十分な情報が得られると思うのです。
でも筆者にはわからんことだらけでした。SCons??? MinGW???
WindowsでVisual StudioやUnityを使って自作ゲーム作ってる、くらいの頻度でプログラム触ってる人向けの情報が、ネットに必要だと思いました。そこでこの記事を書く次第です。


GDExtension

GDExtensionは、Godot Game Enginで、スクリプトからネイティブコード(のDLL)を呼ぶための機能です。
単にゲーム作る分には不要なんですけど、Steamでリリースしたり、XInput経由でコントローラを振動させたりしたいときは、必要になると思います。また、C++で書いたコードでパフォーマンスを上げたいときにも、この機能が使えるのではないでしょうか。

この機能は、プラグイン(addons)とは別ものです。
・プラグイン自体は、GDScriptだけでも作れるはずです。
・また、プラグインを経由せずとも、GDExtensionは使えます。
・でもGDExtensionを使ったプラグインも存在するみたいです。

使い方

・.gdextension拡張子のテキストファイル
・呼び出したいDLL
この2つを、Godotプロジェクトに放り込みます。公式ドキュメント等では"bin"フォルダ下に置くように書いてありますが、おそらくそれは慣習で、必須ではないです。また、.gdextensionファイルとDLLは同じフォルダじゃなくてもいいです。
.gdextensionファイルの中には、「"res://フォルダ名/DLL名.dll"というdllを読み込んでね」という旨の宣言を書いておきます。
すると自動的にプロジェクトに取り込まれて、dll内で定義された自作GDクラスが使えるようになります。

gdextensionファイルを置く
Godotエディタ上で認識される

DLLの作り方

で、このDLLですけど、自分で勝手に作ったdllファイルを使えるわけではありません。ましてや第三者の提供してるdllも呼べません。先に「自作GDクラスが使えるように」なると書いた通り、GDScriptから使うためには、GDのいちクラスとしてGodotに登録する、特殊な処理が必要になるわけです。

godot-cpp

この特殊な処理を提供するのが、GitHubにある、godotengine/godot-cppです。これはビルドされたバイナリは(多分)存在しません。あくまで自分のC++コードからincludeして使うための、cpp/hppファイル群です。

GDクラス情報を渡す処理を提供

じゃあこれをいつものVSを使って、いつも通りにプロジェクトに組み込んで、dllをビルドすればいいのかというと、どうもそうではないようです。ビルド環境(Windows、Linux、Mac、etc)とビルドターゲット(PC、スマホ)に合わせていろいろと複雑な手続きが必要なんだと思います。他にもいろいろ事情があるんでしょうけど、想像もつかん・・・。
で、その複雑な手続きをやってくれるのが、SConsというツールです。なのでVisual StudioのGUIからF5キー押してビルド実行はしません。SConsがコンパイラを呼びます。

SConsが適切にビルドする

SCons

SConsは、ビルドツールです。makeの21世紀版みたいなものだと理解してます。Pythonを使って複雑なビルド処理を書けます。プログラマブルシェーダーならぬ、プログラマブルビルダーといった趣です。

このSconsに処理してもらうPythonスクリプトが、"SConstruct"(拡張子無し)という名前のファイルです。たぶんこの名前じゃなくてもいいでしょうけど、処理ファイルを指定しないときのデフォルト名がこれなんです。

ちょっと待って! Python書かなきゃいけないの!?

大丈夫です。Python処理のほとんどは、先のgodot-cppに含まれてるPythonファイル(.py)がやってくれます。自分のSConstructからは、これを呼ぶだけです。呼ぶコードのテンプレもありますので、穴埋めで行けます。

ややこしいけど
godot-cppで呼ばれるスクリプトもまた"SConstruct"という名前

SconsをWindows上で実行すると、godot-cppの用意したスクリプトは、コンパイラとして次の2つを使おうとします。
・MSVC (2017 or 2019)
・MinGW
この記事ではVCではなくMinGWを採用します。ストレージ容量の消費が小さくて済みそうなのと、シンプルそうだからです。MinGWのMinはミニマリストのMinだそうです。ぴったり。

MinGW

MinGWはコンパイラ、リンカ、標準ライブラリを含めた、プログラムツールです。VSの同族(ただしGUIが付かない)だと理解してます。
これもGitHubからダウンロードできます。インストールは不要です。

Python実行環境

SConsは自分だけではPyhonスクリプトを実行できません。Pyhonの実行環境が別に必要です。.NET環境みたいな感じです。BlenderのPythonスクリプトはそういうの無くても動きますけど、Blenderの場合はpython310.dllというファイルが付属しているので、これで動いているのでしょう。SConsの場合は共通ランタイムとして必要ということです。

Python.orgの公式サイトからダウンロードできます。これも、ちょっとひと手間あればインストール不要です。インストーラーもあります。

実はSConsの導入にも、このPython実行環境が必要です。他の方法もあるんでしょうけど、Python経由が推奨されてます。
どういうことかというとPyPI(Python Package Index)という仕組みを使います。Wikipediaでは「包括的なカタログ」と称されてます。Python公式のアプリストアみたいなものだと理解しています。
Pythonスクリプトを使って、PyPIからSConsをダウンロードします。

全体像

ビルド環境の全体像は下図のような感じかなと思ってます。

GDExtensionビルド環境(Windows & MinGW)

では、それぞれのツールをどうインストールして、どうセットアップするのかというと・・・

つづく



この記事が気に入ったらサポートをしてみませんか?