Steam Online Subsystem을 사용해 친구 초대 및 멀티플레이 기능을 구현하던 중, 세션 생성과 참가(JoinSession)는 정상적으로 콜백이 오는데 실제로는 접속이 되지 않는 문제가 발생하였습니다. 특히 NetworkDriver 생성 실패, Listen 서버 생성 실패, P2P 연결 타임아웃 등 다양한 로그 메시지가 출력되면서 원인을 추적하는 데 많은 시간이 걸렸습니다.
이 글에서는 문제를 해결하기까지의 시행착오 과정을 정리하여, 비슷한 이슈를 겪는 분들께 참고가 될 만한 내용을 공유드리고자 합니다.
JoinSession 까지는 성공 로그가 뜸OnSessionUserInviteAccepted 성공JoinSession 성공Browse: steam.7656.../Game/Maps/MainMenu 까지 진행Your connection to the host has been lost. 로 실패
Failed to find object 'Class /Script/Engine.IpNetDriver' CreateNamedNetDriver failed to create driver from definition GameNetDriver Error initializing the pending net driver. Check the configuration of NetDriverDefinitions...
DefaultEngine.ini 에서 GameNetDriver 설정이 제대로 되어 있지 않아서, 엔진이 NetDriver 클래스를 찾지 못함
DefaultEngine.ini 에 다음과 같이 설정[/Script/Engine.GameEngine]!NetDriverDefinitions=ClearArrayNetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")InitBase PendingNetDriver (NetDriverDefinition GameNetDriver) 로 정상 초기화되는 것을 확인IpNetDriver 클래스를 못 찾는 에러는 발생하지 않음
InitBase PendingNetDriver (NetDriverDefinition GameNetDriver)Game client on port 7777, rate 100000Timed out attempting to connectYour connection to the host has been lost.LoadMap: failed to Listen(/Game/MainStage/L_GenerateMapTest?Name=Player?listen)LoadMap: failed to Listen(/Game/Maps/MainMenu?Name=Player?listen)?listen 옵션으로 Listen 서버를 열려고 시도했으나 실패OnCreateSessionComplete() 안에서 바로 ServerTravel + ?listen 수행ServerTravel 호출ServerTravel 을 수행하면 Listen 서버 생성이 실패할 수 있음?listen 으로 서버를 열려고 해도 계속 실패빌드 대상 변경
CrimsonMoonClient.Target.cs 기반 빌드 (클라이언트 전용)CrimsonMoon.Target.cs 기반 Game 타겟 빌드변경 후 현상
?listen 으로 정상적으로 Listen 서버를 생성JoinSession → Browse steam.xxx/Map → 정상 접속
?listen 으로 서버를 열고, 나머지는 그 호스트에 접속하는 구조CreateSession → OnCreateSessionComplete 콜백 확인/Game/Map/YourMap?listen 으로 ServerTravelOnSessionUserInviteAccepted 콜백JoinSession 호출, 성공 시 GetResolvedConnectString 으로 주소 획득ClientTravel 로 steam.XXX/Map 주소로 이동DefaultEngine.ini[/Script/Engine.GameEngine]!NetDriverDefinitions=ClearArrayNetDriverDefinitions=(DefName="GameNetDriver", DriverClassName="/Script/OnlineSubsystemSteam.SteamNetDriver", DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")ServerTravel 전용 함수CreateNamedNetDriver failed to create driver from definition GameNetDriverFailed to find object 'Class /Script/Engine.IpNetDriver'LoadMap: failed to Listen( ... ?listen)Timed out attempting to connectYour connection to the host has been lost.Relay candidates enabled by P2P_Transport_ICE_Enable, but P2P_TURN_ServerList is emptyDefaultEngine.ini) 과 NetDriver 설정을 초기 단계에서 정확히 맞춰둘 것이번 구현의 핵심은 코드나 Steam API 사용법 자체의 문제라기보다는, 빌드 타겟 선택(Game vs Client) 과 엔진 설정(NetDriver, Listen 서버 가능 여부) 이었습니다. 언리얼 멀티플레이를 Steam과 연동해서 구현할 때는, 에디터에서 잘 되던 것이 패키징 후 동작하지 않을 수 있으므로, 어떤 타겟으로 빌드하고 실행하는지부터 확실히 인지하는 것이 중요하다는 점을 다시 한 번 느꼈습니다.
이 TIL이 이후에 비슷한 문제를 겪을 때 빠르게 원인을 좁히는 데 도움이 되기를 바랍니다.