0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[UE5]C++でlevel移動してすぐに関数を呼ぶ

Posted at

C++でゲーム制作中に、OpenLevelと一緒に他の処理も書く方法に手間取ったから少しまとめていくよ

使用ツール

UnrealEngine5.1
Rider 2023.1.2

実装について

実装についてはこのデリゲートで行うことが出来たよ。

1.C++ファイルの作成

C++のファイルを作っていくよ。まずはGameInstanceSubsystemでクラスを作っていくよ。GameInstanceで作ってもいいと思う。(というか動くなら何でも…)
名前はデフォルトの ”MyGameInstanceSubsystem” のまま進めるよ

image.png

2.実装

MyGameInstanceSubsystem.h
#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);
	
};
MyGameInstanceSubsystem.cpp
#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を組んでいく。
今回プロジェクトはサードパーソンで作っているので、プレイヤーに直で組んでいくよ。

image.png

組み終わったら実際にゲームを起動してみてLogを確認してみる。
image.png
Levelがロードされた後にちゃんとLoadedWorld: StageMapが表示されてるのが分かるね。

終わり

めちゃくちゃ完結に書いていったけど、はてなとかでプレイヤーのステータスをセーブしてLevelをロードした後に反映させたりするのとかも時間があれば書くかも。多分だけど…

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?