[UE5]WorldSubsystemを使ってプレイヤーのいるLevelの名前を取ってみる

C++を勉強中にSubSystemを触ってみたから試しにやったことを書いていくよ。

ちなみにWorldSubsystemはゲームが実行されたときやLevelを移動したりするときに生成・廃棄を行ってくれるものって認識。

## 参考
最初に参考にさせてもらったサイトを乗せとくよ。

[猫でも分かるUE4.22から入ったSubsystem](https://www.slideshare.net/EpicGamesJapan/ue4-subsystem)
[[UE4] WorldSubsystemの生成を制御する方法](https://historia.co.jp/archives/27004/)


## 1.World SubSystemクラスを追加する

まずはWorld SubSystemクラスを追加していくよ。

コンテンツブラウザの中にあるC++クラスってファイルの中で右クリックするか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/e40db76e-d9b6-9fe5-6d83-5cc228b28ade.png)

上のバーにある「ツール」の中から新規C++クラスを追加を押すとできるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/1f5ea433-7018-fc7c-00ea-ab14cf56cb84.png)

追加することができたら
全てのクラスを選んでから検索欄で"World SubSystem"って検索するよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/f65a0979-9e32-6a38-2d53-7019bed0a4ae.png)

これで追加完了！！
名前はデフォルトの"MyWorldSubsystem"のままにしといたよ（変えても大丈夫だよ）



## 2.Level名の取得していく

ファイルを追加したら中身を書いていくよ

```cpp:MyWorldSubsystem.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include "MyWorldSubsystem.generated.h"

/**
 * 
 */
UCLASS()
class WORLDSUBSYSTEM_API UMyWorldSubsystem : public UWorldSubsystem
{
	GENERATED_BODY()
	
public:
	UMyWorldSubsystem();

	virtual void Initialize(FSubsystemCollectionBase& Collection);

	UPROPERTY(BlueprintReadOnly, Category = "Level")
	FString LevelName;

};
```

```cpp:MyWorldSubsystem.ccp
// Fill out your copyright notice in the Description page of Project Settings.


#include "MyWorldSubsystem.h"

UMyWorldSubsystem::UMyWorldSubsystem()
{
}

void UMyWorldSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
	Super::Initialize(Collection);

	FString _LeftStr;

	GetWorld()->GetFullName().Split(TEXT("."), &_LeftStr, &LevelName);

	UE_LOG(LogTemp, Log, TEXT("LevelName : %s"), *LevelName);
}

```

画像で見せるとこんな感じ

MyWorldSubsystem.h
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/2d4506c4-f444-f187-16e3-ea37f1b4f334.png)

MyWorldSubsystem.ccp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/697352ff-5739-036c-dc66-283867c6c47e.png)

ゲームが実行されたりしてLevelが呼ばれたら、初期化の段階で現在のLevel名を取ってくる。
GetFullName() で出た文字列をSprit() を使って「.」より後ろを取ることで名前を取るようにしてるよ。割と強引...
LevelNameのUPROPERTY()はBPでも取れるようにするためだよ

UPROPERTY()について気になる人は参考になるかも
[いまさら聞きづらいUPROPERTY・UFUNCTION](https://logicalbeat.jp/blog/8212/)
## 3.実際にプレイしてみる

実際にプレイしてみてちゃんとLevelの名前が出てるか確認するよ。

まずはプレイした後にLogを見れるようにアウトプットログを出しとくよ。
やり方二つあるからお好きなほうで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/c7b435fd-b9fe-b043-c89c-f89194617b55.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/ab21640c-e7e4-7d35-f584-8271afeca807.png)


じゃあプレイ！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/437774b6-4779-ae29-0fb0-97ee1bee7c7a.png)
ちゃんと出てる...！
これでLevel名がとることができたよ。やったね。

## 4.BPでもLevelNameを取ってみる

BPでもLevelNameを取ってみるよ

レベルブループリントでさっき作った”MyWorldSubSystem”を持ってくるよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/921fec57-be36-77fa-49fc-997c7bbc2aba.png)

そしたら持ってきたサブシステムから"LevelName"を出してこんな感じにつなげてあげると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/8e261466-c5a5-65b4-dcc0-d26e59148c6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/8645494e-53a0-3ef0-e039-952de565c10b.png)
ちゃんとLevelNameを取ってこれた！
Levelを移動しても名前はちゃんと更新されるよ。

Levelの名前取るだけならSubSystem組まなくてもいいかもしれないけどまぁ練習ということで...