またいつものサイト様にお世話になった。
こちらも。

あまりレベルブループリントを使わなかったのですが、C++と紐づけるなら(個人的には)使いやすくなるかも。
とあるけど、ほんとにそう。ここでたくさん何かを書く気はないけど、ちょっとしたことをC++の方からやらせたい。プレーヤーコントローラーからイベントを発生させたり。
これが元のクラスだけど、ランタイムのオブジェクトのポインタは他のゲームプレイフレームワークのクラスと違って簡単に取得できるものが用意されてなさそうなので、(※1)BeginPlay直後にゲームインスタンスにthisポインタを保存しておいて、それをプレーヤーコントローラーから読みだして使うという、たぶんまた反則技と言われそうなことをやってみたら上手くいった。(←たぶんやめたほうがいい)
実を言うと最初はコンストラクタでthisポインタを保存しようとしたら、何かとってもやばいことになって、最初に使っていたレベル定義ファイルだかアセットだかを消す羽目になった。ほとんど中身がない状態だったから良かった。何かしようとすると例外エラーが出ちゃってどうしようもなくなった。親クラスを元のALevelScriptActorに戻そうとしても戻せなくなって焦った。必死にレベルを作った後だったらと思うとぞっとする。コンストラクタ内でthisポインタを読み込むのがダメなのか?この時のthisポインタを使って何かをやる前に落ちていた。このthisポインタだけじゃなくて、ACharacterの継承クラスのコンストラクタでも、いろいろ不安定になってBeginPlay後にやるようにしたら上手く動いたのがあった。レベルが読み込まれるとこの辺りのゲームプレイフレームワークが一斉に読み込まれるんだと思うけど、その際に不安定だから何かをすると、もっと不安定になって問題が出るとかなのか。ブループリントのコンストラクタは特に問題ないのに。だいぶ分かってきた気もしていたんだが、まだまだかな。
追記
※1)訂正。ちゃんと良いのがあった。
ALevelScriptActor* _LevelScript = GetLevel()->GetLevelScriptActor();
AMyLevelScriptActor* _MyLevelScript = (AMyLevelScriptActor*)_LevelScript;
_MyLevelScript->MyEvent();
こういうのを1行でバシッと上手く書く方法があるのかもしれないが、俺にはこれが限界。これで良いのか分からないが、とりあえず上手く動いた。
反則技みたいな真似をするよりもずっと良いはず。
もう1つ反則技みたいな真似をしているのはゲームインスタンスのコンストラクタで予めマテリアルとテクスチャを全部読み込んじゃうってやつ。今のところは大した量じゃないから問題ないと思うけど。まあでもこっちは、その都度読み込むよりは遥かにいいとは思うんだけど。(これもやめた。GPUメモリ食いまくりになった。使うものだけをその都度ロードすることにした。ただ、キャラクター変更等して使わなくなった場合に勝手にガベージコレクションしてもらえるのか不明)
コメント
[…] 【UE5】独自のレベルのクラスを作る […]
[…] 【UE5】独自のレベルのクラスを作る […]
[…] 【UE5】独自のレベルのクラスを作る […]