티스토리 뷰

개발/언리얼

nDisplay 환경에서 레벨 전환

소심야채 2024. 5. 21. 16:21

개발환경: UE5.2

 

// LobbyGameMode.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "DisplayCluster/Public/Cluster/DisplayClusterClusterEvent.h"
#include "LobbyGameMode.generated.h"

/**
 * 
 */
UCLASS()
class YOGADEMO4_API ALobbyGameMode : public AGameMode
{
	GENERATED_BODY()
	
public:
	...

	UFUNCTION()
	void SwitchLevel(const FString& LevelName);

	UFUNCTION()
	void ClusterEventCallback(const FDisplayClusterClusterEventJson& Event);

	...
};

 

// LobbyGameMode.cpp

...
#include "Kismet/GameplayStatics.h"
#include "DisplayCluster/Public/IDisplayCluster.h"
#include "DisplayCluster/Public/Cluster/IDisplayClusterClusterManager.h"
#include "DisplayCluster/Public/Cluster/DisplayClusterClusterEvent.h"
...

void ALobbyGameMode::BeginPlay()
{
	Super::BeginPlay();

	UYogaGameInstance* YogaGameInstance = Cast<UYogaGameInstance>(GetGameInstance());
	if (YogaGameInstance)
	{
		if (IDisplayCluster::IsAvailable())
		{
			IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
			if (ClusterManager)
			{
			  // nDisplay 클러스터 이벤트 콜백 등록
				FOnClusterEventJsonListener ClusterEventJsonListener = FOnClusterEventJsonListener::CreateUObject(this, &ALobbyGameMode::ClusterEventCallback);
				ClusterManager->AddClusterEventJsonListener(ClusterEventJsonListener);
			}
			
			// Primary 노드에서만 HUD 연동
			if (ClusterManager && ClusterManager->IsPrimary())
			{
				APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
				if (PlayerController)
				{
					LobbyHUD = Cast<ALobbyHUD>(PlayerController->GetHUD());
				}

				if (LobbyHUD)
				{
					LobbyHUD->AddIntro();
				}
			}
		}
		else
		{
		  // nDisplay 환경이 아닌 경우 
			APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
			if (PlayerController)
			{
				LobbyHUD = Cast<ALobbyHUD>(PlayerController->GetHUD());
			}

			if (LobbyHUD)
			{
				LobbyHUD->AddIntro();
			}
		}
	}
	else
	{
		UE_LOG(LogTemp, Log, TEXT("YogaGameInstance InValid"));
	}
}

void ALobbyGameMode::SwitchLevel(const FString& LevelName)
{
	if (IDisplayCluster::IsAvailable())
	{
		IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
		if (ClusterManager && ClusterManager->IsPrimary())
		{
		  // Primary 노드에서만 레벨 전환을 수행
			UGameplayStatics::OpenLevel(GetWorld(), FName(*LevelName));
			
			// 다른 노드들 레벨 전환 명령을 전파 
			FDisplayClusterClusterEventJson Event;
			Event.Name = "SwitchLevel";
			Event.Parameters.Add("LevelName", LevelName);

			ClusterManager->EmitClusterEventJson(Event, true);
		}
	}
	else
	{
		UGameplayStatics::OpenLevel(GetWorld(), FName(*LevelName));
	}
}

void ALobbyGameMode::ClusterEventCallback(const FDisplayClusterClusterEventJson& Event)
{
	if (Event.Name == "SwitchLevel")
	{
		FString LevelName;
		if (Event.Parameters.Contains("LevelName"))
		{
			LevelName = Event.Parameters["LevelName"];
			UGameplayStatics::OpenLevel(GetWorld(), FName(*LevelName));
		}
	}
}

 

댓글