반응형

언리얼 도큐먼트에 보면 게임모드가 리플리케이트 되지 않는 다는 내용을 볼수 있긴 하지만

실행을 하다보면 게임모드가 클라에 있는 경우를 볼 수 가있는데 왜 그런것인지 한번 파악을 해보자

 

 

용어 정리

새 에디터 창(PIE) : 새로운 창에서 실행 화면을 띄움 (Client, Server 를 구분하면서 보기에 유용하다)

스탠드 얼론(Stand alone) : 독립형 게임을 말한다

리슨서버 : 서버와 클라 동시에 실행되는 서버를 말한다

데디케이트 서버 : 렌더링 관련기능 등이 언리얼에서 빠진 오직 서버 기능만이 있는 서버를 말한다

 

 

 

멀티 환경 설정

보다 정확한 멀티 플레이 세팅을 하려면 아래 단일 프로세스 하 실행 옵션을 해제해야한다

옵션이 체크되면 하나의 프로세스에서 실행 되다보니 값이 중복되는 등 제대로된 상태를 보기 어렵게 된다

 

 

 

테스크

 

월드에 큐브를 하나 배치하고 이 큐브에 대한 메터리얼 세팅하는 테스트를 하기위해 다음과 같이 세팅한다

 

큐브를 레벨에 올리고 다음과 같이 블루프린트를 만들어준다

 

 

큐브의 리플리케이션 설정은 다음과 같다

Net Load On Client : 클라이언트에 맵이 로드되면서 동시에 이 항목이 체크된 해당 액터도 맵과 함께 클라이언트에게 보여지게 된다

 

 

 

 

게임모드의 실행여부를 확인하기 위해 게임모드 클래스를 상속받는다

 

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

GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Red, FString::Printf(TEXT("AGameMode::BeginPlay")));

 

 

 

 

Play Offiline 로 실행할경우 게임모드의 존재 여부를 살펴보면 

 

넷 모드를 Play Offline 으로 세팅하고 실행해보면

 

 

Play Offiline 으로 할 경우

 

Role 이 Autority 이고 게임모드의 BeginPlay 또한 호출 되는 것을 볼 수가 있다

이때에는 게임 모드가 클라이언트에서도 실행이 되며 존재한다(실행 자체가 클라임으로)

 

 

 

아래와 같이 클라이언트에서 실행 되었지만 게임모드는 클라에서 만들어졌기 때문에 Role 이 Authority 이며

게임모드 BeginPlay 또한 실행 된것을 볼 수 있으며 메터리얼 또한

노란색 무늬가 있는 메터리얼로 씌워진 것을 볼 수 있다

(멀티 플레이어 옵션에서 -> 플레이어 수 를 늘려도 마찬가지)

 

 

 

Play As Listen Server 로 플레이 하는 경우

 

 

 

 

서버에서는 GameMode 의 Role 가 Authority 이며 GameMode::BeginPlay 또한 호출 된것을 볼수 있으며 게임 모드가 존재 한다는 것을 알수 있다

 

 

 

하지만 클라이언트에서는 GameMode 의 Role 가 None 이며GameMode::BeginPlay 또한 호출 되지 않았다는 것을 알 수 있다(존재하지 않음으로) 

 

 

 

 

 

 

Play As Client 로 테스트를 하기 위해선 아래 과정들이 필요하다

 

 

 

먼저 서버를 위한 빌드를 하나 한다 

 

 

프로젝트 세팅에서 다음 처럼 세팅한다음 빌드를 한 후

 

 

아래 처럼 서버바로 가기를 세팅 한다

 

 

 ?Listen -Rex=500 -ReY=350 -WINDOWED

 

 

서버를 실행 .exe

서버(리슨서버)를 띄웠으니 당연히 Authority 에 큐브 또한 노란색 띄 메터리얼이 입혀졌다

게임모드의 BeginPlay 도 호출된것을 볼 수 있다

 

 

서버를 띄운 다음

 

또한 콘솔 명령으로 Open 1278.0.0.1 로 클라이언트에서 서버쪽으로 붙을 수가 있다

 

 

멀티 플레이 환경 세팅이 되었다는 가정 하에 게임 모드가 존재하는 상황이 있는데

 

서버 역할을 하는 경우와 

 

 

 ?Listen -Rex=500 -ReY=350 -WINDOWED

 

 

 

에디터에서 Play As Client 로 실행하면 

 

에디터에서 실행한 화면이 Server 가 아닌 Client 라는 것을 타이틀창에서 알수 있으며

게임모드의 Role 또한 None 이며 Beginplay 또한 호출되지 않은 즉 게임모드가 존재 하지 않는 다는 거을 알 수가 있다

 

 

 

추가로 붙은 클라이언트에서도 마찬가지인 상황을 알 수가 있다

 

 

 

 

 

게임 모드의 존재 유무 정리

 

Play as Offline 으로 실행 될때 게임 모드가 존재하며 Role 이 Authority 인것을 알수 있고

서버로 실행 되었을때에도 마찬가지로 Authority 이면서 BeginPlay 가 호출된것을 볼 수가 있다

 

 

멀티 환경에서 게임 모드는 서버에서 클라로  Replicated 되지 않고 서버에만 존재하지만

 

Play as Offline 인 클라이언트 단독으로만 실행 할 경우에는 게임모드가 클라이언트에서 생성 되고 삭제 되고 다른곳에 복제 시킬 일도 없음으로 클라이언트 자체가 GameMode 의 Authority 가 된다는 것을 알 수가 있다

 

 

Role_Authority 란 서버만을 얘기 하는 것이 아니라(보통은 서버) 해당 오브젝트가 생성되어 실질적으로 관리를 하고 있는 대상에 따라 Authority 가 된다

 

 

ex) 

1. 멀티 환경에서 서버에서 게임모드는 서버가 관리 함으로 서버에서 GameMode 는 Role_Authority 

하지만 클라에서는 존재자체를 하지 않음

 

2. Play As Offline 으로 서버 없이 실행할 경우 클라에 게임모드가 생성이 되며 이때 생성된 게임 모드는 Role 은 Role_Authority 가 된다, 여기서 관리 되고 삭제 됨으로

 

 

언리얼 도큐먼트 설명에 나와 있는 클라로 Replicated 하지 않는다,

즉 클라이언트중 게임모드가 존재하지 않는다는 것은

멀티 환경 구성이 갖추어 진상태에서 서버가 존재하지만 Play As Client 로 실행 하여 클라로 붙었을때 게임 모드가 존재하지 않는 것이다라는 것을 알 수 있다

반응형

+ Recent posts