언리얼 엔진 5로 개발하다 보면 사소하지만 의외로 헷갈리는 부분들이 있습니다. 특히 C++에서 구조체(Struct)를 함수의 입력 파라미터로 사용하고 기본값을 지정하는 경우가 그렇죠. 별거 아닌 것 같지만 막상 하려면 '어? 이거 어떻게 하더라?' 하고 잠시 멈칫하게 됩니다. 하지만 걱정 마세요! 오늘은 이 부분을 완벽하게 파헤쳐서 더 이상 헤매지 않도록 깔끔하게 정리해 드리겠습니다.
언리얼 엔진 5에서 구조체를 함수 입력 파라미터로 선언하고 기본값 지정하기
언리얼 엔진 5의 네이티브 C++ 코드에서 함수의 입력 파라미터로 구조체를 선언하고, 해당 구조체의 생성자를 통해 기본값을 지정하는 방법을 예시 코드와 함께 자세히 설명합니다.
1. 구조체 선언 및 생성자에서 기본값 지정
언리얼 엔진에서 구조체를 선언할 때, 생성자를 활용하여 기본값을 지정할 수 있습니다. 이는 C++의 일반적인 객체 초기화 방식과 동일하며, 구조체가 생성될 때 지정된 값으로 멤버 변수들이 초기화되도록 합니다.
구조체 이름은 언리얼 엔진의 스타일 가이드에 따라 F로 시작해야 하며, 반드시 GENERATED_BODY() 매크로를 포함해야 합니다. 이 매크로는 언리얼 엔진의 리플렉션 시스템이 구조체를 인식하고 처리하는 데 필수적입니다. 또한, USTRUCT(BlueprintType) 지정자는 이 구조체를 블루프린트에서도 사용할 수 있도록 노출시킵니다.
USTRUCT(BlueprintType)
struct FMyStruct
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 ValueA;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ValueB;
// 생성자에서 기본값 지정
FMyStruct()
: ValueA(100)
, ValueB(3.14f)
{
}
};
위 예시에서 FMyStruct는 ValueA (정수)와 ValueB (실수) 두 개의 멤버 변수를 가집니다. 생성자 FMyStruct() 내부에서 초기화 리스트를 사용하여 ValueA는 100으로, ValueB는 3.14f로 초기화하고 있습니다. 이렇게 하면 FMyStruct 타입의 인스턴스가 생성될 때 별도로 값을 지정하지 않으면 이 기본값들을 가지게 됩니다.
2. 함수 선언부에서 구조체 파라미터의 기본값 지정
함수 선언 시, 구조체 파라미터에 기본값을 지정하려면 생성자를 통해 정의한 기본값을 이용해야 합니다. 이는 해당 함수를 호출할 때 파라미터가 생략되었을 경우, 우리가 구조체 생성자에서 정의한 기본값으로 구조체 인스턴스가 생성되어 전달되도록 합니다.
UFUNCTION(BlueprintCallable, Category="MyCategory")
void MyFunction(const FMyStruct& Param = FMyStruct());
const FMyStruct& Param = FMyStruct()처럼 선언하면, MyFunction을 호출할 때 Param 인자를 넘기지 않을 경우 FMyStruct() 생성자가 호출되어 ValueA는 100, ValueB는 3.14f로 초기화된 FMyStruct 인스턴스가 Param으로 전달됩니다. const와 & (참조)를 사용하여 불필요한 복사를 방지하고 성능을 최적화하는 것이 일반적입니다.
3. 함수 정의
함수 정의는 일반적인 C++ 방식과 동일합니다. 함수의 본문에서는 전달받은 Param 구조체의 멤버 변수들에 접근하여 원하는 로직을 구현할 수 있습니다. Param은 호출 시 전달된 값이거나, 전달되지 않았다면 위에서 정의한 기본값을 가지게 됩니다.
void UMyClass::MyFunction(const FMyStruct& Param /* = FMyStruct() */)
{
// Param.ValueA와 Param.ValueB는 기본값(100, 3.14f) 또는 호출 시 전달된 값이 들어감
UE_LOG(LogTemp, Warning, TEXT("ValueA: %d, ValueB: %f"), Param.ValueA, Param.ValueB);
}
주석으로 /* = FMyStruct() */가 붙어 있지만, 실제 함수 정의에서는 이 부분을 생략합니다. 이는 선언부에서 이미 기본값이 지정되었음을 나타내는 용도로 사용됩니다.
전체 코드 예시
아래는 위에서 설명한 내용을 모두 포함하는 전체 코드 예시입니다. MyStruct.h에 구조체 정의를, MyClass.h에 함수 선언을, MyClass.cpp에 함수 정의를 포함합니다.
// MyStruct.h
USTRUCT(BlueprintType)
struct FMyStruct
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 ValueA;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ValueB;
FMyStruct()
: ValueA(100)
, ValueB(3.14f)
{
}
};
// MyClass.h
UCLASS()
class UMyClass : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="MyCategory")
void MyFunction(const FMyStruct& Param = FMyStruct());
};
// MyClass.cpp
void UMyClass::MyFunction(const FMyStruct& Param /* = FMyStruct() */)
{
// 함수 구현: 전달된 구조체 파라미터의 값 사용
UE_LOG(LogTemp, Warning, TEXT("MyFunction called! ValueA: %d, ValueB: %f"), Param.ValueA, Param.ValueB);
// 예시: ValueA가 100이면 "Default ValueA", 아니면 "Custom ValueA" 출력
if (Param.ValueA == 100)
{
UE_LOG(LogTemp, Warning, TEXT("ValueA is its default value!"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("ValueA is a custom value!"));
}
}
참고 및 주의사항
- 구조체의 기본값은 생성자에서 지정해야 하며, 함수 선언부에서는 = FMyStruct()처럼 생성자를 호출하여 기본값을 지정합니다. 함수 선언부에서 직접 멤버 변수의 기본값을 지정하는 것은 불가능합니다.
- 언리얼 엔진의 USTRUCT는 반드시 GENERATED_BODY()를 포함해야 합니다. 이는 언리얼 엔진의 빌드 시스템과 리플렉션 시스템이 제대로 작동하는 데 필수적입니다.
- 블루프린트에서 사용하려면 USTRUCT 지정자에 BlueprintType 등을 붙여야 합니다. 이 외에도 Blueprintable, Atomic 등 다양한 지정자들이 있습니다.
- 블루프린트 노드에서 함수를 호출할 때, C++에서 지정한 기본값이 그대로 노출되며 동기화됩니다. 이는 C++과 블루프린트 간의 원활한 연동을 가능하게 합니다.
- 이 방식은 언리얼 엔진 5의 표준 C++ 코딩 및 언리얼 스타일 가이드에 완벽하게 부합하는 안전하고 권장되는 패턴입니다.
이제 언리얼 엔진 5에서 구조체를 함수의 입력 파라미터로 선언하고 기본값을 지정하는 것이 더 이상 헷갈리지 않으시겠죠? 이 가이드가 여러분의 언리얼 엔진 개발에 큰 도움이 되기를 바랍니다!
'프로그래밍' 카테고리의 다른 글
언리얼 엔진 5 물리 제약: EAngularConstraintMotion::ACM_Limited와 Angular Projection 활용하기 (2) | 2025.06.10 |
---|---|
언리얼 엔진 5: UShapeComponent 오버랩 이벤트에서 특정 액터 무시하기 (1) | 2025.06.05 |
언리얼 엔진 5의 핵심! Input Mapping Context(IMC) 완전 정복 (1) | 2025.06.04 |
언리얼 엔진 5 데이터 테이블과 FInstancedStruct: 다형성 끝판왕 설계 가이드 (0) | 2025.06.02 |
C++11, Uniform Initialization(중괄호 초기화)으로 깔끔하게 초기화하기 (0) | 2025.05.30 |