C++でゲーム制作中に、OpenLevelと一緒に他の処理も書く方法に手間取ったから少しまとめていくよ
使用ツール
UnrealEngine5.1
Rider 2023.1.2
実装について
実装についてはこのデリゲートで行うことが出来たよ。
1.C++ファイルの作成
C++のファイルを作っていくよ。まずはGameInstanceSubsystemでクラスを作っていくよ。GameInstanceで作ってもいいと思う。(というか動くなら何でも…)
名前はデフォルトの ”MyGameInstanceSubsystem” のまま進めるよ
2.実装
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"
UCLASS()
class LOADING_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
//Level移動
UFUNCTION(BlueprintCallable)
void LoadLevel(TSoftObjectPtr<UWorld> World);
//Level移動後に呼ばれる
void LoadedEvent(UWorld* LoadedWorld);
};
#include "MyGameInstanceSubsystem.h"
#include "Kismet/GameplayStatics.h"
void UMyGameInstanceSubsystem::LoadLevel(TSoftObjectPtr<UWorld> World)
{
UE_LOG(LogTemp, Warning, TEXT("Start OpenLevel:%p"), World.LoadSynchronous());
//Level移動
UGameplayStatics::OpenLevel(GetWorld(), World.LoadSynchronous()->GetFName());
//Level移動後に呼ばれるイベントを登録
FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UMyGameInstanceSubsystem::LoadedEvent);
}
void UMyGameInstanceSubsystem::LoadedEvent(UWorld* LoadedWorld)
{
//移動先のLevel名をLogに出す
UE_LOG(LogTemp, Warning, TEXT("LoadedWorld: %s"), *LoadedWorld->GetName());
}
簡単に確認できるようにUFUNCTION(BlueprintCallable)
でBPで使えるようにしたよ。
Logに関しても分かりやすいようにWarning
で行っているけど別に変えても大丈夫。
そしてLoadedEvent(UWorld* LoadedWorld)
のLoadedWorld
には移動後のLevelが入るようになってるよ。引数にこれがないとFCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject()
で呼んでもエラーになるので注意
3.Logで確認してみる
まずはロード用に適当なLevelを準備するよ。作り終わったらBPを組んでいく。
今回プロジェクトはサードパーソンで作っているので、プレイヤーに直で組んでいくよ。
組み終わったら実際にゲームを起動してみてLogを確認してみる。
Levelがロードされた後にちゃんとLoadedWorld: StageMap
が表示されてるのが分かるね。
終わり
めちゃくちゃ完結に書いていったけど、はてなとかでプレイヤーのステータスをセーブしてLevelをロードした後に反映させたりするのとかも時間があれば書くかも。多分だけど…