🎮

Unreal Engine5 お勉強(1)

2023/09/27に公開

Unity が色々と荒れていますね。

私の様な雑魚には何も関係ないのですが、これはいい機会だと Unreal Engine5 に入門してみることにしました。

何せ Unity は C# という非常に難しい言語を用いますが、Unreal Engine(UE)なら初心者でも簡単な C++17 で書けるというのが良いですね。

なお、UE のブループリントは私には難しすぎて挫折しました。マジで理解できません……。

プロジェクトの作成

とりあえず、適当に C++ プロジェクトを作成しました。

Git の有効化

プロジェクトが開いたら、とりあえずは Git 管理をします。

右下にある「リビジョンコントロール」という文字から設定 & 初期化できるようです。まだ Git はβ版のようですが。

で、Git の実行パスを指定しないとだめです(PATHから持ってきてよ)。そして、私は Scoop で Git をインストールしてるので、それを指定したのですが、なぜか有効化できませんでした。

嫌々ながら試しに Git for Windows をインストール[1]してみたらいけました。

今時インストーラで Git いれさせる?普通、そんなことさせないと思うんだけどなぁ。Git はβ版だから仕方がないのかな。

それとも WinGet なら大丈夫だったのだろうか? WinGet は使ってないんですよね。

VSCode の設定

C++ の開発は Visual Studio を使うのがシンプルだと思います。

が、Emacs キーバインド使いには Visual Studio は魔界です。辛すぎます。Visual Studio はデバッグだけにしたい……。

というわけで、意地でも VSCode でやります。(CLion も試したけど、 Unreal Engine の全てを解析しだして、まともに動かなかった。)

Unreal Engine 用に VS コードをセットアップする に従ってセットアップ。ただし、include 設定の説明バグっているので飛ばして、「作業中の c_cpp_properties.json のファイル例です。」と書いてある部分からコピペしてください。defines もついでにコピッておけばいいです。

それと、私は普段 VSCode で C++ 開発するのに CMake Tools を入れているのですが、こいつが居るとどうも邪魔なので、UE のワークスペースでは切った方が良いです。

ついでに UE4 用のスニペットがあったので入れておきます。(私は UE 5.3 でやっていますが使えました)

普段は要らないので無効にしておいて、 UE のワークスペースでだけ有効にする形ですね。

また、私は普段 MSYS の Bash をデフォルトのターミナルにしているのですが、デバッガの起動が出来ないので pwsh などに変更しておきます。

Hello World!

Unity で言う Scene は、UE では Level になるようです。

Level が開始した、終了したというイベントフックをかけるには、とりあえず Level に設定する GameMode を作成して、 BeginPlayEndPlay をオーバーライドすればいいようです。
ThirdPersonプロジェクトは作った時から GameMode が指定されているので、それをそのまま利用します。

protected:
  virtual void BeginPlay() override;
  virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

override かぁ。 VSCode は補完してくれないから正直しんどい……。ラムダ式なら auto で行けるんだけどなー。

そして実装は以下。謎の Super:: というのがあるけど、これは GENERATED_BODY マクロで展開される中で typedef AGameModeBase Super と定義される模様です。
これはUEが自動生成するヘッダから引っ張ってきてるみたいで、基底クラスの変更に強くなって良いですね。

void ACpp_TagGameMode::BeginPlay()
{
  Super::BeginPlay();
  UE_LOG(LogTemp, Log, TEXT("Hello World!"));
  GEngine->AddOnScreenDebugMessage(0, 1.f, FColor::Red, FString::Printf(TEXT("Hello World!")));
}

void ACpp_TagGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
  Super::EndPlay(EndPlayReason);
  UE_LOG(LogTemp, Log, TEXT("EndPlay!"));
}

Unreal Engine Editor 上で実行

UE を起動してると VSCode 側からコンパイルに失敗しました。

エラーログを見ると、 UE 上で Ctrl + Alt + F11 とか書いてあるので試してみると、なんか画面がポップアップしてきてビルドに成功しました。

その後、プレイを実行。

おぉ、 Hello World! と EndPlay!がログに出ていますね。

Debug

ちょっと苦労したけど、私の場合は以下のようにしてデバッグができることを確認できました。

  1. UE5 は閉じる
  2. 適当に VSCode 上でブレークポイントを設定する
  3. VSCode で「実行とデバッグ」に移動して、「Launch プロジェクト名Editor (DebugGame)(ワークスペース)」を選ぶ
  4. 実行
  5. しばらくすると再び UE5 が起動する
  6. エディタ画面でゲームを起動するとブレークポイントで止まる

おわりに

とりあえずは VSCode で開発できそうではありますが、うーん、override はしんどい。
この辺は VSCode よりも CLion の方がずっと優秀[2]なんですが、私の環境では 30分近く放置して CLion が解析を終わらせてもうまく補完が動きませんでした。

私は C++ では overridevirtual もほぼ使わないで、テンプレートで何とかすることが多いですが、他人の仕組みの上ではクラスに乗っかるしかないので仕方がないですねぇ。

UE5 を Rust で開発できるようにするという中の人の実験プロジェクトもあるそうなので、UE6とかでは Rust で開発できるといいですね。

脚注
  1. Git for Windows のインストーラを使うと System の環境変数 PATH に入るので削除しておく ↩︎

  2. CLion なら override と書けば補完候補が出る ↩︎

Discussion