조건부 속성 복제

이 페이지는 언리얼 엔진의 복제 시스템에 대한 작업 지식이 있다고 가정합니다.

언리얼의 복제 시스템 및 새티스팩토리에 대한 특별한 경우에 대한 정보는 멀티플레이 페이지를 참고하십시오.

조건부 속성 복제는 1.0 배포에서 도입되었으며 언리얼의 일반적인 조건부 actor 복제 시스템의 커피 스테인의 맞춤 확장입니다. 이 시스템은 이전 버전에서 사용된 복제 세부 정보 액터 시스템을 대체했습니다.

이 시스템의 목적은 멀티플레이 클라이언트에 전송되는 데이터 양을 줄이는 것입니다. 예제 사용 사례는 클라이언트가 건물의 인터페이스를 열었을 때만 건물의 상태나 인벤토리를 복제하는 것입니다.

인벤토리 복제

인벤토리 구성 요소를 복제하기 위해 시스템을 사용하려면 Arch의 다음 단계를 따르십시오. 단계는 FGBuildable의 인벤토리 구성 요소를 복제한다고 가정합니다.

  1. 클래스 기본 객체로 UFGInventoryComponent를 생성합니다:

    AFGBuildableManufacturer::AFGBuildableManufacturer()
    {
        mInputInventory = CreateDefaultSubobject<UFGInventoryComponent>(TEXT("InputInventory"));
    }
    cpp
  2. 속성(이 경우 mInputInventory)이 Replicated 또는 SaveGame으로 표시되지 않았는지 확인합니다. 두 플래그는 유용한 작업을 하지 않으며 런타임에서 추가 오버헤드만 생성합니다:

    UPROPERTY()
    UFGInventoryComponent* mInputInventory;
    cpp
  3. BeginPlay에서 HasAuthority인 경우 UFGInventoryComponent::SetReplicationRelevancyOwner를 호출하고 건물을 인수로 전달합니다:

    void AFGBuildableManufacturer::BeginPlay()
    {
        Super::BeginPlay();
        if (HasAuthority())
        {
            mInputInventory->SetReplicationRelevancyOwner(this);
        }
    }
    cpp
    • 이 단계를 건너뛰면 인벤토리는 소유 건물이 복제될 때 항상 복제됩니다. 그러나 이 단계를 따르면 인벤토리는 클라이언트가 건물 UI를 열었을 때만 복제됩니다.

  4. 이제 서버와 클라이언트 모두에서 동일한 인벤토리를 사용하십시오. 인벤토리 객체 교체나 인벤토리 대기와 같은 해킹이 필요 없습니다. 인벤토리는 이제 클라이언트에서 객체로 항상 사용 가능하지만, 내용은 필요할 때만 복제됩니다.

UI를 위한 추가 데이터 복제

UI를 위한 추가(비인벤토리) 데이터를 복제하려면 Arch의 다음 단계를 따르십시오. 단계는 상호작용 UI가 있는 FGBuildable의 데이터를 복제한다고 가정합니다.

  1. meta = (FGReplicated) 또는 meta = (FGReplicatedUsing = OnRep_XXX)로 표시된 UPROPERTY를 만듭니다(속성에 RepNotify 함수가 필요한 경우):

    UPROPERTY(meta = (FGReplicated))
    float mCurrentManufacturingProgress;
    
    UPROPERTY(meta = (FGReplicatedUsing = OnRep_ArbitrarySlotSizes))
    TArray<int32> mArbitrarySlotSizes;
    cpp
  2. GetConditionalReplicatedProps를 오버라이드하고, 매크로를 사용하여 해당 속성을 추가합니다(속성이 FGReplicated 또는 FGReplicatedUsing으로 표시된 경우에 따라):

    void AFGBuildableManufacturer::GetConditionalReplicatedProps(TArray<FFGCondReplicatedProperty>& outProps) const
    {
        Super::GetConditionalReplicatedProps(outProps);
        FG_DOREPCONDITIONAL(ThisClass, mCurrentManufacturingProgress);
    }
    
    void UFGInventoryComponent::GetConditionalReplicatedProps(TArray<FFGCondReplicatedProperty>& outProps) const
    {
      Super::GetConditionalReplicatedProps(outProps);
      FG_DOREPCONDITIONAL_WITH_NOTIFY(ThisClass, mArbitrarySlotSizes, OnRep_ArbitrarySlotSizes);
    }
    cpp
  3. 그게 전부입니다! 이제 속성은 건물 UI가 열려 있을 때만 복제됩니다.