언리얼 에디터에서 네트워킹 옵션 테스트하기
언리얼 에디터(Unreal Editor) 에는 멀티플레이어 프로젝트를 테스트할 때 활용할 수 있는 조정 가능한 세팅들이 있습니다. 그 옵션으로는 플레이어 수(Number Of Players) 설정, 플레이 창 다중 실행, 데디케이티드 서버(Dedicated Server) 실행이 있습니다.
이러한 세팅을 확인하려면 에디터 를 실행하고 툴바 로 이동한 다음 플레이(Play) 옆의 모드(Modes) 드롭다운 화살표 를 클릭합니다.
에디터에서 멀티플레이어 세팅을 조정하는 법에 관한 자세한 정보는 테스팅 멀티플레이어를 참조하세요.
데디케이티드 서버 실행하기
멀티플레이어 게임을 실행하는 다른 방법들도 있습니다. 별개의 데디케이티드 서버 인스턴스를 실행하려면 다음 단계에 따르세요.
모드 드롭다운 화살표에서 고급 세팅 을 선택하거나, 에디터 개인설정(Editor Preferences) > 레벨 에디터(Level Editor) > 플레이(Play) > 멀티플레이어 옵션(Multiplayer Options) 으로 이동할 수 있습니다.
멀티플레이어 옵션(Multiplayer Options) 카테고리 에서 개별 서버 실행(Launch Separate Server) 변수로 이동한 다음 박스를 클릭하여 부울을 true 로 설정합니다.
넷 모드 플레이(Play Net Mode) 변수에 근접한 드롭다운 메뉴를 클릭하고 독립형 플레이(Play Standalone) 를 선택합니다.
그러면 새로운 서버 인스턴스가 생성되지만, 다른 인스턴스가 자동으로 연결되지는 않습니다.
독립형 서버 인스턴스에 연결하기
다음 명령을 사용하면 독립형 인스턴스 를 서버 에 연결할 수 있습니다.
open 127.0.0.1:<port number>
세션 인터페이스를 사용할 수도 있습니다. 이렇게 하면 서버에서 실행되는 게임 인스턴스가 생성되고, 다른 클라이언트가 발견하고 참가할 수 있습니다. 프로젝트의 연결 플로를 테스팅하는 데 유용한 기능입니다.
넷 모드 플레이(Play Net Mode) 변수가 클라이언트로 플레이(Play as Client) 로 설정된 경우 데디케이티드 서버 인스턴스를 실행하는 데 필요하지 않기 때문에 개별 서버 실행(Launch Separate Server) 변수를 활성화할 필요가 없습니다.
에디터의 넷 모드(Net Mode) 옵션 에서 클라이언트로 플레이(Play as Client) 나 리슨 서버로 플레이(Play As Listen Server) 를 사용하면 해당 인스턴스들은 IP 주소를 통해 자동으로 상호 연결됩니다. 이는 클라이언트 에서 open 127.0.0.1:17777
명령을 실행하여 서버 에 연결하는 것과 동일합니다.
이 연결 프로세스는 세션 인터페이스(Session Interface) 를 사용하지 않으므로, 서버가 온라인 멀티플레이어 세션을 생성하지 않으며 클라이언트는 세션을 검색하고 참가하지 않습니다. 대부분의 게임플레이 테스팅 목적에는 별다른 영향을 주지 않지만, 음성 채팅과 같이 세션 인터페이스에 의존하는 특정 온라인 기능들은 사용할 수 없습니다.
단일 프로세스 하 실행(Run Under One Process) 변수에 인접한 박스가 활성화되어 있으면 모든 클라이언트와 서버 인스턴스가 에디터와 동일한 틱 속도 를 공유합니다.
인스턴스를 개별적으로 실행하는 것과는 다른 행동입니다. 한 예로 독립형 모드 에서는 BaseEngine.ini 파일의 NetServerMaxTickRate 환경설정 값을 사용하여 서버의 틱 속도를 제어할 수 있습니다.
[/Script/OnlineSubsystemUtils.IpNetDriver]
NetServerMaxTickRate=30
환경설정 값을 수정하면 단일 넷 업데이트의 대역폭 제한 계산과 같이 틱 속도를 사용하는 특정 행동에 영향을 미칠 수 있습니다.
에디터에서 플레이(Play-In-Editor, PIE)를 사용하면 서버/클라이언트 이동과 같은 기능에 제약이 생깁니다. 이러한 기능을 테스트하려면 프로젝트를 에디터 외부에서 독립형 모드의 개별 프로세스로 실행해야 합니다.
인스턴스를 개별 프로세스로 실행하면 한 인스턴스는 에디터에서 플레이로 간주되고 다른 인스턴스는 독립형으로 간주됩니다. 그러면 모든 인스턴스를 에디터에서 플레이 또는 독립형으로 일관되게 실행할 때와 행동이 달라질 수 있습니다. 예를 들어 경로를 네트워크 전체로 보낸 스태틱 액터의 PIE 접두사를 추가하거나 제거하려면 UEditorEngine::NetworkRemapPath 함수를 호출해야 합니다.
다중 클라이언트 및 서버 인스턴스 디버깅
다중 클라이언트 및 서버 인스턴스 실행에는 고유한 어려움이 따릅니다. 어떤 인스턴스에 어태치되는지 파악하는 것이 특히 어렵습니다. PIE 인스턴스 디버깅을 지원하는 중단점을 사용하면 이러한 어려움을 완화할 수 있습니다.
코드 에디터에서 감시(Watch) 창에 다음 변수를 추가하면 됩니다.
감시 변수 |
용도 |
---|---|
UE4Editor-Engine!GPlayInEditorContextString |
현재 단계를 거치고 있는 인스턴스를 결정합니다. |
NetDriver's ServerConnection |
클라이언트에서 이 변수는 NetConnection에서 서버로의 레퍼런스를 보유합니다. 서버에서 이 값은 Null이 되므로 리플리케이션 시스템을 디버깅할 때 현재 사용 중인 인스턴스를 빠르게 확인할 수 있습니다. |
또한 감시에 함수 GetLocalRole() 호출을 배치하거나 코드에서 직접 호출하여 액터의 역할 프로퍼티를 확인할 수 있습니다. GetLocalRole 함수는 인스턴스가 이 액터를 제어하는 정도를 반환합니다. 리플리케이트된 액터 내에서 문제를 디버깅한다면, 이 함수는 다음 세 가지 역할 중 하나를 반환합니다.
역할 |
설명 |
---|---|
ROLE_Authority |
서버 인스턴스에 존재하는 액터. |
ROLE_AutonomousProxy |
이 클라이언트 인스턴스에서 로컬 플레이어 컨트롤러(PlayerController)가 소유한 캐릭터나 폰인 액터. |
ROLE_SimulatedProxy |
클라이언트 인스턴스에 존재하는 액터. |
네트워크 게임 프로파일링
네트워킹 인사이트를 사용하여 네트워크 게임을 프로파일링할 수 있습니다. 네트워킹 인사이트는 프로젝트의 네트워크 트래픽을 분석, 디버그, 최적화하는 데 활용할 수 있는 세부 정보를 제공하는 언리얼 인사이트(Unreal Insights) 프로파일링 툴의 컴포넌트입니다.
툴의 패킷 개요 패널(Packet Overview Panel) 에서 각 열은 단일 패킷에 대응하며, 패킷 콘텐츠 패널(Packet Content Panel) 은 선택한 패킷 내에서 콘텐츠, 오프셋, 크기 등의 데이터를 포함한 각 요소를 포괄적으로 보여줍니다.
패킷에 마우스를 올리면 정보가 표시됩니다
넷 통계(Net Stats) 패널은 이벤트의 수 및 총/최대 포함 크기(비트)와 같은 네트워킹 트레이스 이벤트에 대한 정보를 제공하며, 이러한 이벤트는 발생한 위치를 기반으로 수준별로 구성됩니다. 네트워킹 인사이트를 설정하고 사용하는 방법에 대한 추가 정보를 확인할 수 있습니다.
이벤트가 수준별로 그룹화된 넷 통계 패널
언리얼 엔진에는 프로젝트의 네트워크 트래픽을 다른 관점에서 볼 수 있는 레거시 툴인 네트워크 프로파일러(Network Profiler)도 포함되어 있습니다. 네트워크 프로파일러는 네트워킹 인사이트만큼 상세한 정보를 제공하진 않지만, 게임에서 사용하는 대역폭 용량의 대략적인 개요 및 개별 액터, 프로퍼티, RPC에 대한 통계를 제공합니다.
Gauntlet 자동화 프레임워크
Gauntlet 자동화 프레임워크(Gauntlet Automation Framework)는 서버-클라이언트와 같은 다중 세션 실행을 지원하며, 멀티플레이어 프로젝트를 테스트하고 유효성을 검사할 때 매우 효과적인 툴입니다.
ShooterGame 프로젝트에는 멀티플레이어 게임에 Gauntlet을 사용한 자동화 스크립트의 샘플이 구현되어 있습니다. 테스트를 구동하는 ShooterGame 자동화 C#는 /Build/Scripts folder
에 위치하며, /Source/ShooterGame/Private
및 Public/Tests
디렉터리에 위치한 프로젝트의 네이티브 테스트 컨트롤러 코드에도 있습니다.
기능 테스트
언리얼 엔진에는 Runtime:Engine:ALevelScriptActor레벨 블루프린트(Level Blueprint)를 통해 기능 테스트(Functional Tests)를 설정하고 실행하는 기능이 포함되어 있습니다. 기능 테스트를 처음 할 실행할 때는 프로젝트의 단일 인스턴스에서 실행해야 합니다. 그 후에는 멀티플레이어 프로젝트에서 테스트를 실행할 수 있습니다. 클라이언트 인스턴스, 데디케이티드 서버, 리슨 서버 인스턴스에서 테스트가 포함된 레벨을 시작할 수 있습니다.
클라이언트와 서버 양쪽에서처럼 다중 인스턴스에서 실행되는 기능 테스트 설정은 현재 지원되지 않습니다. 원하는 기능이 작동하지 않는 시나리오의 예시로, 서버가 리플리케이트된 프로퍼티를 새로운 값으로 설정하고 클라이언트가 이 새로 리플리케이트된 값을 받았는지 확인하는 경우를 들 수 있습니다.