2026-07-08 TIL (93일차)
2026-07-08 TIL (93일차)
CrazyRoo 멀티플레이어: UI 프레임워크 구축 및 서버 구동 원리
1. Phase 2: 테스트 맵 및 UI 세팅 (프레임워크 연결)
기존에 구축해둔 데이터 테이블과 LocalPlayerSubsystem::ShowStageUI 파이프라인을 재활용하여 맵 이동 시 UI가 자동으로 전환되도록 시스템을 구축했습니다.
맵 & 데이터 테이블 설정
- 빈 레벨 3개 생성:
TitleMap,LobbyMap,StageSelect(Empty Level + PlayerStart 세팅) - Maps & Modes 설정: Game Default Map =
TitleMap/ Server Default Map =LobbyMap - 데이터 테이블 매핑: (RowName을 맵 에셋 이름과 동일하게 설정)
| RowName | StageUIClass | bIsGameplayStage |
|---|---|---|
| TitleMap | WBP_Title | false |
| LobbyMap | WBP_Lobby | false |
| StageSelect | WBP_StageSelect | false |
| MainGame | (기존 인게임 UI) | true |
핵심 위젯(WBP) 구성 및 노드 로직
WBP_Title(타이틀 화면):- 기능: 방 생성 / 방 참가(검색) / 새로고침 / 에러 메시지 표시
- 로직: Construct 시
CrazyRooSessionSubsystem을 가져와 델리게이트 3개 바인딩. - 참가 버튼 클릭 시 패널을 열고
FindRooms()호출. 5초 타이머와 “검색 중” 변수로 중복 호출을 방지.
WBP_RoomRow(방 목록 아이템):- 표시: 방 이름, 인원수(N/4), 핑(Ping).
- 로직: [참가] 클릭 시
JoinRoomByIndex(SearchResultIndex)실행.
WBP_Lobby(로비 화면):- 기능: 역할 선택, 플레이어 슬롯 표시, [준비] 토글, [게임 시작].
- 로직: 0.2초 타이머로 GameState의
PlayerArray를JoinOrder순으로 정렬하여 슬롯 갱신. (추후OnRep방식으로 최적화 가능) - 시작 버튼은 ‘방장 + 전원 준비 + 최소 인원 충족’ 시에만 활성화(서버에서 2차 검증).
WBP_StageSelect(스테이지 선택 화면):- 기능: 스테이지 버튼 클릭 시
RequestMap("MainGame")호출 (전원 이동). - ★ 동기화 처리: 트래블 직후
PlayerState복제가 위젯 생성보다 늦을 수 있음. 따라서 처음엔 전원 버튼을 비활성화하고, 0.2초 루핑 타이머로PlayerState유효성을 확인. 이후IsHost()를 판정해 방장만 버튼을 활성화하고 비방장에게는 “방장이 선택 중”이라는 텍스트를 표시함.
- 기능: 스테이지 버튼 클릭 시
2. Phase 3: 에디터 통합 테스트 플로우
패키징 전 에디터 환경에서 멀티플레이 플로우를 완벽히 테스트하기 위해 실행 방식을 분리했습니다.
테스트 방식 설정
- 방식 A (세션 풀 플로우):
TitleMap을 열어둔 상태로 Play Standalone 모드. Run Under One Process 해제(Null LAN 검색용), Launch Separate Server 체크. Server Map Override =LobbyMap. - 방식 B (로비 빠른 반복): Play as Client 모드 (타이틀 생략, 바로 로비 진입).
- 방식 C (커맨드라인): 배포 환경과 동일하게 에디터 실행 파일에 인자를 넘겨 실행.
2인 풀 플로우 체크리스트 (방식 A)
- 서버 로그에
CreateSession완료 확인 - 클라 1: [방 생성] ➔ 자동 입장 ➔ 왕관(방장) 표시
- 클라 2: [방 참가] ➔ (필요시 새로고침) ➔ 1/4 확인 ➔ 참가
- 역할 중복 선택 시 거부되는지 확인
- 클라 1, 2 모두 준비 시 방장에게만 [게임 시작] 버튼 활성화
- 게임 시작 ➔ 두 클라이언트 모두
StageSelect도착 (★방장 권한 복원 검증) - 스테이지 선택 ➔
MainGame도착 후 역할 유지 확인
3. 트러블슈팅: “참가했더니 타이틀로 돌아갑니다!”
현상 및 원인 분석
방 목록에서 [참가]를 눌렀는데 타이틀 화면이 다시 나오는 현상. 이는 접속에 실패해 튕긴 것이 아니라, 접속에 성공한 서버의 맵이 하필 타이틀 맵이었기 때문입니다. (에디터 설정 누락)
- 판별법 (NetMode 확인): 창 제목줄이
NetMode: Standalone에서NetMode: Client로 바뀌어 있다면 접속은 성공한 것입니다. 서버가 잘못된 맵(타이틀)을 열고 있는 것입니다.
해결 방법
- Editor Preferences ➔ Play ➔ Multiplayer Options ➔ Server Map Name Override를
LobbyMap(정확한 철자)으로 설정해야 합니다.
4. 핵심 지식: 에디터 설정과 커맨드라인(CLI)의 비밀
“나중에 데디케이티드 서버를 배포할 때 어떻게 실행하나요?”에 대한 해답입니다. 에디터의 멀티플레이 설정 칸들은 사실 서버 실행 파일 뒤에 붙는 커맨드라인 인자(Arguments)를 GUI로 입력받는 것에 불과합니다.
에디터 설정 vs 커맨드라인 1:1 매칭
| 언리얼 에디터 Play 설정 | 커맨드라인(CLI) 적용 위치 |
|---|---|
Server Map Name Override (TestMap) | exe 경로 바로 뒤, 대시(-) 없는 첫 번째 인자 |
Additional Server Launch Parameters (-log) | 맵 이름 뒤에 붙는 실행 옵션 |
Server Port (17777) | -port=17777 형태로 옵션에 추가 |
배포 시 실행 구조 비교
- 에디터 테스트 시 (내부 실행 원리):
1
UnrealEditor.exe "프로젝트.uproject" TestMap -server -log -port=17777
- AWS 실제 배포 시 (패키징된 서버):
1
CrazyRooServer.exe TestMap -log -port=7777
(패키징 후에는
exe이름이 바뀌고,.uproject와-server인자가 필요 없어집니다.)
요약: 윈도우 바로가기나 AWS 터미널에서 실행할 때 맵 이름은
exe바로 다음 첫 번째 칸에 넣고,-log나-port같은 옵션은 그 뒤에 순서 무관하게 적어주면 됩니다. 현재 에디터에서 세팅하는 과정 자체가 실제 서버 배포를 위한 완벽한 예행연습입니다.
This post is licensed under CC BY 4.0 by the author.