C++を勉強中にSubSystemを触ってみたから試しにやったことを書いていくよ。
ちなみにWorldSubsystemはゲームが実行されたときやLevelを移動したりするときに生成・廃棄を行ってくれるものって認識。
参考
最初に参考にさせてもらったサイトを乗せとくよ。
猫でも分かるUE4.22から入ったSubsystem
[UE4] WorldSubsystemの生成を制御する方法
1.World SubSystemクラスを追加する
まずはWorld SubSystemクラスを追加していくよ。
コンテンツブラウザの中にあるC++クラスってファイルの中で右クリックするか
上のバーにある「ツール」の中から新規C++クラスを追加を押すとできるよ
追加することができたら
全てのクラスを選んでから検索欄で"World SubSystem"って検索するよ
これで追加完了!!
名前はデフォルトの"MyWorldSubsystem"のままにしといたよ(変えても大丈夫だよ)
2.Level名の取得していく
ファイルを追加したら中身を書いていくよ
// 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;
};
// 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);
}
画像で見せるとこんな感じ
ゲームが実行されたりしてLevelが呼ばれたら、初期化の段階で現在のLevel名を取ってくる。
GetFullName() で出た文字列をSprit() を使って「.」より後ろを取ることで名前を取るようにしてるよ。割と強引...
LevelNameのUPROPERTY()はBPでも取れるようにするためだよ
UPROPERTY()について気になる人は参考になるかも
いまさら聞きづらいUPROPERTY・UFUNCTION
3.実際にプレイしてみる
実際にプレイしてみてちゃんとLevelの名前が出てるか確認するよ。
まずはプレイした後にLogを見れるようにアウトプットログを出しとくよ。
やり方二つあるからお好きなほうで
じゃあプレイ!!
ちゃんと出てる...!
これでLevel名がとることができたよ。やったね。
4.BPでもLevelNameを取ってみる
BPでもLevelNameを取ってみるよ
レベルブループリントでさっき作った”MyWorldSubSystem”を持ってくるよ。
そしたら持ってきたサブシステムから"LevelName"を出してこんな感じにつなげてあげると...
ちゃんとLevelNameを取ってこれた!
Levelを移動しても名前はちゃんと更新されるよ。
Levelの名前取るだけならSubSystem組まなくてもいいかもしれないけどまぁ練習ということで...