오늘의 목표
에디터의 PIE에서 실행하는 것과 실제 패키징된 게임의 차이를 이해하고, 일반 Game 빌드와 Dedicated Server 배포에 필요한 준비 사항을 점검했다.
추가로 서버가 잘못된 입력을 거부했을 때, 요청한 플레이어에게만 오류를 보여주는 Client RPC 시스템 로그도 구현했다.
1. PIE와 패키징 실행의 차이
PIE는 Unreal Editor 내부에서 빠르게 게임을 시험하는 개발 환경이다. 에디터가 콘텐츠와 모듈을 직접 제공하므로, 패키징에서 누락될 자산이나 실행 환경 문제를 발견하지 못할 수 있다.
반면 패키징 실행은 다음 과정을 거친 독립 프로그램이다.
- Build: C++ 코드와 모듈 컴파일
- Cook: 맵, Blueprint, 이미지 등의 자산을 플랫폼용으로 변환
- Stage: 실행에 필요한 파일을 임시 배포 폴더에 모음
- Package: 실행 파일과 Pak 파일로 묶음
- Archive: 최종 배포 폴더로 복사
따라서 “PIE에서 된다”는 것이 “패키지에서도 된다”는 뜻은 아니다.
2. Unreal의 Build Target
Unreal에는 실행 목적에 따른 Target이 있다.
- Editor: Unreal Editor에서 프로젝트를 실행하기 위한 빌드
- Game: 일반 독립 실행 게임
- Client: 서버 기능을 제외한 전용 클라이언트
- Server: 렌더링과 로컬 플레이어가 없는 Dedicated Server
이번 프로젝트에는 다음 Target을 준비했다.
MYBaseball.Target.cs
MYBaseballEditor.Target.cs
MYBaseballClient.Target.cs
MYBaseballServer.Target.cs
일반 Game 빌드는 Listen Server와 클라이언트 역할을 모두 수행할 수 있다. 하지만 진짜 Dedicated Server 실행 파일을 만들려면 Server Target 빌드가 필요하다.
현재 설치된 런처판 UE 5.7에서는 Client/Server Target 빌드가 거부됐다. Epic의 공식 Dedicated Server 문서도 소스 빌드 엔진을 전제로 안내한다.
3. UI 전용 게임의 맵 설정
이 프로젝트는 캐릭터나 월드 렌더링 없이 UI만 사용한다. 따라서 빈 맵인 Lvl_UIOnly를 클라이언트와 서버의 기본 맵으로 지정했다.
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/UI/Lvl_UIOnly.Lvl_UIOnly
ServerDefaultMap=/Game/UI/Lvl_UIOnly.Lvl_UIOnly
EditorStartupMap=/Game/UI/Lvl_UIOnly.Lvl_UIOnly
패키징할 맵과 UI 폴더도 명시했다.
[/Script/UnrealEd.ProjectPackagingSettings]
+MapsToCook=(FilePath="/Game/UI/Lvl_UIOnly")
+DirectoriesToAlwaysCook=(Path="/Game/UI")
처음에는 WBP_BaseballGame이 C++의 Soft Reference로만 연결되어 패키지에서 누락됐다. UI 폴더를 항상 Cook하도록 설정한 뒤 Blueprint UI가 정상적으로 포함됐다.
4. 일반 Game 빌드로 멀티플레이 테스트
Dedicated Server가 없어도 일반 Game 빌드를 두 개 실행해 기본 네트워크 흐름을 시험할 수 있다.
첫 번째 게임은 Listen Server로 실행한다.
.\MYBaseball.exe "/Game/UI/Lvl_UIOnly?listen" -log
두 번째 게임은 로컬 서버에 접속한다.
.\MYBaseball.exe "127.0.0.1:7777" -log
여기서 127.0.0.1은 현재 컴퓨터 자신을 의미하고, 7777은 Unreal 게임 서버의 기본 포트다.
Listen Server 테스트에서는 두 플레이어의 역할 배정, Server RPC, 상태 복제, Client RPC 등을 확인할 수 있다. 다만 렌더링 없는 전용 서버 환경 자체를 검증하는 것은 아니다.
5. UDP와 RDP의 차이
처음에는 UDP와 RDP라는 용어가 헷갈렸다.
- UDP: 게임 데이터가 오가는 통신 방식
- 7777/UDP: Unreal 게임 클라이언트가 서버에 접속하는 기본 포트
- RDP: Windows 서버 화면에 원격 접속하기 위한 Remote Desktop Protocol
- 3389/TCP: RDP가 주로 사용하는 포트
즉, RDP는 서버 관리용이고 UDP 7777은 실제 게임 접속용이다. 게임 클라이언트가 RDP 포트로 접속하는 것이 아니다.
6. 요청자에게만 보이는 Client RPC 시스템 로그
잘못된 입력을 공용 GameState 로그에 기록하면 상대 플레이어와 관전자에게도 보인다. 하지만 입력 거부 사유는 요청한 플레이어에게만 보여야 한다.
따라서 다음 흐름으로 구현했다.
로컬 UI 입력
→ 소유 PlayerController의 Server RPC
→ 서버 GameMode 검증
→ 거부 시 같은 PlayerController의 Client RPC
→ 요청자 GameLogText에만 [시스템] 로그 표시
Client RPC는 다음과 같이 선언했다.
UFUNCTION(Client, Reliable)
void ClientReceivePrivateSystemLog(const FString& Message);
서버는 요청을 거부할 때 해당 PlayerController로만 메시지를 보낸다.
if (!bAccepted)
{
SendPrivateSystemLog(ErrorMessage);
return;
}
클라이언트는 받은 메시지를 로컬 배열에 저장한다.
PrivateSystemLogEntries.Add(
FString::Printf(TEXT("[시스템] %s"), *SanitizedMessage));
화면의 GameLogText에는 공용 경기 로그와 로컬 개인 로그를 합쳐 표시한다. 개인 로그 배열은 복제하지 않으므로 상대 플레이어의 화면에는 나타나지 않는다.
현재 시스템 로그는 다음과 같이 한글로 표시된다.
[시스템] 구역은 3개까지만 선택할 수 있습니다.
[시스템] 현재 단계에서는 타자가 추측을 제출할 수 없습니다.
[시스템] 제한 시간이 끝난 뒤 추측이 도착했습니다.
[시스템] 채팅 메시지는 120자까지 입력할 수 있습니다.
7. 패키징 과정에서 발견한 문제
한글 프로젝트 경로
프로젝트의 상위 경로에 한글이 포함되어 MSVC가 중간 컴파일 파일을 만들지 못했다.
Cannot open compiler intermediate file
Invalid argument
영문 임시 경로로 복사하자 같은 코드가 정상적으로 컴파일됐다. 전용 서버 작업 전 프로젝트를 D:\MYBaseball 같은 영문 경로로 옮길 필요가 있다.
런처 엔진의 Target 제한
일반 Editor와 Game Target은 성공했지만 Client와 Server Target은 다음 메시지와 함께 실패했다.
Client targets are not currently supported from this engine distribution.
Server targets are not currently supported from this engine distribution.
따라서 Dedicated Server 단계에서는 UE 소스 빌드 엔진을 준비해야 한다.
Soft Reference 자산 누락
첫 패키지에서는 WBP_BaseballGame을 찾을 수 없다는 경고가 발생했다. UI 폴더를 DirectoriesToAlwaysCook에 추가한 후 해결됐다.
8. 현재까지 검증한 내용
- UE 5.7 Editor Target 컴파일
- 일반 Game Target 컴파일
- Windows Build, Cook, Stage, Pak, Archive
- 패키지에서 Lvl_UIOnly 로드
- MYBaseballGameMode 적용
- Blueprint UI 포함
- Client RPC 개인 시스템 로그 구현
- 시스템 로그 한글화
아직 U8 전체를 통과한 것은 아니다. 일반 Game 패키징은 완료했지만 Dedicated Server와 외부 접속 시험이 남아 있다.
9. 남은 작업
- 프로젝트를 영문 경로로 이동
- UE 소스 빌드 엔진 준비
- Client/Server Target 빌드
- Dedicated Server와 Client A/B 실행
- 개인 시스템 로그가 요청자에게만 보이는지 확인
- 외부 네트워크 또는 클라우드 VM 접속
- 주소, 포트, 방화벽, 프로세스, 맵, 로그 순서로 접속 실패 진단
- 테스트 후 인스턴스 중지·삭제와 비용 확인
- 팀원이 따라 할 수 있는 배포 문서 작성
오늘의 핵심 정리
PIE 성공만으로 배포 가능 상태라고 판단하면 안 된다. 코드뿐 아니라 맵과 UI 자산이 Cook에 포함되는지 실제 패키지를 실행해서 확인해야 한다.
또한 공용 상태는 GameState에 복제하지만, 특정 플레이어만 알아야 하는 입력 거부 사유는 소유 PlayerController의 Client RPC로 보내야 한다.
마지막으로 Dedicated Server 배포는 실행 파일만 만드는 작업이 아니다. 빌드 환경, 주소, UDP 포트, 방화벽, 서버 로그, 클라우드 비용과 종료 절차까지 하나의 배포 과정으로 봐야 한다.
'TIL' 카테고리의 다른 글
| [Project 4조참치] 게임 기획 회의를 ‘결정’보다 ‘검증 가능한 탐색’으로 운영해보기 (0) | 2026.08.11 |
|---|---|
| [Unreal Engine 멀티플레이] 멀티플레이 핵심 개념 통합 복습 (1) | 2026.08.10 |
| [Unreal Engine 멀티플레이] 게임 사이클과 복제 최적화 (1) | 2026.08.06 |
| [Unreal Engine 멀티플레이]전투·애니메이션·컴포넌트 동기화 (0) | 2026.08.05 |
| [Unreal Engine 멀티플레이] 남은 시간이 아닌 마감 시각을 복제하는 서버 권위 타이머 (0) | 2026.08.04 |