액터 컴포넌트는 액터의 비헤이비어를 확장해 주며, 액터에 서브오브젝트로 어태치할 수 있는 특수한 타입의 오브젝트입니다. 액터 컴포넌트는 기본적으로 리플리케이트하지 않지만, 액터 컴포넌트를 소유한 액터의 일부로 리플리케이트하도록 환경설정할 수 있습니다. 액터 컴포넌트는 자체 프로퍼티 및 서브오브젝트를 리플리케이트할 수 있을 뿐 아니라, 액터 컴포넌트 클래스에서 정의된 원격 프로시저 호출(Remote Procedure Call, RPC)을 액터와 동일한 방식으로 호출할 수 있습니다.
액터 컴포넌트를 액터의 일부로 리플리케이트하려면 다음을 확인해야 합니다.
액터 컴포넌트를 소유한 액터가 리플리케이트하도록 설정됨
액터 컴포넌트가 리플리케이트하도록 설정됨
액터 컴포넌트 타입
스태틱 액터 컴포넌트
스태틱 액터 컴포넌트 는 소유한 액터가 스폰될 때 함께 스폰되는 액터 컴포넌트입니다. 스태틱 컴포넌트는 액터의 C++ 생성자에서 기본 서브오브젝트로 생성되거나, 블루프린트 에디터의 컴포넌트 모드 에서 생성됩니다.
스태틱 액터 컴포넌트 리플리케이트하기
액터 생성자에서 생성한 액터 컴포넌트를 리플리케이트하려면 다음 단계를 따릅니다.
액터 생성자에서 다음을 수행합니다.
bReplicates = true; 로 액터가 리플리케이트하도록 설정합니다.
CreateDefaultSubobject<T> 로 액터 생성자에서 액터 컴포넌트를 생성합니다.
AMyActor::AMyActor()
{
bReplicates = true;
MyActorComponent = CreateDefaultSubobject<UMyActorComponent>(TEXT("MyActorComponent"));
}
Copy full snippet
액터 컴포넌트 생성자에서 다음을 수행합니다.
다이내믹 액터 컴포넌트
다이내믹 액터 컴포넌트 는 런타임 시 서버에서 스폰되는 액터 컴포넌트입니다. 다이내믹 액터 컴포넌트를 생성하거나 삭제하면 연결된 클라이언트에서 이를 리플리케이트합니다. 다이내믹 액터 컴포넌트는 액터와 비슷하게 작동합니다.
클라이언트는 리플리케이트하지 않는 자체 로컬 다이내믹 액터 컴포넌트를 스폰할 수 있습니다.
다이내믹 액터 컴포넌트 리플리케이트하기
런타임 시 동적으로 생성된 액터 컴포넌트를 리플리케이트하려면 다음 단계를 따릅니다.
액터 생성자에서 다음을 수행합니다.
새 액터 컴포넌트를 리플리케이트하려는 경우 다음을 수행합니다.
블루프린트 액터 컴포넌트
블루프린트에서 스태틱 액터 컴포넌트와 다이내믹 액터 컴포넌트를 모두 스폰할 수 있습니다.
스태틱 블루프린트 액터 컴포넌트 리플리케이트하기
블루프린트에서 스태틱 액터 컴포넌트를 리플리케이트하려면, 액터 컴포넌트의 디테일(Details) 패널 에서 리플리케이트(Replicates) 부울 필드를 토글합니다. 액터 컴포넌트에 리플리케이트해야 하는 프로퍼티 또는 이벤트가 있는 경우 액터 컴포넌트만 리플리케이트하면 됩니다.
기본적으로 디테일 패널 의 컴포넌트 리플리케이션(Component Replication) 섹션에서 액터 컴포넌트가 리플리케이트하도록 설정할 수 있습니다.
컴포넌트 리플리케이션 섹션은 일부 리플리케이션 형식을 지원하는 컴포넌트에만 표시됩니다.
다이내믹 블루프린트 액터 컴포넌트 리플리케이트하기
블루프린트에서 다이내믹 액터 컴포넌트를 리플리케이트하려면 Should Replicate 필드의 토글을 켠 상태로 Set Is Replicated 함수를 호출합니다.
Begin Object Class=/Script/BlueprintGraph.K2Node_CustomEvent Name="K2Node_CustomEvent_0" ExportPath="/Script/BlueprintGraph.K2Node_CustomEvent'/Game/MyBlueprints/BP_MyActor.BP_MyActor:EventGraph.K2Node_CustomEvent_0'"
CustomFunctionName="Event ReplicateComponent"
NodePosY=681
NodeGuid=818B4FBA4AB8D2434CFAECA23B4FA1A1
CustomProperties Pin (PinId=421A30E3469187EF6B5740AE931D3780,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/MyBlueprints/BP_MyActor.BP_MyActor_C'",MemberName="Event ReplicateComponent",MemberGuid=818B4FBA4AB8D2434CFAECA23B4FA1A1),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=62D2FC444CA20DB5E9B3A8955CAC3E2E,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_0 06F6405B4C0EAC380F0686AAB61C9142,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_0" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/MyBlueprints/BP_MyActor.BP_MyActor:EventGraph.K2Node_CallFunction_0'"
FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.ActorComponent'",MemberName="SetIsReplicated")
NodePosX=416
NodePosY=681
NodeGuid=BF0399784595F2FE6960EB96EC2720C3
CustomProperties Pin (PinId=06F6405B4C0EAC380F0686AAB61C9142,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CustomEvent_0 62D2FC444CA20DB5E9B3A8955CAC3E2E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=B9CD644C4D6D4BA1C0974A9E6587E6C6,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=B3041B214B81F199F983ACB72C6313B4,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="타깃\n액터 컴포넌트 오브젝트 레퍼런스",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.ActorComponent'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_VariableGet_0 148F62B441C32524EE4B75A258C6EDA3,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=63B137774CD10EC982E1EB9977EDDB2A,PinName="ShouldReplicate",PinToolTip="Should Replicate\n부울",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_VariableGet Name="K2Node_VariableGet_0" ExportPath="/Script/BlueprintGraph.K2Node_VariableGet'/Game/MyBlueprints/BP_MyActor.BP_MyActor:EventGraph.K2Node_VariableGet_0'"
VariableReference=(MemberName="BP_MyActorComponent",bSelfContext=True)
NodePosX=128
NodePosY=784
NodeGuid=77ABE40B46D72F9B9E5F3CAF2525B65C
CustomProperties Pin (PinId=148F62B441C32524EE4B75A258C6EDA3,PinName="BP_MyActorComponent",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/Engine.BlueprintGeneratedClass'/Game/MyBlueprints/BP_MyActorComponent.BP_MyActorComponent_C'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_0 B3041B214B81F199F983ACB72C6313B4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=2E0192B34CCBEC99A1F485B839A7E62D,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/Engine.BlueprintGeneratedClass'/Game/MyBlueprints/BP_MyActor.BP_MyActor_C'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
액터 컴포넌트 프로퍼티 리플리케이트하기
액터 프로퍼티를 리플리케이트할 때와 똑같은 방식으로 액터 컴포넌트 프로퍼티를 리플리케이트할 수 있습니다. 액터 프로퍼티를 리플리케이트하는 방법에 대한 자세한 내용은 액터 프로퍼티 리플리케이트 문서를 참고하세요.
액터 컴포넌트 원격 프로시저 호출
액터 컴포넌트 클래스 내에서 원격 프로시저 호출(RPC)을 정의하고 액터 RPC를 호출할 때와 똑같은 방식으로 호출할 수 있습니다. RPC를 정의, 구현 및 호출하는 방법에 대한 자세한 내용은 원격 프로시저 호출 문서를 참고하세요.
액터 컴포넌트 서브오브젝트 리플리케이트하기
액터 컴포넌트도 액터와 마찬가지로 자체적으로 리플리케이트된 서브오브젝트 목록을 가질 수 있습니다. 액터 컴포넌트는 서브오브젝트 등록 및 등록 해제 시 액터와 동일한 API를 사용합니다. 액터 컴포넌트 내 서브오브젝트도 리플리케이션 조건을 가질 수 있습니다.
소유 컴포넌트는 리플리케이트된 서브오브젝트의 조건이 체크되기 전에 연결로 리플리케이트되어야 합니다. 예를 들어 서브오브젝트에 COND_OwnerOnly 조건이 있지만 COND_SkipOwner 조건을 사용하는 컴포넌트에 등록된 경우, 오너를 건너뛰므로 서브오브젝트가 절대 리플리케이트하지 않게 됩니다.
서브오브젝트를 리플리케이트하는 방법에 대한 자세한 내용은 액터 서브오브젝트 리플리케이트 문서를 참고하세요.
대역폭 오버헤드
액터 내에서 액터 컴포넌트를 리플리케이트할 때마다 다음이 추가됩니다.
네트워크 글로벌 고유 식별자(NetGUID) 헤더(4바이트)
필요한 모든 리플리케이트된 프로퍼티 및 공간
푸터(약 1바이트)
대역폭 오버헤드를 고려할 때 다음과 같은 세 가지 부분에 유의해야 합니다.
리플리케이션: 전체 액터를 리플리케이트하는 것과 비교하면, 액터 컴포넌트의 프로퍼티를 리플리케이트하는 경우 오버헤드에 미치는 영향이 상대적으로 적습니다.
RPC 호출: 액터 컴포넌트에서 RPC를 호출하면 액터 내에서 직접 호출할 때보다 오버헤드가 더 늘어납니다. 이를 완화하려면 액터를 통해 액터 컴포넌트 RPC를 라우팅할 것을 고려하세요. 이러한 라우팅 예시는 캐릭터 무브먼트 컴포넌트 를 참고하세요.
액터 컴포넌트의 수: 액터 컴포넌트는 상대적으로 크기가 작은 편입니다. 하지만 많은 수의 컴포넌트와 컴포넌트 서브오브젝트를 사용하면 퍼포먼스가 저하될 수 있습니다.