메모내용
Nav

UFUNCTION

블루프린트와 호환되는 함수형으로 선언시에 사용 블루프린트 오브젝트는 멤버함수에 대한 정보를 저장하고 로딩하는 직렬화(Serialization) 매커니즘이 들어가 있기 때문에, 일반 C++언어가 관리하는 방법으로 멤버함수를 관리할 수 없다. 그래서 블루프린트와 관련된 C++함수는 모두 UFUNCTION 매크로를 사용해야 한다.

함수 호출 관련 UFUNCTION

BlueprintCallable

블루프린트에서 해당 함수를 호출할 수 있도록 하는 매크로



상속시 UFUNCTION

가상 함수 UFUNCTION 함수 A 를 가진 클래스 A 를 상속하는 ClassB 에서 함수 A 를 override 할때 UFUNCTION 을 다시 쓸 필요 없습니다.

이벤트 관련 UFUNCTION

참조
  • Unreal Doc :: Event
  • 두개
  • BlueprintNativeEvent
  • 내꺼
  • 이벤트는 결국 콜백함수 이다

    결국 어짜피 함수이나.
    누군가에 의해서 호출되는 콜백합수 입니다.

    이벤트는 멀티케스트 델리게이트와 매우유사합니다.

    BlueprintImplementableEvent

    구현 클래스에서 오버라이딩 할 수 있는 함수를 선언할 때 사용되는 지정자
    블루프린트에서 오버라이드 하여 구현 할 수 있습니다.
    C++ 에서는 선언만 해주어야 합니다. 정의가 불가능합니다.
    인터페이스에서는 이 지정자를 사용할 수 없습니다.
    (함수를 순수가상함수로 만들지는 않습니다. (순수가상함수가 아니기때문에 인터페이스에는 넣을 수 없습니다.))

    콜백함수
    인수에 이것저것 파라미터를 선언하여, 구현해놓으면,
    필요한 곳에서 호출하는 함수

    정해진 동작이나 표준이 없는 상황에서,
    구현클래스(블루프린트)에서 입맛대로 반응을 할 수있도록 해주는 지정자

    BlueprintNativeEvent

    기본적으로 c++ 에서 구현을 할것이지만, 필요하다면
    블루프린트 에서 재정의를 허락하는 지정자
    만약 블루프린트에서 재정의를 햇다면, 재정의된 함수를 호출하고,
    재정의가 되어 있지 않다면, 기존 C++ 구현 함수를 호출하도록 언리얼 헤더툴이 어떤 작업을 해준다.

    BlueprintNativeEvent 지정자를 사용하려면 2개의 함수를 선언해야 한다.
    예를 들어 FUNC 라는 이름의 함수를 선언하고 싶다면, 추가로 FUNC_Implementation 이라는 이름의 가상함수도
    선언해야 한다.

                                
                                    UFUNCTION(BlueprintNativeEvent)
                                    void Func();
                                    virtual void Func_Implementation();
                                
                            
    위와 같이 선언했다면 Func 는 구현하지 않고,
    Func_Implementation 만 구현한다. 그러면 Unreal Header Tool 이 전처리 작업에서 Func 의 구현부를 다음과 같이 작성해준다.
                                
                                    void Func()
                                    {
                                        if(블루프린트에서 오버라이딩 되었다면)
                                            // 오버라이딩된 블루프린트 함수 호출
                                        else
                                            Func_Implementation();
                                    }
                                
                            

    결국 우리가 직접 구현해야 하는 함수는 Func_Implementation 이지만 해당 함수를 호출한다면 Func 함수를 호출해야 한다. 그래야 케이스에 따라 결정할 수 있기 때문디아. 블루프린트에서 재정의 된 함수를 호출할 지 c++ 구현 함수를 호출할지

    경우에 따라서는 Super 메소드를 사용하여, c++ 에서의 구현함수를 호출하고, 블루프린트에의 구현함수 또한 호출할 수 있다.

    BlueprintImplementableEvent 지정자는 함수를 순수 가상함수로 만들어 준다.
    인터페이스의 함수에서 BlueprintImplementableEvent 를 사용할 수 있다.

    MyInterface.h

                                    
                                        #pragma once
        
                                        #include "CoreMinimal.h"
                                        #include "UObject/Interface.h"
                                        #include "MyInterface.generated.h"
        
                                        UINTERFACE(BlueprintType)
                                        class UMyInterface : public UInterface
                                        {
                                            GENERATED_BODY()
                                        };
        
        
                                        /**
                                        * 인터페이스
                                        */
                                        class MODULENAME_API IMyInterface
                                        {
                                            GENERATED_BODY()
                                            
                                        public:
                                            
                                            /** 인터페이스를 상속하는 클래스에서도 _Implemantation 함수로 구현할 수 있고,
                                                상속하는 블루프린트에서도 구현할 수 있는 함수
                                            */
                                            UFUNCTION(BlueprintCallable,BlueprintNativeEvent, Category="MyInterface")
                                            void Action(int32 Idx, float Value,const FString& Message);
        
                                        };
    
    
    
    
                                    
                                

    MyCharacter.h (Implemantation Class)

                                    
                                        #pragma once
    
                                        #include "EngineMinimal.h"
                                        #include "GameFramework/Character.h"
                                        #include "MyInterface.h"
                                        #include "MyCharacter.generated.h"
    
                                        /**
                                        * 
                                        */
                                        UCLASS(Blueprintable)
                                        UCLASS(Blueprintable)
                                        class MODULENAME_API AMyCharacter : public ACharacter , public IMyInterface
                                        {
                                            GENERATED_BODY()
        
                                            public:
                                            // 인터페이스 함수의 구현부 선언
                                            virtual void Action_Implementation(int32 Idx, float Value, const FString& Message) override;
                                        }
                                    
                                

    MyCharacter.cpp (Implemantation Class)

                                    
                                        #include "MyCharacter.h"
    
                                        void ACreature::CreatureAction_Implementation(int32 ActionIdx, float Value, const FString& Message)
                                        {
                                            CUSTOMLOG(Warning, TEXT("CreatureAction_Implementation : %d"), ActionIdx);
                                        }                                    
                                    
                                

    BlueprintNativeEvent 로 선언한 함수를 c++ 에서 호출할 경우 Execute_함수명(대상객체, arg1, arg2, ...) 로 호출해주어야 한다.