개요
언리얼 네트워크 멀티플레이 게임에서 "내 화면에 상대방 화면을 띄우는" 최적의 방법은 무엇인가?
It Takes Two의 화면 분할을 모작 구현할 때, 네트워크 게임이므로 LocalPlayer는 1명뿐이지만, 하지만 화면은 2개가 필요하다.
Gemini와 ChatGPT에게 It Takes Two의 화면 분할을 구현할 수 있는 방법에 대해서 물어봤다.
1. 가짜 LocalPlayer 생성 (SplitScreen)
- 구현 원리
- 언리얼 엔진은 기본적으로 한 PC에 컨트롤러가 2개 연결된 '로컬 멀티플레이'를 지원하는데, 이를 이용해 실제로는 플레이어가 1명이지만, 강제로 '가짜 플레이어(Dummy LocalPlayer)'를 하나 더 생성한다.
- 장점: 구현 쉬움 (엔진 기본 기능).
- 단점: 입력(Input) 처리가 복잡해짐, 5:5 비율 고정, 불필요한 컨트롤러 생성.
2. UMG + SceneCapture (구현 완료)
- 구현 원리
- 파트너의 위치에
SceneCaptureComponent2D를 설치하고, 찍은 영상을 텍스처(RenderTarget)로 만들어서 UI 위젯(UImage)에 넣어서 게임 화면 위에 덮어 씌운다.
- 장점: 배치가 자유로움, 구현이 직관적.
- 단점: UI 오버드로우(Overdraw) 발생 가능성, 렌더링 파이프라인 후처리로 인한 색감 왜곡, 성능 이슈.
[멀티플레이어 화면 분할]_1-1. RenderTarget, SceneCapture2D
3. GameViewportClient::Draw 오버라이드
- 구현 원리
- 엔진이 화면을 그리는 최종 단계인
Draw 함수에 직접 개입
- 장점: 렌더링 파이프라인 직접 제어, 불필요한 렌더링 최소화 (
LayoutPlayers로 뷰포트 크기 조절), 최적화 유리.
- 단점: 구현 난이도 높음 (엔진 내부 코드 이해 필요), 크래시 위험.
결론:
"성능과 최적화를 위해 가장 Low-level인 GameViewportClient 방식을 도전해 보겠다."