UE5:C++
Unreal Engine5、いまいちVisual Studioと連携させたときの挙動がよくわからない。
公式のドキュメント、
サンプルプロジェクトで挙動を確認してみる。
「ツール」の「新規C++クラス」からC++クラスを追加する。
親クラスにActorを選択。
クラスタイプは「パブリック」を選択。ファイル名はMyActor。クラスタイプが、「パブリック」「プライベート」で何が違うのかは後で調べよう。
Live Codingが自動的に実行される。
Visual Studio側にいくと、UEツール側でC++ファイルを追加しているから、上記のようなダイアログが表示される。「すべて再読み込み」を選択。
MyActorのヘッダとcppが追加されている。
画面上にデバッグ文字列を表示する実装を追加。
#include "Kismet/KismetSystemLibrary.h"
を追加して、
UKismetSystemLibrary::PrintString(GEngine->GetWorld(), "Hello");
を追加。
補足の説明として、作成するC++クラス名は「MyActor」を指定しているが、「AMyActor」というクラスが作成されている。
UE5の命名規約として、アクタクラスの派生クラスの名称は、先頭に「A」をつけるということになっているのだが、これは勝手にやってくれるので、自分で「A」を入れた名称を指定する必要はない。自分で「A」をいれると、「AAMyActor」というクラス名になってしまう。
勝手につけてくれるのはいいんだけど、だったらUEエディタ上でブループリントとかマテリアルとかを新規作成したときも勝手につけてくれていいんだけどな。
UEエディタで、MyActorをレベル上に配置。実行してみても、期待しているようなデバッグ文字列は表示されない。
ビルドしていないのだから、想定している動作にならないのは当たり前である。Ctrl+Alt+F11を押してLive Codingでビルド。
なお、ダメなのがわかっているので今回は試していないが、Visual Studio側でビルドしてもうまくいかない。
実行すると、期待通りデバッグ文字列が表示された。
デバッグ文字列の表示内容を変更して、再度Live Codingでビルド。
期待通り変更された。
いったんUEエディタ、Visual Studioを落として、[プロジェクトディレクトリ]\Binaries\Win64\に生成されたビルドモジュールを確認する。
Live Codingでビルドしたとき、UnrealEditor-SampleGame.dllが更新されるのではなく、UnrealEditor-SampleGame.dllにパッチを当てるモジュールが生成されるようだ。
ちょっとわからないのは、このパッチってビルドする度にどんどん増えていくんだろうか?そうだとするとちょっと困る。
もう一度UEエディタを立ち上げる。さっきレベル上に配置したMyActorが消えている。コンテンツドロワー側にもC++クラスが見えなくなっている。
焦る挙動だが、俺は何回かこの挙動を見ているので焦らない。
もう一回Live Codingでビルド。
コンテンツドロワー側にはC++クラスが復活するが、レベル上には復活しない。
そんな時は、一回別のレベルを開いて、再度元のレベルを開きなおすと復活する。
うーん。なんとなくこういう挙動になるのは理解できるけど(ビルドしただけだとdllが読み込みなおされないため)、Live Codingの気軽さを考えるとなんかいまいちだな。
なんか、Live Codingは無効にしたほうがいいような気がする。気軽にC++の挙動を確認できるのはいいんだけど、開発に使うには挙動が罠すぎる。
Live Codingを無効にした時は、UEエディタを落としてからVisual Studioでビルド、というワークフローになると思うけど、そんなに面倒くさいことにはならないと思う。
このあたりの仕様、一人でやってるとなんか変に感じるけど、UEエディタしか触らないデザイナーと、Visual Studioしか触らないプログラマー、という開発体制を想定しているんだと思う。
今日はちょっと時間切れだけど、次はLive Codingを切った時どうなるか試してみよう。
あと、UEエディタ側じゃなくて、Visual Studio側でC++クラスを追加したときの挙動も後で確認してみる。
*****
いろいろわかった。
まず、Live CodingはONでいい。
Visual Studio側でソースを修正したら、UEエディタを立ち上げている状態の場合、Ctrl+Alt+F11を押してLive Codingでビルド。
修正した内容はUEエディタ側に即座に反映される。
ある程度区切りのいいところまで進めたら、UEエディタを終了してから、Visual Studioでリビルド。ビルドでもうまくいくけど、公式の説明ではリビルドしろってことになっているからリビルドする。これを忘れると、次にUEエディタを立ち上げたときに、Visual Studio側で行った変更が巻き戻ったように見える。
UEエディタを立ち上げたままVisual Studioでリビルドしてしまうと、次にUEエディタを立ち上げたときに、上記のようなダイアログが表示されるので「Yes」を選択する。
*********
Visual Studio側でブレークポイントを使ってデバッグする方法は以下。
UEエディタを落とした状態で、デバッグ>新しいインスタンスの開始、をクリック。
UEエディタが立ち上がってくるので、UEエディタのPIEで実行。
ブレークポイントに止まってくれる。変数の内容も見える。
デバッグするときは、ソリューション構成を、DebugGame Editorにしておく。そうしないと変数の内容が見えない。
ソリューション構成がDevelopment Editorだと、「変数は最適化されたため、使用できません」となって変数の内容が見えない。
************
Visual Studio側からC++クラスを追加する方法。
ソリューションエクスプローラー上で右クリックして、「追加」>「Unreal Engine クラス」を選択。
「新しいクラスの追加」ダイアログで親クラスを選択。Actorクラスを親とし、名前はFooActorとした。
内容に問題がなかったら「OK」をクリック。
なぜかエラーがでるけど、いまのところこれは無視でOK。
ソリューションエクスプローラー上、追加したクラスが見えない。
ヘッダ、cppファイルはPublic、Privateディレクトの外側に作成されているので、それぞれのディレクトに移動させる。
UEエディタ側で、ツール>Visual Studio 2022 プロジェクトを更新、を選択。
ソリューションエクスプローラー側で追加されたC++クラスが見える。
このやりかたでC++クラスを追加すると、最初のコメントが日本語になる。
#includeとかGENERATED_BODY()に警告の赤線がでているけど、これはそのうち消えるから気にしなくていい。