Post

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을 맵 에셋 이름과 동일하게 설정)
RowNameStageUIClassbIsGameplayStage
TitleMapWBP_Titlefalse
LobbyMapWBP_Lobbyfalse
StageSelectWBP_StageSelectfalse
MainGame(기존 인게임 UI)true

핵심 위젯(WBP) 구성 및 노드 로직

  1. WBP_Title (타이틀 화면):
    • 기능: 방 생성 / 방 참가(검색) / 새로고침 / 에러 메시지 표시
    • 로직: Construct 시 CrazyRooSessionSubsystem을 가져와 델리게이트 3개 바인딩.
    • 참가 버튼 클릭 시 패널을 열고 FindRooms() 호출. 5초 타이머와 “검색 중” 변수로 중복 호출을 방지.
  2. WBP_RoomRow (방 목록 아이템):
    • 표시: 방 이름, 인원수(N/4), 핑(Ping).
    • 로직: [참가] 클릭 시 JoinRoomByIndex(SearchResultIndex) 실행.
  3. WBP_Lobby (로비 화면):
    • 기능: 역할 선택, 플레이어 슬롯 표시, [준비] 토글, [게임 시작].
    • 로직: 0.2초 타이머로 GameState의 PlayerArrayJoinOrder 순으로 정렬하여 슬롯 갱신. (추후 OnRep 방식으로 최적화 가능)
    • 시작 버튼은 ‘방장 + 전원 준비 + 최소 인원 충족’ 시에만 활성화(서버에서 2차 검증).
  4. 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 OverrideLobbyMap(정확한 철자)으로 설정해야 합니다.

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. 에디터 테스트 시 (내부 실행 원리):
    1
    
    UnrealEditor.exe "프로젝트.uproject" TestMap -server -log -port=17777
    
  2. 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.