Unreal Engine 멀티플레이어 게임 개발 4-3
1. 디버그 로깅
// DedicatedX.h
#pragma once
#include "CoreMinimal.h"
#pragma region NetLogging
DEDICATEDX_API DECLARE_LOG_CATEGORY_EXTERN(LogDXNet, Log, All);
#define NETMODE_TCHAR ((GetNetMode()==ENetMode:: NM_Client) ? *FString::Printf(TEXT("Client%02d"),UE::GetPlayInEditorID()):((GetNetMode()==ENetMode::NM_Standalone)?TEXT("StandAlone"):TEXT("Server")))
#define FUNCTION_TCHAR (ANSI_TO_TCHAR(__FUNCTION__))
#define DX_LOG_NET(LogCategory, Verbosity,Format, ...) UE_LOG(LogCategory, Verbosity, TEXT("[%s] %s %s"), NETMODE_TCHAR, FUNCTION_TCHAR, *FString::Printf(Format, ##__VA_ARGS__))
#define LOCAL_ROLE_TCHAR *(UEnum::GetValueAsString(TEXT("Engine.ENetRole"), GetLocalRole()))
#define REMOTE_ROLE_TCHAR *(UEnum::GetValueAsString(TEXT("Engine.ENetRole"), GetRemoteRole()))
#define DX_LOG_ROLE(LogCat, Verbosity, Format, ...) UE_LOG(LogCat, Verbosity, TEXT("[%s][%s/%s] %s %s"), NETMODE_TCHAR, LOCAL_ROLE_TCHAR, REMOTE_ROLE_TCHAR, FUNCTION_TCHAR, *FString::Printf(Format, ##__VA_ARGS__))
#pragma endregion
// DedicatedX.cpp
#include "DedicatedX.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, DedicatedX, "DedicatedX" );
#pragma region NetLogging
DEFINE_LOG_CATEGORY(LogDXNet);
#pragma endregion
2. 이벤트 함수
AGameModeBase::PreLogin()
- 플레이어의 접속을 허용/차단할 수 있는 시점
AGameModeBase::PostLogin()
- 플레이어 로그인 성공 후 호출
- 서버에서 클라이언트의 NetConnection에 안전하게 접근할 수 있는 가장 이른 시점
APlayerController::PostNetInit()
- 클라이언트에서 ServerConnection에 안전하게 접근할 수 있는 가장 이른 시점
- 시작 관련 주요 이벤트 함수
PostInitializeComponents()
- 액터에 부착된 모든 컴포넌트 초기화 완료 후 호출
PostNetInit()
- 서버에서 액터의 속성 변경이 모두 완료된 뒤 클라이언트에 복제되었을 때 호출
- 멀티플레이에서 BeginPlay() 보다 항상 먼저 실행됨
StartPlay()
- 게임 시작을 지시하는 함수
- 모든 액터의 BeginPlay() 호출을 트리거
BeginPlay()
- StartPlay()에 의해 게임 시작 시 모든 액터에서 호출
- BeginPlay() 호출 과정
[Server] GameMode::StartPlay()
↓
[Server] GameState::HandleBeginPlay()
↓ 복제
[Client] GameState::OnRep_ReplicatedHasBegunPlay()
↓
[Client] 모든 액터::BeginPlay()
- Possess
APawn::PossessedBy(AController* NewController)
- Controller가 Pawn을 빙의했을 때 호출
- 서버 전용 (클라이언트에서는 호출되지 않음)
- 빙의 시점에 RemoteRole이 SimulatedProxy → AutonomousProxy로 변경됨
- 매개변수로 빙의한 Controller를 받음
APawn::Unpossessed()
- Controller가 Pawn의 빙의를 해제했을 때 호출
- 서버 전용 (클라이언트에서는 호출되지 않음)
- 이전 Controller 참조를 매개변수로 받지 않음 (주의)
- 사망, Pawn 전환, Controller 소멸 시 발생
3. 언리얼 네트워크에서 사용되는 데이터 단위
넷커넥션 (NetConnection)
- 모든 멀티플레이 데이터가 드나드는 통로
- 서버: 클라이언트 수만큼 보유 / 클라이언트: 단 하나만 보유
채널 (Channel)
- 넷커넥션이 관리하는 데이터 흐름 단위
- 종류: ActorChannel / ControlChannel / VoiceChannel
- ActorChannel → Actor Replication 담당
패킷 (Packet)
- 네트워크 표준 데이터 전송 단위
번치 (Bunch)
- 언리얼 전용 패킷 단위

4. 흐름
'내배캠Unreal_TIL > UE' 카테고리의 다른 글
| [TIL] 2026-03-18 | UE 숫자 야구 게임 (0) | 2026.03.18 |
|---|---|
| [TIL] 2026-03-17 | Replication (0) | 2026.03.17 |
| [TIL] 2026-03-13 | 게임 플레이 프레임워크 (2) | 2026.03.13 |
| [TIL] 2026-03-12 | Property Replication (0) | 2026.03.12 |
| [TIL] 2026-03-11 | 반투명 머티리얼 만들기 (0) | 2026.03.11 |
