[CH4-21] 서버와 클라이언트 분기

김여울·2025년 10월 8일

내일배움캠프

목록 보기
93/139

상황

패키징 후 테스트 중 계속 9분 47초에서 서버가 자동 종료됐다
서버 빌드에 카메라, UI(UMG), 사운드 등 클라이언트 전용 코드가 포함되어 있었음
전용 서버는 렌더링이나 오디오 처리를 지원하지 않기 때문에 이런 코드가 실행될 경우 Crash 또는 프로세스 종료로 이어진다고 한다..

고치는 방법을 찾아봤다

방법 ①: 서버/클라이언트 브랜치를 분리해 각각 필요한 코드만 유지
방법 ②: 하나의 코드베이스에서 IsRunningDedicatedServer() 조건으로 분기 처리

튜터님께 여쭤보니까
카메라, UI, 사운드 로직들을 IsLocallyControlled() 함수나 HasAuthority() 함수로 분기 방법을 추천해주셔서 그 방식으로 고치기!

해야할 것들

1. 전체 코드 구조 분석 및 분기 필요 대상 정리

각 맵별 GameMode, PlayerController, HUD/Widget, Character, GameState, PlayerState 등에서 클라이언트전용(UMG/UI, 사운드, 카메라)과 서버전용(게임 룰, 상태 관리) 코드 구분 대상 파악

2. 서버/클라이언트 로직 명확히 구분 설계

어떤 코드는 서버에서만, 어떤 코드는 클라이언트에서만 동작해야 하는지 설계

3. 코드 내 분기문 삽입 시작 (C++ 기준)

카메라, UI, 사운드 등의 클라이언트 전용 로직은 IsLocallyControlled() 또는 GetNetMode() == NM_Client 등 클라이언트 로컬 여부로 분기 처리
* 특히 각 GameMode, PlayerController, HUD, Character, GameState 등에 집중 적용

4. 블루프린트 분기 처리 적용

‘Switch on Net Mode’ 노드 등으로 클라이언트 전용 UI, 사운드, 카메라 로직만 클라이언트에서 동작하게 조치

적절한 분기 처리 방법

용도추천 함수설명
클라이언트 로컬처리 (UI, 카메라, 사운드)IsLocallyControlled()클라이언트 개별 플레이어에만 적용되는 로직 분기
서버 권한 처리 (주로 게임 룰, 상태, 점수)HasAuthority()권한이 있는 인스턴스(서버)에만 적용되는 로직 분기
데디케이티드 서버 체크IsRunningDedicatedServer()서버 전용 여부 체크 (UI/사운드 완전 차단 시 사용 가능)

IsLocallyControlled()

  • 의미: 해당 Pawn 또는 PlayerController가 '현재 클라이언트 내에서 직접 조작되는지' 여부
  • 사용처: 클라이언트 전용 카메라 설정, UI 생성, 클라이언트 입력 처리 등
  • 주의: 서버 측에서는 항상 false이므로, 서버 전용 코드 안에서는 이 함수를 쓰면 안 됨
  • 결론: 카메라, UI, 사운드같이 클라이언트 로컬에서만 작동해야 하는 요소 분기에 적합

HasAuthority()

  • 의미: 해당 Actor가 '현재 실행 중인 인스턴스에서 권한을 가졌는지(주로 서버)' 여부
  • 사용처: 서버에서만 동작해야 하는 게임 로직, 상태 처리, 점수 계산 등
  • 주의: 클라이언트에서도 true일 수 있는 경우(예: Listen Server) 있으니 완전한 서버 전용 체크 아님
  • 결론: 서버 전용 게임 로직 분기 때 주로 사용하며, UI/카메라 용으로는 적절하지 않음
// UI/카메라/로컬 사운드 등 클라이언트 전용 처리
if (IsLocallyControlled())  
{  
    // UI, 카메라, 사운드 등 클라이언트 전용 로직  
}

// 서버 전용 게임 처리
if (HasAuthority())  
{  
    // 서버 권한 로직  
}
  • 보통 데디케이티드 서버 여부 체크용으로 IsRunningDedicatedServer() 또는 GetNetMode() 검사를 추가하는 것도 좋음!

블루프린트 내 분기 처리

  • Switch on Net Mode 노드 사용
    • BeginPlay나 위젯 생성 시 ‘Switch on Net Mode’ 노드를 추가
    • ‘Dedicated Server’ 분기에서는 클라이언트 전용 UI, 사운드, 카메라 노드를 아예 실행하지 않도록 함
    • ‘Client’ 분기에서만 클라이언트 전용 코드 실행
  • Is Locally Controlled 노드 사용
    • 플레이어 Pawn 또는 컨트롤러 블루프린트에서 ‘Is Locally Controlled’ 노드 사용 가능
    • 로컬 플레이어에서만 카메라, UI, 사운드 관련 노드를 실행하도록 분기 처리
  • 사운드 재생 주의
    • 서버에서 SpawnSound2D 등 사운드 스폰을 하지 말고, 플레이어 로컬에서만 PlaySound2D를 활용하는 식으로 분기

0개의 댓글