델리게이트
선언
선언매크로 : 델리게이트 선언은 함수 포인터 선언이라고 생각하면 된다.
콜백을 위한 함수 포인터 선언으로 특정 함수 형태에 대해 매칭되는 매크로가 사용된다.
함수 형태와 매칭되는 델리게이트 선언 매크로는 아래와 같다.
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 |