본문 바로가기

[Unreal] UFUNCTION의 매크로들 (BlueprintCallable, BlueprintImplementableEvent, BlueprintNativeEvent)

Kwonriver 2022. 1. 15.
728x90

UFUNCTION 매크로 중 유사한 기능을 하는 3가지 매크로가 존재한다. 

 

BlueprintCallable

    CPP 코드로 만든 함수를 블루프린트 또는 레벨블루프린트에서 호출할 수 있도록 하는 매크로이다.

    이 매크로를 사용하여 만든 함수는 블루프린트에서 호출은 가능하나 추가적인 조작(오버라이딩)이 불가능하다.

    또한 CPP코드에서 반드시 정의를 구현해야 한다.

    함수의 내용이 변경되어서는 안되지만 블루프린트에서도 사용해야할 때 추가한다.

 

BlueprintImplementableEvent

    이 매크로를 사용한 함수는 CPP에서 정의할 수 없으며 블루프린트에서 함수 내부를 정의해야한다.

    순수 가상 함수와 같다고 볼 수 있다. (또는 interface)

    CPP에서 함수의 정의부를 구현하면 에러가 발생하며 빌드가 되지 않는다.

    이벤트 형식으로 구현되며 특정 상황을 블루프린트에서 컨트롤 하고 싶을 때 사용한다.

정의부 구현 시 에러가 발생한 모습
이벤트로 만들어진 BlueprintImplementableEvent 함수
CPP 에서 위 함수를 호출하면 블루프린트에서 정의한 기능이 호출됨

 

BlueprintNativeEvent

    위 두가지 기능을 합친 것과 비슷한 기능을 동작한다. 즉, 가상 함수와 유사하다.

    CPP에서 함수의 내용을 정의할 수 있지만 블루프린트에서 해당 함수를 BlueprintImplementableEvent처럼 재정의할 수 있다. (오버라이딩)

    재정의시에는 CPP에서 구현해놓은 정의가 부모가 된다. (상속)

    가장 큰 차이점은 가상 함수를 추가하며 함수 선언과 정의 시에 _Implementation을 끝에 붙여야한다.

   

BlueprintNativeEvent를 사용하여 만든 함수

    이 함수는 BlueprintImplementableEvent와 마찬가지로 함수를 CPP에서 정의하는 경우 에러가 발생한다.

함수 정의 후 빌드에러가 발생한 모습

    CPP에서 해당 함수를 사용하기 위한 용도로 _Implementation를 붙인 가상함수를 추가한다. ( 해당 함수는 반드시 정의되어 있어야 한다)

    기본함수(위 사진의 CountdownHasNativeEvent())를 CPP에서 호출하면 블루프린트에서 정의한 함수가 동작되며 추가로 만든 가상함수(위 사진의 CountdownHasNativeEvent_Implementation())를 호출하면 정의된 함수가 호출된다.

블루프린트에서 정의한 구현부

    그런데 이 함수는 가상함수이다. 즉, 부모의 함수를 동작할 수 있다는 뜻이다. (CountdownHasNativeEvent_Implementation를 블루프린트에서 호출하는 방법)

    해당 이벤트를 우클릭하면 부모함수를 호출하는 기능이 존재한다.

부모 함수를 호출하는 기능

    위처럼 사용하면 상속의 Super:: 처럼 부모함수를 호출한 것과 동일하다.

 

 

언리얼 도큐먼트에서 위 매크로에 대한 설명이다.

언리얼 도큐먼트의 설명

728x90