3. 네트워크 환경 구성하기
A. 그 플레이어 컨트롤러가 누구 것이냐

언리얼 엔진에서 네트워크 환경을 만드는 것은 간단하다. 실행 버튼 옆에 있는 메뉴를 열면 설정이 나오는데 여기서 플레이어 수를 2로 하면 2명이 접속한 환경인 것처럼 만들 수 있다. 넷 모드를 Play As Client로 하면 현재 실행을 서버에 접속한 클라이언트로 만들 수 있다.

실행하면 원래 화면 외에 추가로 화면이 1개 더 생성된다. 플레이어 수를 2로 했기 때문에 원래 실행하는 화면과 추가로 생성되는 화면 1개, 총 2개의 화면이 된다.

이제부터 문제가 발생한다. 지금까지는 혼자서 플레이하는 환경이라서 아무런 문제가 없던 것이 네트워크 환경으로 만드니까 에러가 발생한다.
void ABaseballPlayerController::BeginPlay()
{
Super::BeginPlay();
//이하의 내용은 로컬일때만 동작
if (!IsLocalController())
return;
//UI 입력만 허용
FInputModeUIOnly InputModeUIOnly;
SetInputMode(InputModeUIOnly);
//채팅 UI 생성
if (IsValid(ChatInputWidgetClass))
{
ChatInputWidgetInstance = CreateWidget<UChatInput>(this, ChatInputWidgetClass);
if (IsValid(ChatInputWidgetInstance))
{
ChatInputWidgetInstance->AddToViewport();
}
}
}
그 원인은 다음과 같다. 네트워크 환경이라면 동시에 2개 이상의 클라이언트가 있을 것이고 (이미 설정에서 플레이어 수를 2로 했으니 2개의 클라이언트가 있다.) 그 수에 따라 플레이어 컨트롤러가 있다. 그 중에서 플레이어 자신에 해당되는 컨트롤러는 1개뿐인데 문제는 지금 작성한 코드는 자신이 아닌 경우에도 동작한다. 그래서 남의 플레이어 컨트롤러에서도 입력을 UI만 받게 하는 것과 위젯을 추가하는 코드가 동작한다. 접속한 플레이어 수만큼 중복 실행도 문제인데 그게 남의 것인게 더 큰 문제다.
따라서 해당 플레이어 컨트롤러가 로컬 플레이어, 즉 자신인지 체크할 필요가 있으며 다른 클리이언트 것이라면 실행하지 않게 조치를 취해야 한다. 플레이어 컨트롤러는 IsLocalController라는 함수가 있는데 이 함수가 바로 그 역할을 한다.
B. 에디터 환경에서 클라이언트간 간섭을 제거하기
void ABaseballPlayerController::SetChatMessageString(const FString& ChatMessage)
{
PreviousChatMessage = ChatMessage;
PrintChatMessageString(PreviousChatMessage);
}
void ABaseballPlayerController::PrintChatMessageString(const FString& ChatMessage)
{
UKismetSystemLibrary::PrintString(this, ChatMessage, true, true, FLinearColor::Red, 5.0f);
}
텍스트 박스의 입력을 받으면 그 내용을 즉시 출력하도록 변경했다.

그리고 실행하면 잘 작동한다. 그런데 뭔가 이상하다. 분명 두 화면은 서로 다른 클라이언트인데 어느 한 쪽에서 입력을 하면 모든 클라이언트에게 출력된다. 코드상으로는 자신의 UI에서 입력하고, 그 내용을 자신의 컨트롤러에게 넘겨주어 그것을 출력하는 코드다. 딱히 네트워크에 연결한 적이 없다. 설마 알아서 네트워크와 연동이 되는 언리얼 엔진의 대단한 기술인가?
…는 개소리고 그냥 두 클라이언트 사이에 간섭이 발생하는 상황이다.


클라이언트간 간섭이 발생하는 이유는 에디터에서 실행시 동일한 프로세스에서 실행하기 때문이다. 설정에서 고급 세팅을 누르면 에디터 개인설정의 플레이 설정 화면이 열리는데 여기서 멀티 플레이어 옵션을 찾아보면 ‘단일 프로세스하 실행’이 켜진 상태로 되어 있을 것이다. 이를 끄고 실행하면 클라이언트간 간섭이 발생하지 않는다. 다만 새로운 프로세스에서 실행하기 때문에 클라이언트를 생성하는데에 시간이 걸릴 것이다.
이 간섭은 어디까지나 에디터 상에서 발생하는 현상이라서 만약 패키징 하여 따로 2개 이상 실행할 경우 간섭이 발생하지는 않는다.
'언리얼엔진 학습 및 과제' 카테고리의 다른 글
| 온라인 채팅 구현하기 (4) (0) | 2025.11.25 |
|---|---|
| 온라인 채팅 구현하기 (3) (0) | 2025.11.21 |
| 온라인 채팅 구현하기 (1) (0) | 2025.11.19 |
| 팀 프로젝트 슈터 게임 (8) (0) | 2025.11.14 |
| 팀 프로젝트 슈터 게임 (7) (0) | 2025.11.12 |