안선생의 개발 블로그
[UE5] 변수 리플리케이션 본문
리플리케이션이란?
기본적으로 게임은 서버와 클라이언트로 나뉘며, 서버가 게임 상태의 "권한"을 가집니다. 리플리케이션은 게임 상태의 변경 사항, 플레이어의 액션, 이벤트 등을 서버와 클라이언트 간에 동기화하기 위해 사용됩니다.
리플리케이션은 게임 오브젝트(캐릭터, 아이템, 환경 요소 등)의 상태를 유지하고, 다른 플레이어가 볼 수 있도록 합니다. 예를 들어, 만약 하나의 플레이어가 캐릭터의 위치를 변경하면, 이 정보는 서버를 통해 모든 클라이언트에게 전달되어 다른 플레이어도 그 변경 사항을 볼 수 있습니다.
즉 서버가 모든 권한을 갖게 해 주고 클라이언트랑 동기화해주는 것을 말한다.
하는방법
Replicated
변수 정의 및 설정: 먼저 리플리케이션을 원하는 변수를 클래스 내에 정의하고, 해당 변수의 리플리케이션 설정을 추가해야 합니다. 예를 들어, 캐릭터 클래스의 특정 변수를 리플리케이션하려면 해당 변수를 UPROPERTY 매크로를 사용하여 선언하고 Replicated 설정을 추가합니다. 이 코드는 MyReplicatedVariable 변수를 리플리케이션 변수로 선언한 것입니다.
UPROPERTY(Replicated)
int32 MyReplicatedVariable;
리플리케이션 함수 설정: 리플리케이션을 활성화하기 위해 해당 클래스에서 GetLifetimeReplicatedProps 함수를 구현해야 합니다. 이 함수에서 어떤 변수를 리플리케이션할 것인지 설정합니다. 위 예제에서 MyReplicatedVariable을 DOREPLIFETIME 매크로를 사용하여 리플리케이션 설정합니다.
void AMyCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyCharacter, MyReplicatedVariable);
}
변수 설정 및 업데이트: 변수를 수정할 때마다 해당 변수를 업데이트하도록 코드를 작성해야 합니다. 예를 들어, 서버에서만 변수를 수정하고 클라이언트에게 업데이트하려면 다음과 같은 방식을 사용할 수 있습니다. 변수를 변경하면 해당 변수는 리플리케이션되어 모든 클라이언트에게 푸시됩니다.
if (HasAuthority()) // 서버에서만 실행
{
MyReplicatedVariable = NewValue; // 변수 값 업데이트
}
이렇게 하면 서버에서 값이 바뀔 때마다 바뀐 값이 서버에서 먼저 바뀌고 클라이언트로 보내진다.!
RepNotify
위에서 Replicated는 값이 바뀔 때마다 클라이언트한테 알려준다고 했는데요 저희는 값이 바뀔때마다 특정한 이벤트나 함수를 실행시키고 싶습니다. 예를 들면 체력이 깎이면 몽타주를 재생하는 그런 거요! 그럴 때 사용하는 것이 RepNotfiy입니다.
리플리케이션 변수 선언: 먼저 리플리케이션하려는 변수를 클래스 내에서 선언하고 UPROPERTY 매크로와 함께 ReplicatedUsing 속성을 사용하여 리플리케이션 변수의 변경을 감지할 함수를 지정합니다. 예를 들어:
UPROPERTY(ReplicatedUsing = OnRep_MyVariable)
int32 MyVariable;
리플리케이션 변수 변경 감지 함수 작성: 이제 리플리케이션 변수의 변경을 감지할 함수를 작성합니다. 함수 이름은 RepNotify 속성에 지정한 함수와 일치해야 합니다. 예를 들어:
UFUNCTION()
void OnRep_MyVariable();
리플리케이션 변수 업데이트: 변수의 값을 업데이트할 때 해당 변수를 직접 업데이트합니다. Unreal Engine은 이 업데이트를 자동으로 리플리케이션하고 함수를 호출합니다. 예를 들어:
void AYourClass::YourFunctionThatUpdatesVariable()
{
MyVariable = 42;
}
리플리케이션 변수 변경 감지 함수 구현: OnRep_MyVariable 함수를 구현하여 변수의 변경을 처리합니다. 이 함수는 리플리케이션된 변수의 값이 변경될 때 자동으로 호출됩니다.
void AYourClass::OnRep_MyVariable()
{
// 변수가 변경될 때 수행할 작업을 이곳에 추가
}
RepNotify를 사용하면 리플리케이션 변수의 변경을 실시간으로 감지하고 이벤트를 트리거할 수 있으므로 게임에서 리플리케이션 데이터를 효과적으로 관리할 수 있습니다. 이를 통해 서버 및 클라이언트 간에 데이터 동기화가 수월해집니다.
주의할 점으로는 변수가 복제될 때만 호출됩니다 복제는 서버에서 클라이언트로만 작동하죠 서버로 복제될 일이 없기 때문에 서버는 호출을 받을 일이 없죠 즉 OnRep은 클라이언트만 실행되니 우리가 서버일 때 사건을 처리해야 해요 우리는 서버에서도 실행하는 함수를 하나 만들어줘야 합니다.
조건식 프로퍼티 리플리케이션
만약에 특정 지어서 리플리케이션 하고 싶을 때는 어떻게 해야 될까요? 그럴 때 사용하는 게 조건식 프로퍼티 리플리케이션입니다. _CONDITION을 뒤에 붙여주고 3번째 인자에 조건을 넣어주시면 됩니다.!
하는 방법
void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
{
DOREPLIFETIME_CONDITION( AActor, ReplicatedMovement, COND_SimulatedOnly );
}
조건 | 설명 |
COND_InitialOnly | 이 프로퍼티는 초기 번치에만 전송을 시도합니다. |
COND_OwnerOnly | 이 프로퍼티는 액터의 오너에만 전송합니다. |
COND_SkipOwner | 이 프로퍼티는 오너를 제외한 모든 접속에 전송합니다. |
COND_SimulatedOnly | 이 프로퍼티는 시뮬레이션되는 액터에만 전송합니다. |
COND_AutonomousOnly | 이 프로퍼티는 자율 액터에만 전송합니다. |
COND_SimulatedOrPhysics | 이 프로퍼티는 시뮬레이션되는 또는 bRepPhysics 액터에 전송합니다. |
COND_InitialOrOwner | 이 프로퍼티는 초기 패킷시, 또는 액터의 오너에 전송합니다. |
COND_Custom | 이 프로퍼티에는 별다른 조건이 없지만, SetCustomIsActiveOverride 를 통해 껐다 켰다 토글 기능을 원합니다. |
리플리케이션 하는 이유
리플리케이션은 멀티플레이어 게임에서 여러 플레이어 간의 동기화된 경험을 제공하기 위해 중요합니다. 게임에서 플레이어와 상호작용하는 데이터를 서버와 클라이언트 간에 공유하고 동기화하기 위해 사용됩니다. 이를 통해 모든 플레이어가 동일한 게임 상태를 볼 수 있고, 게임이 일관된 방식으로 진행될 수 있습니다.
리플리케이션을 해야 하는 이유는 다음과 같습니다:
- 동기화된 게임 경험: 서버에서 클라이언트로 데이터를 전송하면 모든 플레이어가 동일한 게임 상태를 공유할 수 있습니다. 이는 모든 플레이어가 일관된 환경에서 게임을 즐길 수 있음을 의미합니다.
- 상호작용의 가시화: 한 플레이어가 게임 세계에서 어떤 변화를 일으키면, 이를 다른 플레이어도 볼 수 있어야 합니다. 리플리케이션은 이러한 상호작용을 다른 플레이어에게 알리는 데 사용됩니다.
- 네트워크 대전 및 협력 게임: 멀티플레이어 게임에서는 플레이어 간의 경쟁 또는 협력이 중요합니다. 리플리케이션은 다른 플레이어의 움직임, 액션, 스코어 등과 같은 정보를 실시간으로 전송함으로써 대전 및 협력 게임을 가능하게 합니다.
- 안정성과 방해 제거: 리플리케이션을 사용하면 서버가 중요한 게임 상태를 관리하고 클라이언트 간에 이를 동기화할 수 있습니다. 이는 게임의 안정성을 높이고, 플레이어들이 서로를 방해하지 않도록 합니다.
- 실시간 상호작용: 실시간 멀티플레이어 게임에서는 플레이어 간의 빠른 상호작용이 필요합니다. 리플리케이션은 이러한 실시간 상호작용을 지원하며, 플레이어들이 실제로 게임 세계에서 서로 작용할 수 있도록 합니다.
리플리케이션을 사용하면 멀티플레이어 게임이 훨씬 더 흥미롭고 상호작용적으로 되어, 플레이어들이 게임 경험을 공유하고 즐길 수 있게 됩니다.
다음시간에는 두 번째 방법인 RPC를 알아볼게요!!
아래 공식문서에서 더 많은 정보를 얻을 수 있습니다.
조건식 프로퍼티 리플리케이션
조건에 따라 액터 프로퍼티를 리플리케이트하는 법에 대한 상세 정보입니다.
docs.unrealengine.com
https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/
액터 리플리케이션
액터 오브젝트 리플리케이션을 여러모로 살펴봅니다.
docs.unrealengine.com
'언리얼 > 멀티플레이' 카테고리의 다른 글
[UE5] 언리얼 자체 리플리케이션?? (1) | 2023.11.05 |
---|---|
[UE5] RPC (0) | 2023.11.04 |
[UE5] Network Role (0) | 2023.11.01 |
[UE5]멀티플레이 클라이언트와 서버 관계 (0) | 2023.10.30 |
[UE5] 멀티플레이 Seamless Travel (3) | 2023.10.29 |