プレイヤーキャラクタのクラスブループリントから、
レベルブループリントの変数を参照&更新したいのですが、
どんな方法がありますでしょうか。
GetLevelBlueprint みたいなノードがあると嬉しいのですが。
まず最初に申しておきますと、他のクラスブループリントからレベルブループリントへと参照を行うというのは、設計としてかなりまずいということです。レベルが何かしらのアクターやブループリントへと依存するのは問題ありませんが、ブループリント単体がレベルへと依存するのは非常に問題です。(つまりそのレベルが存在しない場合、ブループリントそのものが動作しない)
それを承知の上でお答えすると、Get Streaming Levelというノードを使うことで、ストリーミングで読み込みされたレベルそのものを参照することは可能です。ただし、お望みのような変数を参照&更新するというのは厳しいかと思われます。(特定のレベルそのもの情報を直接取り出す手段がないため)
Event Dispatchersを使用することで変数の代入は可能です。
CharacterBP側でEvent Dispatcherを定義し
Level Blueprint側でEventをBindしてやることで変数の更新は可能です。
あるいはInterfaceを使用することで変数のget / setの要件を満たすことができます。
図はInterface定義、LevelBlueprintでの実装、Characterからの呼び出しです。
Interfaceを用意し、LevelBlueprintのClass SettingsからInterfaceを追加。
イベントと関数のOverrideで変数のget / setを登録。
CharacterからはGet All Actors of ClassでLevel Script Actorを取得して
Interfaceの呼び出しを行っています。
ご回答ありがとうございます!
やりたい事は、ステージ(レベル)の進行状況を保持する変数を
レベルブループリントに作成して、その変数に応じて敵キャラの挙動を変えたりしたいのですが、
こういう変数はレベルブループリントに格納するのが良いのかなと思ったのですが、
設計としてマズイのでしょうか。普通のゲーム開発ですと、ステージマネージャーみたいな
クラスを用意して、それに変数を持たせると思うのですが、UE4では、そのような設計は
ダメなんですかね・・・。(^^)
ご回答ありがとうございます!
Interfaceは使ったことないのですが、
試しにやってみようと思います。(^^)
結局、やりたい事は、ステージ(レベル)の進行状況を保持する変数を作成して、
その変数に応じて敵キャラの挙動を変えたりしたい。
ということだったのですが、レベルブループリントに変数を作るのではなく、
GameModeに変数を持たせて、「GetGameMode」ノードを使うことで、
ニーズを満たすことが出来ました。
皆様、ご回答ありがとうございました!