프로그래밍

🎮 언리얼 엔진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
반응형