패키징 후 테스트 중 계속 9분 47초에서 서버가 자동 종료됐다
서버 빌드에 카메라, UI(UMG), 사운드 등 클라이언트 전용 코드가 포함되어 있었음
전용 서버는 렌더링이나 오디오 처리를 지원하지 않기 때문에 이런 코드가 실행될 경우 Crash 또는 프로세스 종료로 이어진다고 한다..
고치는 방법을 찾아봤다
방법 ①: 서버/클라이언트 브랜치를 분리해 각각 필요한 코드만 유지
방법 ②: 하나의 코드베이스에서 IsRunningDedicatedServer() 조건으로 분기 처리
튜터님께 여쭤보니까
카메라, UI, 사운드 로직들을 IsLocallyControlled() 함수나 HasAuthority() 함수로 분기 방법을 추천해주셔서 그 방식으로 고치기!
각 맵별 GameMode, PlayerController, HUD/Widget, Character, GameState, PlayerState 등에서 클라이언트전용(UMG/UI, 사운드, 카메라)과 서버전용(게임 룰, 상태 관리) 코드 구분 대상 파악
어떤 코드는 서버에서만, 어떤 코드는 클라이언트에서만 동작해야 하는지 설계
카메라, UI, 사운드 등의 클라이언트 전용 로직은 IsLocallyControlled() 또는 GetNetMode() == NM_Client 등 클라이언트 로컬 여부로 분기 처리
* 특히 각 GameMode, PlayerController, HUD, Character, GameState 등에 집중 적용
‘Switch on Net Mode’ 노드 등으로 클라이언트 전용 UI, 사운드, 카메라 로직만 클라이언트에서 동작하게 조치
| 용도 | 추천 함수 | 설명 |
|---|---|---|
| 클라이언트 로컬처리 (UI, 카메라, 사운드) | IsLocallyControlled() | 클라이언트 개별 플레이어에만 적용되는 로직 분기 |
| 서버 권한 처리 (주로 게임 룰, 상태, 점수) | HasAuthority() | 권한이 있는 인스턴스(서버)에만 적용되는 로직 분기 |
| 데디케이티드 서버 체크 | IsRunningDedicatedServer() | 서버 전용 여부 체크 (UI/사운드 완전 차단 시 사용 가능) |
// UI/카메라/로컬 사운드 등 클라이언트 전용 처리
if (IsLocallyControlled())
{
// UI, 카메라, 사운드 등 클라이언트 전용 로직
}
// 서버 전용 게임 처리
if (HasAuthority())
{
// 서버 권한 로직
}
IsRunningDedicatedServer() 또는 GetNetMode() 검사를 추가하는 것도 좋음!