게임개발/Unreal C++

[Unreal]#UFUNCTION 매크로

Hardii2 2024. 8. 28. 16:27


#1. UFUNCTION 매크로

 

1. 개념

UFUNCTION()은 언리얼 엔진에서 C++ 함수를 엔진의 에디터에서 상호 운용이 가능하도록 해주는 매크로입니다. 이를 통해, C++ 환경에서 선언한 함수를 블루프린트에서 호출하거나, 정의하거나, 혹은 오버라이딩 할 수 있습니다.

 

2. 특징

  1. 블루프린트와 C++간 상호 운용성 제공
  2. 리플렉션 시스템 지원으로 런 타임에 함수 정보 접근 가능
  3. 네트워크 리플리케이션, RPC 등 고급 기능 활성화

 

3. 종류

  1. BlueprintCallable
  2. BlueprintImplementableEvent
  3. BlueprintNativeEvent
  4. Server
  5. Client
  6. NetMulticast
  7. Exec

 


 

#1. BlueprintCallable

 

1. 개념

BlueprintCallable 키워드는 UFUCNTION 매크로의 지정자로, C++에서 정의한 함수를 언리얼 엔진 에디터의 블루프린트 시스템에서 호출할 수 있습니다. 

 

2. 특징

  1. C++과 블루프린트 상호 운용성 제공
  2. 디자이너와 협업
  3. 블루프린트에서 함수의 매개변수와 반환 값 처리

 

3. 코드

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category = "MyFunctions")
    void SimpleFunction()
    {
        UE_LOG(LogTemp, Warning, TEXT("SimpleFunction called"));
    }
};

 


 

#3. BlueprintImplementable

 

1. 개념

BlueprintImplementable은 UFUNCTION 매크로의 지정자로, C++에서 선언만 하고 실제 구현은 블루프린트에서 할 수 있게 해주는 이벤트 함수를 정의합니다.

 

2. 특징

  1. C++에서 선언만 하고 본문을 구현하지 않습니다.
  2. 블루프린트 상에서 해당 함수는 이벤트 형식으로 나타나며, 원하는 로직을 자유롭게 구현할 수 있습니다.
  3. C++에서 해당 함수를 호출하면, 블루프린트에서 구현한 로직이 실행됩니다.
  4. 게임플레이 로직 혹은 커스텀 이벤트를 블루프린트에서 구현할 수 있도록 할 때, 활용합니다.

 

3. 코드

UCLASS(BlueprintType)
class AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintImplementableEvent, Category = "Character Events")
    void OnHealthChanged(float NewHealth, float HealthDelta);

    void TakeDamage(float DamageAmount)
    {
        Health -= DamageAmount;
        OnHealthChanged(Health, -DamageAmount);
    }

private:
    float Health = 100.0f;
};

 


 

#4. BlueprintNativeEvent

 

1. 개념

BlueprintNativeEvent는 UFUNCTION 매크로의 지정자로, C++에서 기본 구현을 제공하는 동시에 블루프린트에서 선택적으로 오버라이드 가능한 함수를 정의합니다.

 

2. 특징

  1. C++에서 기본 구현 제공, 블루프린트에서 선택적 오버라이딩
  2. C++에서 함수 선언 시 <함수_Implementation> 함수를 추가적으로 선언하고, 구현 내용을 implementation 함수에 작성합니다.
  3. 블루프린트에서 오버라이딩 작업 시 Super 호출을 통해 C++ 구현을 가져올 수 있습니다.
  4. BlueprintNativeEvent = BlueprintImplementable + BlueprintCallable

 

3. 코드

UCLASS(BlueprintType)
class AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintNativeEvent, Category = "Character")
    void OnLevelUp(int32 NewLevel);

    void OnLevelUp_Implementation(int32 NewLevel)
    {
        UE_LOG(LogTemp, Log, TEXT("Character leveled up to %d"), NewLevel);
    }

    void LevelUp()
    {
        CurrentLevel++;
        OnLevelUp(CurrentLevel);
    }

private:
    int32 CurrentLevel = 1;
};