-
[UE5] CommonUserUE5/Lyra Clone Coding 2025. 2. 6. 20:37
Portal을 통과할 때 맵을 이동할 수 있도록, 즉 Experince를 변경할 수 있도록 설정해보자.
Lyra에서는 이를 CommonUser라는 플러그인을 만들어서 진행하고 있다.
CommonUser 플러그인은 Lyra에서 사용자 계정과 설정 관리를 담당하는 핵심적인 플러그인인데, 멀티 환경을 감안하여 플러그인으로 설정되어 있다. 우리는 이중에서 싱글플레이에서 사용하는 부분만 들고와서 사용할 것이다.
SubSystem
CommonSessionSubsystem은 GameInstanceSubsystem을 상속받아서 만드는데,
일단 이 SubSystem이란 무엇일까?
게임의 전역적인 기능이나 서비스 로직을 관리하기 위해 설계된 모듈화된 시스템인데, 게임의 어디서나 쉽게 접근할 수 있는 매니저 역할을 한다. Subsystem은 Engine, Editor, GameInstance, World, LocalPlayer 5가지가 존재한다.
전통적으로는 이런 매니저 역할은 싱글톤 패턴을 사용하여 전역적으로 접근할 수 있도록 생성한다.
언리얼에서는 문제가 있는데 싱글톤은 한번 생성되면 절대 사라지지 않는다. 이로 인해 게임 내의 잦은 World 이동이나 Player변경 시에 기존의 싱글톤 매니저가 남아 문제를 일으킬 수 있다.
따라서 싱글톤 패턴과 유사하지만 고유의 생성-파괴 라이프 사이클을 가지는 Subsystem을 두어 이 문제를 해결하였다.
Map의 로딩
FString UCommonSession_HostSessionRequest::ConstructTravelURL() const { FString CombinedExtraArgs; for (const auto& ExtraArg : ExtraArgs) { if (ExtraArg.Key.IsEmpty()) { continue; } /** * ?를 separate로 복수개의 ExtraArg를 추가함: * - Key 값 유무에 따라, =(assignment)를 통해 알맞는 CmdArg를 생성 */ if (ExtraArg.Value.IsEmpty()) { CombinedExtraArgs += FString::Printf(TEXT("?%s"), *ExtraArg.Key); } else { CombinedExtraArgs += FString::Printf(TEXT("?%s=%s"), *ExtraArg.Key, *ExtraArg.Value); } } // Map 경로 앞에 추가하여, 최종 TravelURL 생성 return FString::Printf(TEXT("%s%s"), *GetMapName(), *CombinedExtraArgs); }
Map을 로딩하는 것은 ExtraArg를 Parsing해서 이루어진다.
ConstructTravelURL함수에서 Map을 위한 URL을 만들어주고 맵을 로딩할 때 arg를 파싱해서 어떤 맵으로 이동할지, 어떤 Experience로 세팅할지 정보를 받아올 수 있다.
void UCommonSessionSubsystem::HostSession(APlayerController* HostingPlayer, UCommonSession_HostSessionRequest* Request) { ULocalPlayer* LocalPlayer = (HostingPlayer != nullptr) ? HostingPlayer->GetLocalPlayer() : nullptr; if (!LocalPlayer) { return; } // HostSessionRequest에서 MapID와 ExtraArgs를 통해 URL을 생성하여, MapLoad를 시작한다 GetWorld()->ServerTravel(Request->ConstructTravelURL()); }
세팅한 URL을 받아 HostSession에서 ServerTravel을 통해서 MapLoad를 시작한다.
(ClientTravel은 클라이언트마다 다른 맵으로 보내는 것이 가능)
UCommonSession_HostSessionRequest* UZSUserFacingExperience::CreateHostingRequest() const { const FString ExperienceName = ExperienceID.PrimaryAssetName.ToString(); UCommonSession_HostSessionRequest* Result = NewObject<UCommonSession_HostSessionRequest>(); Result->MapID = MapID; Result->ExtraArgs.Add(TEXT("Experience"), ExperienceName); return Result; }
UserFacingExperience에서 MapID, ExperienceID를 이용해 ExtraArg을 만들어 준다.
(Result->ConstructTravelURL()로 최종 URL 생성)
포탈을 통해 map을 이동하는 블루프린트 실제 포탈의 collision과 충돌시 map을 이동하는 로직은 블루프린트로 작성해준다.
'UE5 > Lyra Clone Coding' 카테고리의 다른 글
[UE5] GameFeature (1) 2025.02.07 [UE5] Camera (0) 2025.02.05 [UE5] PawnExtension(2) - 구성 요소 분석 (0) 2025.02.03 [UE5] PawnExtension (0) 2025.01.31 [UE5] Experience (0) 2025.01.23