ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UE5] 액터 리플리케이션
    UE5 2024. 12. 17. 04:20

    액터 리플리케이션이란?

    • 특정 플레이어에 속한 액터의 정보를 네트워크 내 다른 플레이어에게 복제하는 작업
    • 클라이언트-서버 모델에서는 대부분 서버에서 클라이언트로 전달
    • 크게 프로퍼티 리플리케이션과 RPC(Remote Procedure Call)로 나뉨

    기본 액터의 로딩

    • 클라이언트가 초기화 될 때 모든 액터 정보를 서버로부터 받는 것은 비효율적
    • 기본 배경에 관련된 액터는 맵을 통해 스스로 로딩하도록 설계
    • 고정액터(배경 액터 등)에 대해 NetLoadOnClient 속성을 체크(기본값)
      • 클라이언트가 초기화될 때 서버와 통신 없이 자체적으로 로딩

     

    프로퍼티 리플리케이션

    • 네트워크 데이터를 최소화하기 위해 모든 변경 사항을 보내는 대신, 변경을 유발한 속성 값만을 전달
    • 액터의 리플리케이션 속성을 참으로 지정
      • bReplicates 속성을 true로 설정
    // 생성자에서 실행
    AABFountain::AABFountain()
    {
    ...
    	bReplicates = true;
    ...
    }
    • 네트워크로 복제할 액터의 속성을 키워드로 지정
      • UPROPERTY에 Replicated 키워드 설정
    UPROPERTY(Replicated)
    FLinearColor ServerLightColor;
    • GetLifetimeReplicatedProps 함수에 네트워크로 복제할 속성을 추가
      • #include "Net/UnrealNetwork.h" 헤더 파일 지정
      • DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시
      • Lifetiime은 액터 채널의 Lifetime을 의미. 즉, 활성화된 액터 채널로 전송할 복제될 속성을 의미함
    void AABFountain::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
    {
    	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    
    	DOREPLIFETIME(AABFountain, ServerRotationYaw); 
    	DOREPLIFETIME(AABFountain, ServerLightColor);
    }

     

    리플리케이션 콜백 함수 호출

    • 클라이언트에 속성이 복제될 때 콜백 함수가 호출되도록 구현
      • UPROPERTY의 Replicated 키워드를 ReplicatedUsing 키워드로 변경
      • ReplicatedUsing에 호출할 콜백 함수를 지정
      • 호출될 콜백 함수는 UFUNCTION으로 선언
    • 콜백 함수의 구현
      • 일반적으로 OnRep_의 접두사를 가지는 이름 규칙을 가짐
      • 콜백 함수는 서버가 아닌 클라이언트에서만 호출
    • 필요한 타이밍에만 해당 로직을 처리할 수 있어 효율적인 구현 가능
    // ABFountain.h    
    UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
    float ServerRotationYaw;
        
    UFUNCTION()
    void OnRep_ServerRotationYaw();
        
    // ABFountain.cpp
    void AABFountain::OnRep_ServerRotationYaw()
    {
    	FRotator NewRotator = RootComponent->GetComponentRotation();
    	NewRotator.Yaw = ServerRotationYaw;
    	RootComponent->SetWorldRotation(NewRotator);
    
    	ClientTimeBetweenLastUpdate = ClientTimeSinceUpdate;
    	ClientTimeSinceUpdate = 0.0f;
    }
    • 서버에서 ServerRotationYaw 값이 변경 되고 클라이언트에 전달이 될때 클라이언트에서 OnRep_ServerRotationYaw() 콜백함수 자동으로 실행

     

    C++ OnReplicatedUsing과 Blueprint RepNotify의 차이점

    특징 C++ OnReplicatedUsing Blueprint RepNotify
    사용 환경 C++에서만 사용 가능 Blueprint에서 사용 가능
    구현 방식 ReplicatedUsing + OnRep_ 함수 변수 속성을 RepNotify로 설정 + 이벤트 처리
    값 변경 여부 값이 실제 변경될 때만 호출 서버는 항시 호출 / 클라이언트는 값이 변경될 때만 호출
    로직 작성 C++ 코드로 작성 블루프린트 그래프로 작성
    복잡성 복잡한 로직이나 상태 관리는 적합 간단한 이벤트 처리에 적합
    성능 제어  더 많은 제어 가능(C++로 직접 구현) 블루프린트 실행 성능이 C++보다 약간 느림

     

Designed by Tistory.