今回は、Unreal Engine C++のデリゲートの基本について解説します。
本記事では、以下の最もシンプルなデリゲートを扱います。
・引数なし
・戻り値なし
1つしか関数を登録できないデリゲートについて
MainHUD
.h
class BLOGVERIFICATION_API UUMainHUD : public UUserWidget
{
GENERATED_BODY()
public:
void NativeConstruct() override;
void OnCallFunction();
private:
UPROPERTY(meta = (BindWidget))
TObjectPtr<class UOriginalParts> Parts;
};
=================================================================
.cpp
void UUMainHUD::NativeConstruct()
{
if (Parts == nullptr) return;
// HUDの関数を登録
Parts->SingleDelegate.BindUObject(this, &UUMainHUD::OnCallFunction);
}
void UUMainHUD::OnCallFunction()
{
UE_LOG(LogTemp, Log, TEXT("Called SingleDelegate"));
}
OriginalParts
=================================================================
.h
//引数なし、返り値なし、関数を1つだけ登録する事が可能なデリゲートを作成
DECLARE_DELEGATE(FSingleCallback);
UCLASS()
class BLOGVERIFICATION_API UOriginalParts : public UUserWidget
{
GENERATED_BODY()
public:
//発火するデリゲートを作成
FSingleCallback SingleDelegate;
private:
// マウスのクリックをした瞬間を感知
FReply NativeOnMouseButtonDown(const FGeometry& InGeometry,const FPointerEvent& InMouseEvent) override;
};
=================================================================
.cpp
// マウスのクリックをした瞬間を感知
FReply UOriginalParts::NativeOnMouseButtonDown(const FGeometry& InGeometry,const FPointerEvent& InMouseEvent)
{
if (InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
{
// 発火
SingleDelegate.ExecuteIfBound();
return FReply::Handled();
}
return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
}
1. 型の宣言
発火したい.hで自作のデリゲートを宣言します
宣言後、DECLARE_DELEGATEマクロ内に渡します
//引数なし、戻り値なしのデリゲート型を宣言
DECLARE_DELEGATE(FSingleCallback);
//「FSingleCallback」という自作のデリゲート型のインスタンスを作成
FSingleCallback SingleDelegate;
2. 発火のタイミング
cppに発火したいタイミングで処理を書きます。
FReply UOriginalParts::NativeOnMouseButtonDown(const FGeometry& InGeometry,const FPointerEvent& InMouseEvent)
{
//左クリックでUIがクリックされた
if (InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
{
// 発火(関数が登録されていれば実行する)
SingleDelegate.ExecuteIfBound();
return FReply::Handled();
}
return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
}
3. 関数の登録
呼び出したいクラスで関数を登録します
void UUMainHUD::NativeConstruct()
{
if (Parts == nullptr) return;
// HUDの関数を登録
Parts->SingleDelegate.BindUObject(this, &UUMainHUD::OnCallFunction);
}
//発火時にこの関数を呼ぶ
void UUMainHUD::OnCallFunction()
{
UE_LOG(LogTemp, Log, TEXT("Called SingleDelegate"));
}
4. 処理の確認
複数登録についてはこちら
