헛둘이 2024. 10. 27. 07:53

다른 맵으로의 이동을 구현하기 위해 Teleport 기능을 구현합니다.

Lyra에서 각 맵의 단위는 Experience라는 단위로 구성되어 있으며, 맵 간 이동은 오브젝트의 충돌(Overlap)을 통해 이루어집니다.

 

이 맵 간 이동을 담당하는 기능을 Lyra에서는 별도의 Plugin으로 빼서 관리를 하고 있습니다.

Plugin은 현재 구현된 시스템과 큰 의존성이 없도록 별도의 모듈을 구성한다는 점에서 이점이 있고, 다른 프로젝트에서도 사용할 수 있게 마치 dll과 같은 개념으로 이해를 했습니다만, 이 부분에 대해서는 따로 다루도록 하겠습니다.

 

1. CommonUser라는 모듈을 작성한 후, UCommonSessionSubsystem 클래스와 UCommonSession_HostSessionRequest 클래스를 둡니다.

2. UCommonSessionSubsystem은 BlueprintCallable 함수인 HostSession 함수를 가지고 있는데, 매개변수로 UCommonSession_HostSessionRequest를 받습니다.

3. UCommonSession_HostSessionRequest는 URL을 생성할 수 있는  ConstructTravelURL 함수를 통해 현재 정보로 URL을 만들고 반환하며, UCommonSessionSubsystem은 이 URL을 서버에 던져주어 맵 간 이동을 구현합니다.

 

void UCommonSessionSubsystem::HostSession(APlayerController* HostingPlayer, UCommonSession_HostSessionRequest* Request)
{
	ULocalPlayer* LocalPlayer = (HostingPlayer != nullptr) ? HostingPlayer->GetLocalPlayer() : nullptr;
	if (!LocalPlayer)
		return;

	GetWorld()->ServerTravel(Request->ConstructTravelURL());
}

 

Native에서는 로직만 구현하며, 실제 사용되는 부분은 Blueprint를 이용하여 구현됩니다.

* UCommonSession_HostSessionRequest은 BlueprintType

 

! Plugin을 사용할 때 유의해야 할 점은, 클래스를 만들 때 반드시 class 키워드 뒤에 [ModuleName]_API를 적어주어야 한다는 것

- 다른 프로젝트에서 해당 모듈을 사용할 수 있게 하려면 DLL_EXPORT가 필요한데, 이 키워드가 DLL_EXPORT 역할을 한다.

 

 

? Blueprint 작업을 하다가 막힌 적이 있습니다.

Cast To PlayerController 노드가 그냥 생성 시 Exec 핀이 있는 채로 생성되게 되는데,

이를 무시하고 작업을 진행했다가 왜 안되지? 라는 의문을 연발했던 기억이 있습니다.

- 저 핀을 우클릭을 통해 제거할 수 있는데, 만약 핀을 제거하지 않으면 해당 변환이 기본값으로 변환되기 때문에 정상적으로 작동하지 않습니다.