Blueprint Function Library
Blueprint Function Library를 사용하는 경우는 언제인가?
일반 C++ 클래스에서도 UPROPERTY와 UFUNCTION을 사용하면 블루프린트에서 변수와 함수를 호출할 수 있습니다. 하지만 Blueprint Function Library(UBlueprintFunctionLibrary)를 사용해야 하는 경우는 다음과 같습니다.
📌 일반 C++ 클래스(UObject, AActor) vs Blueprint Function Library(UBlueprintFunctionLibrary) 비교
기준 | 일반 C++ 클래스 (UObject, AActor 등) | Blueprint Function Library (UBlueprintFunctionLibrary) |
객체 생성 여부 | 인스턴스가 필요함 (NewObject, SpawnActor 등) | 인스턴스 없이 정적 함수로 사용 |
상태(State) 관리 | 멤버 변수(속성) 사용 가능 | 멤버 변수를 가질 수 없음 |
함수 실행 방식 | 특정 객체의 함수 호출 (MyActor->DoSomething()) | 전역 함수처럼 호출 (MyLibrary::DoSomething()) |
사용 예시 | 특정 오브젝트(캐릭터, 아이템, AI 등)와 관련된 기능 | 유틸리티 함수 (수학 연산, 문자열 처리, 변환 등) |
🛠 Blueprint Function Library를 사용하는 경우
다음과 같은 경우에는 일반 C++ 클래스가 아니라 Blueprint Function Library를 사용하는 것이 더 적합합니다.
1️⃣ 특정 오브젝트에 의존하지 않는 함수가 필요할 때 (유틸리티 함수)
👉 예제: 두 숫자를 더하는 간단한 수학 함수
- 이 함수는 특정 오브젝트와 관계없이, 어디서든 호출될 수 있어야 합니다.
UFUNCTION(BlueprintCallable, Category = "Math Utilities")
static int32 AddNumbers(int32 A, int32 B);
- 만약 AActor 클래스에서 구현했다면 특정 객체(액터)를 통해서만 호출할 수 있어야 하지만, UBlueprintFunctionLibrary에서는 어느 블루프린트에서든 바로 호출 가능합니다.
2️⃣ 상태(State)를 유지할 필요가 없을 때
👉 예제: 문자열 변환 함수
UFUNCTION(BlueprintPure, Category = "String Utilities")
static FString ToUpperCase(FString Input);
이 함수는 어떤 객체의 속성을 변경하는 것이 아니라, 입력값을 받아 변환한 후 반환하는 역할만 합니다.
➡ 이런 함수는 객체의 상태를 관리할 필요가 없으므로 UBlueprintFunctionLibrary에서 구현하는 것이 적절합니다.
3️⃣ 특정 클래스를 상속할 필요 없이 범용적으로 사용하고 싶을 때
👉 예제: 벡터 연산 함수
- 만약 AActor 기반 클래스에 벡터 연산 함수를 만들면, 반드시 AActor 객체를 생성해야 호출할 수 있습니다.
- 하지만 UBlueprintFunctionLibrary를 사용하면 어떤 오브젝트에서도 사용할 수 있습니다.
UFUNCTION(BlueprintCallable, Category = "Vector Utilities")
static FVector NormalizeVector(FVector Vec);
4️⃣ 여러 클래스에서 공통적으로 사용되는 기능을 하나로 모으고 싶을 때
👉 예제: 로그 출력 함수
UFUNCTION(BlueprintCallable, Category = "Debug")
static void PrintDebugMessage(FString Message);
- PrintDebugMessage() 같은 함수는 어떤 객체에서도 사용될 가능성이 크므로, 특정 클래스에 속하지 않는 것이 좋습니다.
- 따라서 Blueprint Function Library에서 구현하는 것이 더 깔끔한 구조입니다.
📌 일반 C++ 클래스(UObject, AActor)를 써야 하는 경우
하지만 모든 경우에 Blueprint Function Library가 적절한 것은 아닙니다.
다음과 같은 경우에는 일반 C++ 클래스를 사용하는 것이 더 적절합니다.
상황 | Blueprint Function Library ❌ |
액터의 위치, 체력, 상태 등을 관리해야 할 때 | ✅ AActor 기반 C++ 클래스 |
객체의 상태를 변경해야 할 때 | ✅ UObject 기반 클래스 |
AI, 캐릭터 동작 등 액터에 종속적인 기능이 필요할 때 | ✅ ACharacter, AAIController 등 |
➡ 즉, 특정 오브젝트의 속성을 변경해야 하거나, 상태를 유지해야 하는 경우에는 일반 C++ 클래스를 사용하는 것이 적절합니다.
🚀 결론: 언제 Blueprint Function Library를 사용해야 할까?
✅ 특정 오브젝트(Actor, Component 등)에 의존하지 않는 정적 함수가 필요할 때
✅ **전역적인 유틸리티 함수(수학 연산, 문자열 변환, 디버깅 등)**를 만들고 싶을 때
✅ 객체 상태(State)와 무관한 기능을 제공할 때
✅ 공통적으로 여러 블루프린트에서 사용될 함수들을 묶어두고 싶을 때
💡 쉽게 말해, "Blueprint Function Library는 블루프린트에서 편리하게 쓸 수 있는 공용 도구 모음" 역할을 한다.
💡 반면, 상태를 저장하고 관리해야 하는 경우에는 일반 C++ 클래스를 사용해야 한다! 🚀