본문 바로가기

프로그래밍/Unreal

[UE4] unreal delegate

델리게이트

선언

선언매크로 : 델리게이트 선언은 함수 포인터 선언이라고 생각하면 된다.
콜백을 위한 함수 포인터 선언으로 특정 함수 형태에 대해 매칭되는 매크로가 사용된다.

함수 형태와 매칭되는 델리게이트 선언 매크로는 아래와 같다.

void Function() 
DECLARE_DELEGATE( DelegateName )

void Function( <Param1> )
DECLARE_DELEGATE_OneParam( DelegateName, Param1Type )

void Function( <Param1>, <Param2>, ... )
DECLARE_DELEGATE_<Num>Param( DelegateName, Param1Type, Param2Type, ... )

<RetVal> Function()
DECLARE_DELEGATE_RetVal( RetValType, DelegateName )

<RetVal> Function( <Param1> )
DECLARE_DELEGATE_RetVal_OneParam( RetValType, DelegateName, Param1Type )

<RetVal> Function( <Param1>, <Param2>, ...)
DECLARE_DELEGATE_RetVal_<Num>Param( RetValType, DelegateName, Param1Type, Param2Type, ... )

 

바인딩

델리게이트 객체에 실제 작업을 처리할 함수나 오브젝트를 연결하는것을 바인딩이라고 하며, 바인딩할 오브젝트에 따라 델리게이트 객체의 특정 메쏘드를 호출해 바인딩이 이루어진다.

Bind : 기존 델리게이트
BindStatic : raw C++ static 함수
BindRaw : raw C++ 포인터
BindSP : 공유 포인터 멤버 함수
BindUFunction: UFUNCTION 멤버 함수
BindUObject : UObject 멤버 함수



UnBind

 

예를들어 호출될 객체가 FShareRef 객체인 경우 구성을 예를 들어본다.

 

이벤트 클래스 생성

이벤트를 처리할 클래스를 생성한다.

class FMyObject 
{
    void OnMyEvent();
}

 

델리게이트 매크로 및 선언

호출할 메쏘드가 리턴, 인자 모두 void 에 매칭되는 매크로를 사용해
이름이 FSampleDelegate 인 델리게이트를 선언한다.

델리게이트 이름은 F로 시작되어야 한다.


// 델리게이트 선언 매크로
DECLARE_DELEGATE( FSampleDelegate )

// 델리게이트를 사용할 클래스
class FMainClass
{
    .
    .

    // 매크로로 선언된 델리게이트 객체 정의
    FSampleDelegate Sample;

    // 바인딩 메쏘드
    void BindEvent();

    // 이벤트 전송 메쏘드
    void SendEvent();

    // 바인딩 해제
    void Unbind();
}

 

바인딩

바인딩할 객체가 공유 포인터라면 BindSP 메쏘드를 사용한다.

void FMainClass::BindEvent()
{
     // 이벤트를 호출할 객체의 FShareRef 생성
     FShareRef<FMyObject> MyObject( new FMyObject() );

     // 바인딩
     Sample.BindSP( MyObject, &MyObject::OnMyEvent );
}

 

이벤트 호출

델리게이트의 Execute 메쏘드를 호출하면 바인딩된 객체의 메쏘드를 호출하게 된다.

void FMainClass:SendEvent()
{
    Sample.ExecuteIfBound();
}

 

바인딩 해제

void FMainClass::Unbind()
{
    Sample.Unbind();
}

 

 

 

멀티캐스트 델리게이트

멀티캐스트 델리게이트는 여러개의 이벤트 함수를 바인딩할 수 있다.
Broadcast로 바인딩된 함수들을 한꺼번에 호출 가능.

DECLARE_MULTICAST_DELEGATE( DelegateName )

바인딩

Add
AddStatic
AddRaw
AddSP
AddUObject

Remove
RemoveAll

이벤트 실행

Broadcast

 

다이내믹 델리게이트

다이내믹 델리게이트는 델리게이트 이름 기반으로 동작하므로, 기존 델리게이트 serialize 와 함수명으로 찾을 수 있는등 추가적인 기능이 있다. 블루프린트에서 함께 사용하기 위해서는 다이내믹 델리게이트로 정의 되어야 한다.
사용방법은 기본적으로 동일하나 파라미터를 정의할때 핀 이름을 함께 정의하게 된다.

일반적인 선언은 동일

DECLARE_DYNAMIC_DELEGATE(DelegateName);
DECLARE_DYNAMIC_MULTICAST_DELEGATE( DelegateName );
DECLARE_DYNAMIC_DELEGATE_OneParam( DelegateName, Param1Type, Param1Name );
    .
    .
    .

 

바인딩

BindDynamic
AddDynamic

RemoveDynamic

 

이벤트실행

Execute
ExecuteIfBound
IsBound

 

블루프린트 연동

델리게이트 선언

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( FDelegateName, Param1Type, Param1Name );

 

블루프린트에서 접근할 클래스이므로 UObject를 상속받고, 언리얼 클래스 생성 매크로들을 사용한다.
바인딩을 블루프린트에서 설정하게 되므로, UPROPERTY(BlueprintAssignable) 을 사용해 델리게이트 객체를 선언한다.
블루프린트에서 바인딩될 함수는 블루프린트 그래프에서 노드 연결 시 'bind to 함수명' 노드로  연결되므로,  UOject 기반 클래스에 UFUNCTION 매크로로 선언된 함수여야 한다.

UCLASS( Blueprintable, BlueprintType )
class UMyObject : public UObject
{
    GENERATED_BODY()

public:
    // 호출할 객체를 C++이 아닌 에디터에서 설정한다. 
    UPROPERTY(BlueprintAssignable)
    FDelegateName Delegate;

    // 함수의 파라미터로 딜리게이트 전달해도 됨
    UFUNCTION(BlueprintCallable)
    void SetDelegate( const FDelegateName& callback);

    // 블루프린트에서 호출할 메쏘드
    UFUNCTION(BlueprintCallable )
    void ShowMessage();
};

 

델리게이트 설정 및 실행

void UMyObject::SetDelegate( const FDelegateName& callback)
{
    Delegate = callback;
}

void UMyObject::ShowMessage()
{
    // 바인딩 여부 확인 후 실행
    if( Delegate.IsBound() )
    {
        Delegate.Execute( 1 );
    }

    // 위와 동일
    // Delegate.ExecuteIfBound(1);
}

 

블루프린트

캐릭터 블루프린트등 사용할 블루 프린트에 위의 객체를 생성해 변수에 저장

'프로그래밍 > Unreal' 카테고리의 다른 글

[UE4] 레벨 스트리밍  (0) 2017.10.15
[UE4] UI 관련 내용  (0) 2017.09.26
[UE4] 폰트  (0) 2017.09.26
[UE4] C++ 에셋, 오브젝트 레퍼런싱/객체생성  (1) 2017.09.25
[UE4] CSV 파일  (0) 2017.09.24
[UE4] 마우스 입력  (0) 2017.09.17
[UE4] 아웃라인 : 스텐실  (0) 2017.09.16
[UE4] 메쉬 외곽선 효과  (0) 2017.09.15
[UE4] 언리얼 기본 예제 분석  (0) 2017.09.13
[UE4] Line Trace  (0) 2017.09.12