RepNotify, ActorReplication, RPCs

박정훈·2025년 3월 18일

언리얼 네트워크

목록 보기
1/7

🔥 RepNotify, Actor Replication, RPCs 차이점 완벽 정리

언리얼 엔진에서 네트워크 동기화를 할 때 사용되는 세 가지 방식
✅ RepNotify (ReplicatedUsing)
✅ Actor Replication (bReplicates)
✅ RPCs (Remote Procedure Calls)


1️⃣ RepNotify (ReplicatedUsing)

📌 용도:
✔ 서버에서 특정 변수 값이 바뀌었을 때, 클라이언트에게 알리고 이벤트를 실행

📌 작동 방식:
서버에서 RepNotify로 설정된 변수를 변경하면, 자동으로 클라이언트에서 동기화됨
동기화될 때 특정 함수(OnRep_변수명())가 실행되어 추가 로직을 실행할 수 있음

📌 언제 사용?
✅ 체력(Health) 값이 바뀔 때 UI 업데이트
✅ 총알(Ammo) 개수가 줄어들 때 HUD 갱신
✅ 캐릭터의 특정 상태(Status)가 변경될 때

📌 예제 코드

// MyCharacter.h
UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;

UFUNCTION()
void OnRep_Health(); // 값 변경 시 실행할 함수
// MyCharacter.cpp
void AMyCharacter::OnRep_Health()
{
    UE_LOG(LogTemp, Warning, TEXT("클라이언트에서 Health 변경 감지: %f"), Health);
}

void AMyCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(AMyCharacter, Health);
}

✅ 요약:
✔ 서버에서 값이 변경되면, 클라이언트가 자동으로 동기화 + 추가적인 이벤트 실행 가능


2️⃣ Actor Replication (bReplicates)

📌 용도:
✔ 액터(Actor) 전체를 서버 → 클라이언트로 동기화

📌 작동 방식:
bReplicates = true; 설정하면, 서버에서 생성된 액터가 클라이언트에도 자동으로 복제됨
위치, 회전, 물리 상태(Physics) 등의 기본 속성은 자동으로 동기화됨
그러나 변수(Health, Ammo 등)는 기본적으로 동기화되지 않으며, Replicated 또는 RepNotify를 추가해야 동기화 가능

📌 언제 사용?
✅ 플레이어 캐릭터, 적 AI 등의 멀티플레이어 캐릭터를 동기화
✅ 무기, 아이템 같은 게임 오브젝트를 네트워크에서 공유
✅ 차량, 문, 상자 등의 인터랙티브 오브젝트의 상태를 서버에서 관리하고 클라이언트에서 동기화

📌 예제 코드

// MyCharacter.h
UCLASS()
class AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    AMyCharacter();
    
    UPROPERTY(Replicated)
	int32 Score;
};
// MyCharacter.cpp
AMyCharacter::AMyCharacter()
{
    bReplicates = true; // 액터 복제 활성화
}

void AMyActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(AMyActor, Score); // ✔ 변수도 동기화되도록 설정
}

✅ 요약:
✔ 서버에서 생성한 액터를 클라이언트에서도 동일하게 복제할 때 사용
✔ 위치, 회전 등의 속성은 자동 동기화되지만, 변수 동기화는 별도로 설정해야 함
✔ 변수가 아니라, 액터 자체를 동기화할 때 유용함


3️⃣ RPCs (Remote Procedure Calls)

📌 용도:
✔ 서버에서만 실행해야 하는 로직이나, 특정 클라이언트에서 실행해야 하는 함수 호출

📌 작동 방식:
UFUNCTION(Server, Reliable) → 클라이언트에서 실행했지만, 서버에서 실행되도록 강제함
UFUNCTION(Client, Reliable) → 서버에서 실행했지만, 특정 클라이언트에서 실행되도록 강제함
UFUNCTION(NetMulticast, Reliable) → 서버에서 실행하고, 모든 클라이언트에게 전파

📌 언제 사용?
✅ 플레이어가 공격하면, 서버에서 공격 판정을 계산해야 할 때
✅ 클라이언트가 문을 열었을 때, 서버에서 문이 열리도록 처리해야 할 때
✅ 서버에서 폭발 이벤트를 발생시키고, 모든 클라이언트가 그 폭발을 보도록 할 때

📌 예제 코드

// MyCharacter.h
UFUNCTION(Server, Reliable)
void ServerFire();

UFUNCTION(NetMulticast, Reliable)
void MulticastExplosion();
// MyCharacter.cpp
void AMyCharacter::ServerFire()
{
    if (HasAuthority()) // 서버에서만 실행
    {
        UE_LOG(LogTemp, Warning, TEXT("서버에서 총알 발사!"));
    }
}

void AMyCharacter::MulticastExplosion()
{
    UE_LOG(LogTemp, Warning, TEXT("모든 클라이언트에서 폭발 애니메이션 재생!"));
}

✅ 요약:
✔ 서버 또는 특정 클라이언트에서만 실행해야 하는 로직을 처리할 때 사용
✔ RepNotify나 Actor Replication과 달리, 이벤트 기반으로 즉시 실행됨


🎯 최종 비교: 언제 어떤 기능을 써야 할까?


🎮 결론: RepNotify, Actor Replication, RPCs를 언제 써야 할까?

✅ 값 변경을 동기화하고 이벤트를 실행하고 싶다면? → RepNotify
✅ 전체 액터를 동기화하고 싶다면? → Actor Replication (bReplicates = true;)
✅ 서버에서 실행해야 하는 로직을 처리하고 싶다면? → RPCs (Server, Client, NetMulticast)

즉, RepNotify는 값 동기화, Actor Replication은 액터 복제, RPC는 이벤트 실행


Reliable vs Unreliable: 언제 사용해야 할까?

1️⃣ Reliable (신뢰성 보장)
✔ 패킷이 손실되지 않고 반드시 도착해야 하는 경우 사용
✔ 네트워크 상태가 안 좋아도 재전송을 통해 반드시 실행됨
✔ 그러나, 패킷 손실 시 재전송을 기다리므로 지연(Latency)이 발생할 수 있음
📌 언제 사용해야 할까?
✅ 게임의 핵심적인 동작 → 반드시 실행되어야 하는 경우
✅ 플레이어 사망 이벤트 (Die()) → 안 전달되면 게임이 망가짐
✅ 아이템 획득 이벤트 (GiveItem()) → 잃어버리면 안 됨
✅ 문 열기 이벤트 (OpenDoor()) → 문이 열리지 않으면 게임 진행이 불가능
✅ 점수 증가, 퀘스트 완료 등 중요한 상태 변화

2️⃣ Unreliable (신뢰성 없음)
✔ 패킷 손실이 발생할 수도 있지만, 재전송하지 않음
✔ 빠른 반응 속도가 중요한 경우 사용 (즉시 반영이 더 중요)
✔ 네트워크 환경이 좋지 않을 경우, 일부 데이터가 유실될 수도 있음
📌 언제 사용해야 할까?
✅ 자주 호출되는 함수 → 실시간 동기화가 필요한 경우
✅ 플레이어 이동 정보 (MoveForward()) → 일부 패킷이 손실되어도 다음 프레임에서 다시 보냄
✅ 총알 발사 이펙트 (PlayGunFireEffect()) → 한두 번 손실되어도 큰 문제 없음
✅ 애니메이션 재생 (PlayReloadAnimation()) → 손실되더라도 다시 입력하면 됨

0개의 댓글