Unreal Hub/Unreal Lab

[SeSAC, Unreal Network] 2025. 04. 02

likepint 2025. 4. 2. 11:41

네트워크 구조 (Unreal)

멀티플레이어는 클라이언트-서버 모델
  • 서버: 게임의 권한(Authority)을 가지며, 게임 상태를 관리하고 클라이언트 간 동기화를 담당
  • 클라이언트: 플레이어가 접속하는 인스턴스로, 서버로부터 데이터를 받아 렌더링하고 사용자 입력을 서버로 전송
  • 레플리케이션(Replication): 서버와 클라이언트 간 데이터를 동기화하는 메커니즘

서버

크게 Dedicated, Listen, Peer-to-Peer(P2P)로 나누어지며, 언리얼에서는 기본적으로 P2P를 지원하지 않음

데디케이티드 서버

  • 정의
    - 클라이언트와 독립적으로 실행되는 서버 전용 인스턴스
    - 플레이어가 직접 접속하는 클라이언트와는 별도로, 오직 게임 로직과 상태 관리만을 처리
  • 특징
    - 렌더링 없음: 그래픽 렌더링을 하지 않으므로, UI, 그래픽, 사운드 등이 필요없어 리소스 사용량이 적음
    - 권한: 모든 게임 상태에 대한 권한을 가지며, 클라이언트는 서버의 지시에 따라 동작
    - 성능: 여러 클라이언트를 안정적으로 관리 가능하여, 대규모 멀티플레이어 게임에 적합
    - 호스팅: 일반적으로 별도의 서버 하드웨어(예: AWS, Azure)에서 실행
  • 사용 사례
    - 대규모 멀티플레이어 게임(예: Fortnite, PUBG)
    - 공정한 게임 환경이 중요한 경쟁 게임

Listen Server (리슨 서버)

  • 정의
    - 한 플레이어(호스트)가 '서버' 역할을 하고 다른 여러 플레이어가 '클라이언트' 역할을 하여 접속하는 패턴
  • 특징
    - 혼합 역할: 호스트는 클라이언트(자신의 게임 화면 렌더링)와 서버(다른 클라이언트 관리)를 동시에 수행
    - 권한: 호스트가 서버 역할을 하므로, 호스트가 게임 상태를 관리
    - 간단한 설정: 별도의 서버 하드웨어가 필요 없음
  • 사용 사례
    - 소규모 협동 게임(예: Valheim, Minecraft 스타일)
    - 테스트 및 프로토타입 개발

Dedicated And Listen (Server)

 
Dedicated Server (전용 서버) Listen Server
장점 안정적이고 확장 가능
클라이언트가 종료되어도 게임 유지
대규모 멀티플레이어 지원 가능
별도의 서버 인프라 불필요
설정이 간단하여 소규모 게임에 적합
단점 서버 인프라 비용이 발생
초기 설정과 배포가 복잡
호스트 네트워크 상태에 의존적
호스트 종료 시 세션 종료, 성능 부담
네트워크 의존성 서버의 네트워크 성능에 의존
클라이언트 간 지연 최소화 가능
호스트의 네트워크 성능에 의존
인터넷이 느리면 모든 클라이언트에 영향
치팅 방지 서버가 모든 권한을 가지므로 효과가 높음 호스트가 클라이언트이므로 상대적으로 어려움

참고문서

Introduction | An Unreal Engine Blog by Cedric Neukirchen


Editor Settings

 

ThirdPersonCharacter 설정 변경

GetCharacterMovement()->bOrientRotationToMovement = false;
GetCharacterMovement()->bUseControllerDesiredRotation = true;
    
CameraBoom->TargetArmLength = 150.0f;
CameraBoom->SetRelativeLocation(FVector(0, 40, 60));

 

UCNetPlayAnimInstance 생성

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "CNetPlayerAnimInstance.generated.h"

UCLASS()
class SESAC_NETWORK_API UCNetPlayerAnimInstance : public UAnimInstance
{
	GENERATED_BODY()
	
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MyAnimSettings")
	bool bHasPistol = false;

};
bHasPistol 변수(피스톨을 들고 있는 상태인지 판단)를 추가

 

만들어둔 BS_PistolMove를 Locomotion StateMachine에 추가하여 Conduit으로 bHasPistol 변수로 판단하여 변경