イベント ディスパッチャー / デリゲートのクイックスタート

イベント ディスパッチャー / デリゲート通信メソッドのクイックスタート

実装方法を選んでください。

Blueprints

C++

概要

イベント ディスパッチャーは、あるアクタがイベントをディスパッチし、それをリスニングしている別のアクタが通知を受けるようなアクタ通信手段です。

この方法を使い、通知を発信するアクタは、リスニングしているアクタがサブスクライブする イベント ディスパッチャー を作成します。この通信方法では、1 対多の関係を使用しており、作業アクタがイベント ディスパッチャーをトリガーし、リスニングしている多数のアクタが通知を受けます。

目標

このクイック スタート ガイドでは、レベル内で 2 つのアクタをトリガーする OnBossDied イベントをデリゲート イベントで作成する方法を学習します。

目的

  • イベント ディスパッチャーを作成する BossDied アクタを作成する。

  • OnBossDied イベントにバインドするためにドア アクタを作成する。

  • Blueprint_Effect_Explosion ブループリントを修正し、OnBossDied イベントにバインドする。

1 - 必要な設定

  1. メニューの [New Project Categories (新規プロジェクトカテゴリ)] セクションにある [Games (ゲーム)] を選択して [Next (次へ)] をクリックします。

    image_0.png

  2. [Third Person (サードパーソン)] テンプレートを選択し、[Next (次へ)] をクリックします。

    image_1.png

  3. [Blueprint (ブループリント)][With Starter Content (スターター コンテンツあり)] オプションを選択し、[Create Project (プロジェクトの作成)] をクリックします。

    image_2.png

このセクションの結果

新規のサードパーソン プロジェクトが作成され、イベント ディスパッチャーについて学ぶ準備ができました。

2 - OnBossDied イベントを作成する

  1. コンテンツ ブラウザ を右クリックして、[Create Basic Asset (基本アセットの作成)] セクション内の [Blueprint Class (ブループリント クラス)] をクリックします。

    image_3.png

  2. [Actor (アクタ)] クラスを親クラスとして選択し、ブループリントに「BP_BossDied」という名前を付けます。

    image_4.png

    image_5.png

  3. ブループリント エディタ内の [Viewport (ビューポート)] から [BP_BossDied] を開いて [Add Component (コンポーネントを追加)] ボタンをクリックし、「Box Collision」を検索して選択します。

    image_6.png

  4. Box Collision」を選択した状態で、スケーリングを「X = 4」、「Y = 4」、「 Z = 2」に変更します。

    image_7.png

  5. Box Collision」を選択した状態で、[Details (詳細)] パネルの [Rendering (レンダリング)] セクションに異動し、[Hidden in Game (ゲーム内で非表示)] のチェックボックスを無効にします。これでゲームプレイ中にコリジョン ボックスが表示されます。

    image_8.png

  6. Box Collision」を右クリックして [Add OnComponentBeginOverlap (OnComponentBeginOverlap を追加)] を選択します。すると、ノードに イベント グラフ が表示されます。

    image_9.png

  7. 左にある [My Blueprint (マイ ブループリント)] パネルから [Event Dispatchers (イベント ディスパッチャー)] セクションに移動し、[+ Add New (新規追加)] をクリックして新規イベントを追加します。このイベントに「OnBossDied」という名前を付けます。

    image_10.png

  8. OnBossDiedイベント グラフ にドラッグし、[Call (コール)] を選択してノードを追加します。

    image_11.png

  9. On Component Begin Overlap ノードを Call OnBossDied ノードに接続します。ブループリントを コンパイル して、保存 します。

    image_12.png

  10. BP_BossDied ブループリントをレベルにドラッグします。

    image_13.png

このセクションの結果

このセクションでは、BP_BossDied アクタを作成し、ゲームでボスのキャラクターが死んだときに発生することをシミュレートしました。このアクタに、OnBossDied イベント ディスパッチャーを作成しました。このイベント ディスパッチャーは、イベントがトリガーされたときに他のアクタに信号を送信するのに使用されます。

3 - インタラクティブなドアを作成する

  1. コンテンツ ブラウザ**を右クリックして、[Create Basic Asset (基本アセットの作成)]** セクション内の [Blueprint Class (ブループリント クラス)] をクリックします。

    image_14.png

  2. [Actor (アクタ)] クラスを親クラスとして選択し、ブループリントに「BP_BossDoor」という名前を付けます。

    image_15.png

  3. [Viewport (ビューポート)] から [BP_BossDoor] を開いて [Add Component (コンポーネントを追加)] のドロップダウンをクリックし、「Static Mesh」を検索して選択します。コンポーネントに「Frame」という名前を付けます。

    image_16.png

  4. 別の Static Mesh コンポーネントを追加し、「Door」という名前を付けます。

  5. [Details (詳細)] パネルから、Frame コンポーネントを選択し、[Static Mesh (スタティック メッシュ)]のドロップダウンをクリックし、「SM_DoorFrame」を検索し、選択します。

    image_17.png

  6. Door コンポーネントに対しても上の手順を繰り返し、SM_Door スタティック メッシュを追加します。

  7. Door コンポーネントを選択した状態で、以下のように Y の位置を「45」に設定します。すると、ドアが枠にぴったり合っている状態で表示されるはずです。

    image_18.png

    image_19.png

  8. [Event Graph (イベント グラフ)] を右クリックして、「Add Custom Event」を検索、選択します。イベントに「OpenDoor」という名前を付けます。

    image_20.png

  9. OpenDoor ノードからイベントをドラッグして、「Add Timeline」 を検索、選択します。タイムラインの名前を 「TM_Door」 にします。

    image_21.png

  10. TM_Door をダブルクリックして開きます。[Add Float Curve (Float カーブを追加)] ボタンをクリックして、Float トラックを追加し、「Alpha」という名前を付けます。[Length (長さ)] を「1.0」に設定します。

    image_22.png

  11. グラフを右クリックし、[Add key to CurveFloat_1 (CurveFloat_1 にキーを追加する)] を選択し、新しいポイントを追加します。[Time (時間)][Value (値)] を 「0.0」に設定します。

    image_23.png image_24.png

    image_24.png

  12. 上の手順を繰り返して別のポイントを追加し、[Time (時間)][Value (値)] を 「1.0」に設定します。

  13. イベント グラフ に戻って Door Static Mesh コンポーネントを イベント グラフ にドラッグし、ノードを作成します。Door ノードからドラッグして、「SetRelativeRotation」を検索、選択します。

    image_25.png

  14. TM_Door から Update ピンを接続し、SetRelativeRotation ノードにつなげます。New Rotation ピンを右クリックして「Split Struct Pin」を選択します。

    image_26.png

  15. イベント グラフ を右クリックして、「Lerp Float」を検索、選択します。[Return Value (戻り値)]SetRelativeRotation ノードの Yaw ピンに接続します。TM_DoorAlpha ピンを Lerp ノード上の Alpha に接続します。最後に、B の値を以下のように「90.0」に設定します。

    image_27.png

  16. [Variable (変数)] セクションの横にある [+] ボタン**をクリックして新しい変数を追加します。この変数に「BossDiedReference**」という名前を付けます。

    image_28.png

  17. [Details (詳細)] パネルから、[Variable Type (変数の型)]のドロップダウンをクリックし、BP_BossDied の「Object Reference」を検索し、選択します。[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。

    image_29.png

    image_30.png

  18. BossDiedReferenceイベント グラフ にドラッグして、Get BossDiedRerence を選択します。ノードからドラッグして、「Bind Event to On Boss Died」を検索、選択します。

    image_31.png

  19. Bind Event to On Boss Died の 赤い Event ピンからドラッグして 「Add Custom Event」を検索、選択します。イベントに「BossDied」という名前を付けます。

    image_32.png

  20. BossDied ノードからドラッグして、「Open Door」を検索、選択します。以下のように、Event Begin PlayBind Event to On Boss Died ノードに接続します。

    image_33.png

  21. ブループリントを コンパイル して、保存 します。

このセクションの結果

このセクションでは、BP_BossDied クラス内にある On Boss Died イベント ディスパッチャーにバインドするインタラクティブな Door アクタを作成しました。このバインディングは、 Begin Play 時に発生しますが、BP_BossDied によってイベントがトリガーされた時はいつでもランタイム時に実行されます。

4 - インタラクティブな爆発音を作成する

  1. [Starter Content (スターター コンテンツ)] > [Blueprints (ブループリント)] に移動して 「Blueprint_Effect_Explosion」を選択します。それを「Gameplay」フォルダにドラッグして 「Copy Here」を選択します。

    image_34.png

    image_35.png

  2. ブループリント エディタで Blueprint_Effect_Explosion を開きます。[Viewport (ビューポート)] から P_Explosion コンポーネントを選択し、[Details (詳細)] パネルから [Activation (アクティベーション)] セクションに移動して [Auto Activate (自動アクティベート)] を無効にします。

    image_36.png

  3. Explosion Audio コンポーネントに対しても上の手順を繰り返します。

  4. [Variable (変数)] セクションの横にある [+] ボタン**をクリックして新しい変数を追加します。この変数に「BossDiedReference**」という名前を付けます。

    image_37.png

  5. [Details (詳細)] パネルから、[Variable Type (変数の型)]のドロップダウンをクリックし、BP_BossDied の「Object Reference」を検索し、選択します。[Instance Editable (インスタンス編集可能)]** チェックボックスをオンにします。

    image_38.png

    image_39.png

  6. イベント グラフ を右クリックして「Event Begin Play」を検索し、選択します。

  7. BossDiedReferenceイベント グラフ にドラッグして、「Get BossDiedReference」を選択します。ノードからドラッグして、「Assign On Boss Died」を検索、選択します。カスタム イベントに「BossDied」という名前を付けます。

    image_40.png

  8. Event Begin PlayBind Event to Boss Died ノードに接続します。

    image_41.png

    イベント ディスパッチャーの [Assign (割り当てる)] オプションを選択すると、バインディングとカスタム イベントが作成されます。

  9. P_Explosion Explosion Audio コンポーネントを イベント グラフ にドラッグします。P_Explosion をドラッグし、「Activate」を検索、選択します。Explosion SoundActivate ノードの Target ピンに接続します。

  10. BossDied イベント ノードを Activate ノードに接続します。

    image_42.png

  11. ブループリントを コンパイル して、保存 します。

このセクションの結果

このセクションでは、OnBossDied イベントが実行されたときにアクティベートするように Blueprint_Effect_Explosion を変更しました。

5 - イベント ディスパッチャーをテストする

  1. BP_BossDoor アクタをレベルにドラッグします。[Details (詳細)]パネルに行き、[Boss Reference Died] のドロップダウンをクリックし、「BP_BossDied」を検索、選択します。

    image_43.png

    image_44.png

  2. Blueprint_Effect_Explosion の複数インスタンスをレベルにドラッグします。[Details (詳細)]パネルに行き、[Boss Reference Died] のドロップダウンをクリックし、「BP_BossDied」を検索、選択します。

    image_45.png

    image_46.png

  3. [Play (プレイ)] を押して BP_BossDied に近づき、ゲーム内のボスが死ぬシミュレートをトリガーします。

    image_47.gif

このセクションの結果

このセクションでは、レベル内で BP_BossDoorBlueprint_Effect_Explosion アクタをテストしました。BP_BossDied アクタがそれをトリガーしたときに発生する OnBossDied イベントに各アクタが反応することを確認しました。

このガイドでは、イベント ディスパッチャーを使用して 1 つの作業アクタから多数のターゲット アクタに通信する方法を学習しました。有効であるまた、イベント ディスパッチャーを作成する方法と、特定の関数をトリガーするためにアクタをバインドする方法も学習しました。

次のステップ

イベント ディスパッチャーの使用方法がわかりました。次は「アクタ通信」のドキュメント ページで他の通信方法を見てみましょう。

概要

デリゲートは、型安全な方法でアクタ クラス ブループリント内のメソッドを呼び出すことができます。ダイナミックにバインドし、あるアクタがリスニングしている別のアクタにイベントをトリガーして通信を確立することができます。

詳細については、デリゲート を参照してください。

目標

このクイック スタート ガイドでは、レベル内で 2 つのアクタ クラス ブループリントをトリガーする OnBossDied イベントをデリゲートで作成する方法を学習します。

目的

  • OnBossDied デリゲートを含む Boss アクタを作成する。

  • OnBossDied イベントにバインドするタイムライン コンポーネントでインタラクティブなドア アクタを作成する。

1 - 必要な設定

  1. メニューの [New Project Categories (新規プロジェクトカテゴリ)] セクションにある [Games (ゲーム)] を選択して [Next (次へ)] をクリックします。

    image_0.png

  2. [Third Person (サードパーソン)] テンプレートを選択し、[Next (次へ)] をクリックします。

    image_1.png

  3. [C++][With Starter Content (スターター コンテンツあり)] オプションを選択し、[Create Project (プロジェクトの作成)] をクリックします。

    image_2.png

このセクションの結果

新規のサードパーソン プロジェクトが作成され、デリゲートについて学ぶ準備ができました。

2 - Boss アクタと OnBossDied デリゲートを作成する

  1. C++ Class Wizard から、新規アクタ クラスを「BossActor」という名前で作成します。

    image_3.png

  2. BossActor.h」へ移動します。ライブラリの下に、以下のデリゲートを宣言します。

        DECLARE_DELEGATE(FOnBossDiedDelegate);
  3. クラスのデフォルト内で、以下を宣言します。

        protected:
            UFUNCTION()
            void HandleBossDiedEvent();
            UPROPERTY(EditInstanceOnly, BlueprintReadWrite)
            class UBoxComponent* BoxComp;
            virtual void NotifyActorBeginOverlap(AActor* OtherActor);
    
        public:
            FOnBossDiedDelegate OnBossDied;
  4. 「BossActor.cpp」に移動し、次のクラス ライブラリを追加します。

        #include "Components/BoxComponent.h"
  5. 次のクラス定義を実装します。

        ABossActor::ABossActor()
        {
            BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComp"));
            BoxComp->SetBoxExtent(FVector(128, 128, 64));
            BoxComp->SetVisibility(true);
        }
    
        void ABossActor::HandleBossDiedEvent()
        {
            OnBossDied.ExecuteIfBound();
        }
    
        void ABossActor::NotifyActorBeginOverlap(AActor* OtherActor)
        {
            HandleBossDiedEvent();
        }
  6. このコードを コンパイル します。

  7. C++ Classes」フォルダから BossActor を右クリックし、[C++ Class Actions (C++ クラス アクション)] ドロップダウンメニューから [Create Blueprint class based on BossActor (BossActor に基づいてブループリント クラスを作成する)] を選択します。ブループリント クラスに「BP_BossActor」という名前を付けます。

    image_4.png

  8. BossActor のインスタンスをレベルにドラッグします。

    image_5.png

完成コード

BossActor.h

    #pragma once
    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "BossActor.generated.h"

    DECLARE_DELEGATE(FOnBossDiedDelegate);
    UCLASS()

    class BPCOMMUNICATION_API ABossActor : public AActor
    {
        GENERATED_BODY()

    public:

        // このアクタのプロパティのデフォルト値を設定します。
        ABossActor();

    protected:

        // ゲームの開始時またはスポーン時に呼び出します。
        virtual void BeginPlay() override;
        UFUNCTION()
        void HandleBossDiedEvent();
        UPROPERTY(EditInstanceOnly, BlueprintReadWrite)
        class UBoxComponent* BoxComp;
        virtual void NotifyActorBeginOverlap(AActor* OtherActor);

    public:

        // フレームごとに呼び出します。
        virtual void Tick(float DeltaTime) override;
        FOnBossDiedDelegate OnBossDied;
    };

BossActor.cpp

    #include "BossActor.h"
    #include "Components/BoxComponent.h"
    #include "BPCommunicationGameMode.h"

    // デフォルト値を設定します。
    ABossActor::ABossActor()
    {
        // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
        PrimaryActorTick.bCanEverTick = true;
        BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComp"));
        BoxComp->SetBoxExtent(FVector(128, 128, 64));
        BoxComp->SetVisibility(true);
    }

    // ゲームの開始時またはスポーン時に呼び出します。
    void ABossActor::BeginPlay()
    {
        Super::BeginPlay();
    }

    void ABossActor::HandleBossDiedEvent()
    {
        OnBossDied.ExecuteIfBound();
    }

    void ABossActor::NotifyActorBeginOverlap(AActor* OtherActor)
    {
        HandleBossDiedEvent();
    }

    // フレームごとに呼び出します。
    void ABossActor::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    }

このセクションの結果

このセクションでは、Box コンポーネントを含む BossActor クラスと、イベントが実行されたときに他のアクタ クラスにシグナルを送るのに使用される OnBossDied イベントのデリゲートを作成しました。

3 - インタラクティブなドアを作成する

  1. C++ クラス ウィザード で、新規 Actor クラスを「DoorActor」という名前で作成します。

  2. 「DoorActor.h」ファイルに移動し、次のように宣言します。

        #include "Components/TimelineComponent.h"
  3. 以下のクラス定義を宣言します。

        // カーブ アセットを保持するための変数
            UPROPERTY(EditInstanceOnly)
            UCurveFloat* DoorTimelineFloatCurve;
    
        protected:
    
            void BossDiedEventFunction();
            UPROPERTY(EditInstanceOnly,BlueprintReadWrite)
            class ABossActor* BossActorReference;
    
            //ドア アセットを表現するための MeshComponent
            UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
            UStaticMeshComponent* DoorFrame;
            UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
            UStaticMeshComponent* Door;
    
            //ドア メッシュをアニメートするための TimelineComponent
            UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
            UTimelineComponent* DoorTimelineComp;
    
            //トラック イベントを更新するための Float トラック シグネチャ
            FOnTimelineFloat UpdateFunctionFloat;
    
            //タイムライン グラフに対するドアの相対位置を更新する関数
            UFUNCTION()
            void UpdateTimelineComp(float Output);
  4. DoorActor.cpp」内に、次のクラス ライブラリを宣言します。

        #include "BossActor.h"
  5. 次のクラス定義を実装します。

        ADoorActor::ADoorActor()
        {
            //デフォルト コンポーネントを作成します。
            DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh"));
            Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh"));
            DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp"));
    
            //アタッチメントを設定します。
            DoorFrame->SetupAttachment(RootComponent);
            Door->AttachToComponent(DoorFrame, FAttachmentTransformRules::KeepRelativeTransform);
            Door->SetRelativeLocation(FVector(0, 35, 0));
        }
    
        // ゲームの開始時またはスポーン時に呼び出します。
        void ADoorActor::BeginPlay()
        {
            Super::BeginPlay();
    
            //UpdateTimelineComp 関数の出力に Float トラックをバインドします。
            UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp);
    
            //Float カーブがある場合は、そのグラフを更新関数にバインドします。
            if (DoorTimelineFloatCurve)
            {
                DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat);
            }
    
            if (BossActorReference)
            {
            BossActorReference->OnBossDied.BindUObject(this, &ADoorActor::BossDiedEventFunction);
            }
        }
    
        void ADoorActor::BossDiedEventFunction()
        {
            DoorTimelineComp->Play();
        }
    
        void ADoorActor::UpdateTimelineComp(float Output)
        {
            // ドアの新しい相対位置を、タイムライン カーブからの出力に基づいて作成および設定します。
            FRotator DoorNewRotation = FRotator(0.0f, Output, 0.f);
            Door->SetRelativeRotation(DoorNewRotation);
        }
  6. コードをコンパイルします。

  7. コンテンツ ブラウザ[Add/Import (追加/インポート)] > [Miscellaneous (その他)] > [Curve (カーブ)] を選択します。

    image_6.png

  8. [CurveFloat] を選択して CurveFloat アセットに「DoorCurveFloat」という名前を付け、DoorCurveFloat アセットをダブルクリックします。2 つのキーを Float カーブに追加し、1 つのキーに時間の値「(0,0)」を、もう 1 つ のキーに時間の値「(4,90)」を割り当てます。

    image_7.png

  9. Shift キーを押しながら 2 つのキーを選択して Auto Cubic interpolation に設定し、カーブを保存します。

    image_8.png

  10. DoorCurveFloat を保存します。

  11. コンテンツ ブラウザから「C++ Classes」フォルダに移動して DoorActor クラスを右クリックし、[Create Blueprint Class based on Door Actor] を選択します。ブループリント アクタに「BP_DoorActor」という名前を付けます。

    image_9.png

  12. BP_DoorActor[Class Defaults (クラスのデフォルト)] 内で [Components (コンポーネント)] タブを探し、DoorFrame Static Mesh コンポーネント を選択して [Details (詳細)] パネルに移動して [Static Mesh (スタティックメッシュ)]を「SM_DoorFrame」に変更します。

    image_10.png

  13. 次に、[Components (コンポーネント)] タブから DoorMesh コンポーネントを選択します。[Details] パネルに移動してスタティックメッシュを「SM_Door」に変更します。

    image_11.png

  14. [Details (詳細)] パネルの [Door Timeline Float Curve (ドア タイムライン フロート カーブ)] から [DoorCurveFloat] を選択します。

    image_12.png

  15. ブループリントをコンパイルして保存します。

完成コード

DoorActor.h

    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "Components/TimelineComponent.h"
    #include "DoorActor.generated.h"

    UCLASS()
    class BPCOMMUNICATION_API ADoorActor : public AActor
    {
        GENERATED_BODY()

    public:
        // このアクタのプロパティのデフォルト値を設定します。
        ADoorActor();

        // カーブ アセットを保持するための変数
        UPROPERTY(EditInstanceOnly)
        UCurveFloat* DoorTimelineFloatCurve;

    protected:
        // ゲームの開始時またはスポーン時に呼び出します。
        virtual void BeginPlay() override;
        void BossDiedEventFunction();
        UPROPERTY(EditInstanceOnly,BlueprintReadWrite)
        class ABossActor* BossActorReference;

        //ドア アセットを表現するための MeshComponent
        UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
        UStaticMeshComponent* DoorFrame;
        UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
        UStaticMeshComponent* Door;

        //ドア メッシュをアニメートするための TimelineComponent
        UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
        UTimelineComponent* DoorTimelineComp;

        //トラック イベントを更新するための Float トラック シグネチャ
        FOnTimelineFloat UpdateFunctionFloat;

        //タイムライン グラフに対するドアの相対位置を更新する関数
        UFUNCTION()
        void UpdateTimelineComp(float Output);

    public:
        // フレームごとに呼び出します。
        virtual void Tick(float DeltaTime) override;
    };

DoorActor.cpp

    #include "DoorActor.h"
    #include "BossActor.h"

    // デフォルト値を設定します。
    ADoorActor::ADoorActor()
    {
        // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
        PrimaryActorTick.bCanEverTick = true;

        //デフォルト コンポーネントを作成します。
        DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh"));
        Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh"));
        DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp"));

        //アタッチメントを設定します。
        DoorFrame->SetupAttachment(RootComponent);
        Door->AttachToComponent(DoorFrame, FAttachmentTransformRules::KeepRelativeTransform);
        Door->SetRelativeLocation(FVector(0, 35, 0));
    }

    // ゲームの開始時またはスポーン時に呼び出します。
    void ADoorActor::BeginPlay()
    {
        Super::BeginPlay();

        //UpdateTimelineComp 関数の出力に Float トラックをバインドします。
        UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp);

        //Float カーブがある場合は、そのグラフを更新関数にバインドします。
        if (DoorTimelineFloatCurve)
        {
            DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat);
        }
    if (DoorTimelineFloatCurve)
        {
            BossActorReference->OnBossDied.BindUObject(this, &ADoorActor::BossDiedEventFunction);
        }
    }

    void ADoorActor::BossDiedEventFunction()
    {
        DoorTimelineComp->Play();
    }

    void ADoorActor::UpdateTimelineComp(float Output)
    {
        // ドアの新しい相対位置を、タイムライン カーブからの出力に基づいて作成および設定します。
        FRotator DoorNewRotation = FRotator(0.0f, Output, 0.f);
        Door->SetRelativeRotation(DoorNewRotation);
    }

    // フレームごとに呼び出します。
    void ADoorActor::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    }

このセクションの結果

このセクションでは、BossActor クラス内にある OnBossDied イベント ディスパッチャーにバインドするインタラクティブな DoorActor を作成しました。このバインディングは、Begin Play 時に発生しますが、BossActor の Box コンポーネント 内のオーバーラップによってイベントがトリガーされた時はいつでもランタイム時に実行されます。

5 - イベント ディスパッチャーをテストする

  1. BP_Door ブループリントをレベルにドラッグします。[Details (詳細)] パネルに行き、[Boss Reference Died] のドロップダウンをクリックし、BP_BossDied を検索し、選択します。

    image_13.png

  2. Bp_DoorActor を選択した状態で、[Details (詳細)] パネルに移動し、[Boss Actor Reference (ボス アクタ参照)] ドロップダウンの矢印をクリックして、「BP_BossActpr」を検索して選択します。

  3. [Play (プレイ)] を押して BP_BossActor に近づき、ゲーム内のボスが死ぬシミュレートをトリガーします。

    image_14.gif

このセクションの結果

このセクションでは、レベル内で BP_DoorActor をテストしました。BP_BossActor's Box コンポーネント が別のアクタに重なってデリゲートをトリガーしたときに発生する OnBossDied イベントにアクタが反応することを確認しました。

このガイドでは、デリゲートを使用して複数のアクタ クラス ブループリント間で通信する方法を学習しました。

次のステップ

デリゲートの使い方が分かったところで、今度は「アクタ通信」ドキュメント ページで参照されている他の通信手段を見てみましょう。

このページは Unreal Engine の前のバージョン用です。現在リリースされている Unreal Engine 5.3 に対して更新は行われていません。
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル