멀티플레이 게임은 싱글플레이와 무엇이 다른가
1강. 멀티플레이 게임은 싱글플레이와 무엇이 다른가
1. 이번 강의에서 해결할 문제
싱글플레이 Health를 80으로 바꾸면 화면도 곧바로 80입니다. 멀티플레이에서는 서버의 Character, 소유 클라이언트의 Character, 다른 클라이언트의 Character가 별도 객체이며 한 복사본을 바꿔도 나머지가 자동으로 정답이 되지 않습니다. “내 화면에서 맞았다”와 “서버가 맞았다고 판정했다”를 분리하지 않으면 데미지 중복, 점수 불일치와 치팅이 생깁니다.
2. 학습 목표
3. 핵심 개념
Unreal 멀티플레이의 기본은 중앙 서버가 정답 상태를 보유하는 클라이언트-서버 모델입니다. 각 클라이언트는 서버가 보내 준 관련 Actor의 복사본을 렌더링합니다. 로컬 입력은 즉각적인 카메라·UI 반응을 만들 수 있지만 월드에 영향을 주는 결정은 서버 요청과 검증을 거쳐야 합니다.
소유 클라이언트 입력
→ 소유 Actor의 Server RPC 요청
→ 서버가 거리·쿨다운·상태 검증
→ 서버 원본 Health/Score 변경
→ Replication이 관련 클라이언트에 상태 전달
→ RepNotify가 HUD·표현 갱신
복제는 매 프레임 전체 객체를 복사하는 기능이 아닙니다. 서버가 복제 대상으로 등록한 Actor와 Property를 연결별 relevancy, priority, dormancy와 전송 주기에 따라 보냅니다. 따라서 클라이언트 값은 서버보다 늦을 수 있고 중간 변화를 모두 관찰하지 못할 수도 있습니다.
4. 단계별 실습
파일 경로: Source/CaptureArena/Debug/NetworkProbe.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "NetworkProbe.generated.h"
UCLASS()
class CAPTUREARENA_API ANetworkProbe : public AActor
{
GENERATED_BODY()
public:
ANetworkProbe();
protected:
virtual void BeginPlay() override;
};
파일 경로: Source/CaptureArena/Debug/NetworkProbe.cpp
#include "Debug/NetworkProbe.h"
#include "Engine/World.h"
ANetworkProbe::ANetworkProbe()
{
PrimaryActorTick.bCanEverTick = false;
bReplicates = true;
}
void ANetworkProbe::BeginPlay()
{
Super::BeginPlay();
const UWorld* World = GetWorld();
UE_LOG(LogTemp, Display,
TEXT("[Probe] Actor=%s NetMode=%d LocalRole=%d RemoteRole=%d"),
*GetName(),
World ? static_cast<int32>(World->GetNetMode()) : -1,
static_cast<int32>(GetLocalRole()),
static_cast<int32>(GetRemoteRole()));
}
레벨에 BP_NetworkProbe 하나를 배치하고 PIE 플레이어 수를 2로 실행합니다. 서버와 두 클라이언트 문맥에서 같은 논리 Actor가 서로 다른 Role로 로그를 남기는지 확인합니다. 이번 강의에서는 숫자를 암기하지 말고 “서버 원본인가, 클라이언트 복사본인가”를 먼저 적습니다.
| 위치 | 입력 | 판정 | 보유 상태 | 화면 |
|---|---|---|---|---|
| 서버 | 원격 요청 수신 | 최종 규칙 실행 | 권위 있는 Health·Score | 리슨 서버면 로컬 화면도 있음 |
| 소유 클라이언트 | 로컬 입력 생성 | 결과를 확정하지 않음 | 서버 상태의 복사본 | 카메라·HUD·예측 표현 |
| 다른 클라이언트 | 해당 플레이어 입력 없음 | 결과를 확정하지 않음 | 관련 Actor 복사본 | 원격 캐릭터 표현 |
5. 코드가 동작하는 이유
bReplicates = true인 레벨 Actor는 서버와 관련 클라이언트에 네트워크 복사본을 가질 수 있습니다. 각 복사본은 독립된 C++ 객체이므로 BeginPlay도 각 문맥에서 실행됩니다. Role 로그는 코드가 어느 객체에서 실행됐는지 보여 주지만 상태를 자동으로 동기화하지는 않습니다. 다음 강의부터 서버만 규칙을 변경하고 복제가 결과를 전달하게 만듭니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
멀티플레이 게임은 싱글플레이와 무엇이 다른가 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.