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 변수로 판단하여 변경