프로그래밍
🎮 언리얼 엔진5(Ue5) – UActorComponent에서 TArray 변수 복제(Replicate)하기
세남매 아빠
2025. 4. 25. 09:20
728x90
728x90
언리얼 엔진5에서 UActorComponent 안에 TArray(배열)을 복제하는 방법을 소개해드릴게요. 일반적으로 float 변수 하나를 복제할 때는 UPROPERTY(Replicated)만 써도 충분하지만, 배열처럼 여러 값을 포함하는 자료형은 조금 더 주의가 필요합니다.
이번 포스트에서는 TArray<float>를 복제하는 기본적인 방법을 코드 예제와 함께 소개해드릴게요.
✅ Step 1 – 헤더 파일 설정
우선, 배열 멤버 변수를 선언하고 복제에 사용할 OnRep 함수를 정의합니다.
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class YOURGAME_API UMyActorComponent : public UActorComponent
{
GENERATED_BODY()
public:
UMyActorComponent();
protected:
// 복제 설정
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
// 복제할 TArray 변수
UPROPERTY(ReplicatedUsing=OnRep_MyReplicatedArray)
TArray<float> MyReplicatedArray;
// 클라이언트에서 값이 바뀌었을 때 호출되는 함수
UFUNCTION()
void OnRep_MyReplicatedArray();
public:
// 값 변경 함수
void SetArrayValueAtIndex(int32 Index, float NewValue);
// 읽기 전용 Getter
const TArray<float>& GetArray() const { return MyReplicatedArray; }
};
✅ Step 2 – 소스 파일 구현
이제 소스(.cpp) 파일에서 배열 복제를 구현해볼게요.
UMyActorComponent::UMyActorComponent()
{
PrimaryComponentTick.bCanEverTick = false;
// 이 컴포넌트가 복제되도록 설정
SetIsReplicatedByDefault(true);
}
// 복제할 변수 등록
void UMyActorComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(UMyActorComponent, MyReplicatedArray);
}
// 클라이언트에서 값이 바뀌었을 때 처리
void UMyActorComponent::OnRep_MyReplicatedArray()
{
UE_LOG(LogTemp, Log, TEXT("MyReplicatedArray가 클라이언트에서 업데이트되었습니다."));
for (int32 i = 0; i < MyReplicatedArray.Num(); ++i)
{
UE_LOG(LogTemp, Log, TEXT("Index %d: %f"), i, MyReplicatedArray[i]);
}
}
// 서버에서 배열 값을 설정하는 함수
void UMyActorComponent::SetArrayValueAtIndex(int32 Index, float NewValue)
{
if (GetOwnerRole() == ROLE_Authority)
{
if (MyReplicatedArray.IsValidIndex(Index))
{
MyReplicatedArray[Index] = NewValue;
}
else
{
// 배열 크기 자동 확장
MyReplicatedArray.SetNum(Index + 1);
MyReplicatedArray[Index] = NewValue;
}
OnRep_MyReplicatedArray(); // 서버에서 직접 처리할 경우 호출
}
}
🔍 참고 사항
- 배열은 ReplicatedUsing 또는 Replicated으로 통째로 복제됩니다.
하나의 인덱스만 바뀌어도 전체 배열이 전송되므로, 빈번하게 바뀌는 배열이라면 성능에 영향을 줄 수 있어요. - 배열 요소 단위로 복제하려면 FFastArraySerializer를 사용하는 고급 기법을 고려해보세요.
- UActorComponent가 붙은 Actor는 SetReplicates(true)를 반드시 호출해야 복제가 정상 작동합니다.
#언리얼엔진5 #UnrealEngine5 #UActorComponent #TArray복제 #ReplicatedUsing #게임개발 #언리얼C++ #UE5복제 #언리얼네트워크 #FastArraySerializer
728x90
반응형