언리얼 엔진의 멀티플레이 네트워킹을 이해하기위해 클라이언트-서버 모델과 레플리케이션(Replication) 개념을 중심으로 학습했음.
언리얼은 클라이언트-서버 모델을 사용하여 멀티플레이를 처리한다. 이를 통해 데이터 일관성을 유지하면서 여러 플레이어가 동일한 게임 환경을 공유할 수 있음.
Dedicated Server (전용 서버)
Listen Server (호스트 플레이어 서버)
Peer-to-Peer (P2P) (언리얼 기본 지원 없음)
언리얼에서는 다양한 클래스를 사용하여 멀티플레이를 관리한다.
서버에서 데이터를 클라이언트에 동기화하는 기능. 특정 변수를 UPROPERTY(Replicated)
로 선언하거나, AActor::GetLifetimeReplicatedProps()
를 오버라이드하여 레플리케이션을 설정할 수 있다.
UCLASS()
class AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
UPROPERTY(Replicated)
int32 PlayerScore;
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
};
void AMyCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyCharacter, PlayerScore);
}
클라이언트가 서버에 요청을 보내 특정 함수를 실행할 수 있다.
UFUNCTION(Server, Reliable, WithValidation)
void Server_DoAction();
void AMyCharacter::Server_DoAction_Implementation()
{
// 서버에서 실행될 코드
}
bool AMyCharacter::Server_DoAction_Validate()
{
return true; // 검증 로직 추가 가능
}
서버가 모든 클라이언트에 특정 함수 실행을 요청할 때 사용.
UFUNCTION(NetMulticast, Reliable)
void Multicast_PlayEffect();
void AMyCharacter::Multicast_PlayEffect_Implementation()
{
// 모든 클라이언트에서 실행
}
언리얼 엔진의 RPC(Remote Procedure Call)에서 함수 호출 시, Reliable과 Unreliable을 선택할 수 있다.
네트워크 환경에서 성능과 신뢰성을 최적화하기 위해 이 두 가지를 적절히 사용하는 것이 중요.
Reliable을 사용해야 하는 경우:
UFUNCTION(Server, Reliable, WithValidation)
void Server_HandlePlayerDeath();
🔥 위 함수는 서버에서 플레이어 사망 처리를 수행하는 RPC이며, 패킷이 손실되면 반드시 재전송되어야 하므로 Reliable
을 사용.
Unreliable을 사용해야 하는 경우:
UFUNCTION(NetMulticast, Unreliable)
void Multicast_PlayHitEffect();
🔥 위 함수는 총알이 벽에 맞을 때 효과를 재생하는 RPC이다. 패킷이 손실되더라도 다음 효과음이 곧 올 것이므로 Unreliable로 설정해 네트워크 부하를 줄임.
👉 Reliable은 중요한 데이터를 처리할 때 사용하되, 너무 많이 사용하면 성능 문제가 발생할 수 있음.
👉 Unreliable은 빠른 응답이 필요한 데이터에 적합하지만, 중요한 정보를 전송하는 데는 부적절함.
👉 적절한 조합을 사용해야 최적의 네트워크 성능을 유지할 수 있음.