UE4 c ++でのイベントバインディング



Event Binding Ue4 C



1.青写真を比較します

ブループリントを使用する前に、BeginOverlapイベントをBoxCollisionに追加するなどのイベントをバインドする必要があります。マウスをクリックするだけで、エンジン自体の定義可能なイベントが非常に豊富になります。ただし、C ++でイベントをバインドするのはもっと面倒です。
UE4〜

2.ベストウエスタンベストリアリゼーション

画像
簡単な例は、ドアを開閉することです。まず、ヘッダーファイルでトリガーボックスコンポーネントUBoxComponentを定義し、TriggerBoxという名前を付けます。
cpp
次に、デフォルトの関数を使用してcppファイルにコンポーネントを作成します。後でTriggerBox関数を呼び出す必要があるため、最初にBoxComponentのヘッダーファイルをインクルードします。
BeginOverlap
ついにイベントのバインド、イベントのバインドを開始しました BeginPlayに入れる方がいいです
TriggerBoxのOnComponentBeginOverlapフィールドとOnComponentEndOverlapフィールドは、前のインクルードのヘッダーファイルを認識する必要があります。 AddDynamicForマクロバインディングイベントを使用する必要があります。入力パラメータは、バインドする関数の名前です。



フォーカス

重要な点は1つだけです。つまり、自分で定義した関数の署名は、バインドするデリゲートの署名と一致している必要がありますが、デリゲートの署名が何であるかをどのようにして知ることができますか?
最初にOnComponentBeginOverlapの定義に移動します
OnComponentBeginOverlap
これはあなたが探している定義ではありません。左側の構造FComponentBeginOverlapSignatureの定義を引き続き検索します。
画像
今回はその通りです。さまざまなイベントにバインドされた多くのマクロを見ることができ、BeginOverlapにバインドされた関数のシグネチャは行によって異なります。

DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SixParams( FComponentBeginOverlapSignature, UPrimitiveComponent, OnComponentBeginOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool, bFromSweep, const FHitResult &, SweepResult)

括弧内のパラメーターを確認してください。この一連のことはまったく理解できず、標準(タイプ+パラメーター)形式ではありません。必要なパラメーターは括弧から取得されます。しかし、どのように?
マクロ名から、BeginOverlapイベントの関数シグネチャは次のようになっていることがわかります。 6つのパラメータ 、ただし、15個のパラメーターがあり、異なるueバージョンに応じて、括弧内のパラメーターが変更されています。
安全な方法は、end6 * 2 = 12のパラメーターを取得し、自分で宣言した関数を入力して、 余分なコンマを削除します 、標準(タイプ+パラメーター)形式を作成します。



void ATriggerableDoor::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { //…… }

6つのパラメーターグループを整理し、最後にカスタム関数をOnComponentBeginOverlapイベントにバインドします。
また、マルチキャスト委任であるため、TriggerBox->OnComponentBeginOverlap.AddDynamic()複数のカスタム関数を繰り返しバインドでき、イベントがトリガーされている限り、それらを一緒に呼び出すことができます。

UFUNCTION
補足として、イベントをバインドするためにヘッダーファイルで宣言する場合は、カスタム関数をUFUNCTIONとともに追加する必要があります。