UE5でFPSゲーム制作 Part26-NPCに話しかける

イベントディスパッチャーを使って話しかける

相手に対してアクションを起こすときはブループリントインターフェースを通したメッセージか、イベントディスパッチャーを通して呼び出すかの2つが使われやすいです。

この2つを簡単に分けると、インターフェースは発信者が相手を知っている時にアクションを起こし、ディスパッチャーは受信者が相手を知っている時にアクションを起こすというイメージです。

 

まずはPlayerCharacterにイベントディスパッチャーを追加します。

PlayerCharacter.h

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FInteractEvent);

UPROPERTY(BlueprintAssignable, Category = "Action")

FInteractEvent OnInteractEvent;

UFUNCTION(BlueprintCallable, Category = "Action")

void OnInteractEventDispather();

PlayerCharacter.cpp

void APlayerCharacter::OnInteractEventDispather()
{
    OnInteractEvent.Broadcast();
}

 

BP_PlayerCharacter

BP_PlayerCharacterでインタラクトアクション用のIA_InteractからOn Interact Event Dispatcherノードにつなぎます。

Actor型のHit Item変数が武器かどうかを判断しているので、Actorが武器でない場合はイベントディスパッチャーを呼びます。

 

前武器を拾うためにTraceItemというトレースチャンネルを作りましたが武器だけでなく話しかけるなどのアクション全般を担当するので名前を変更しておきます。

プロジェクト設定のコリジョンからTraceItemというトレースチャンネルをTraceInteractと変更します。

 

つぎにNPCを作っていきます。

新規BPクラスからCharacterを選択し、BP_TalkNPCと名付けて作成します。

BP_TalkNPC

Capsule ComponentのコリジョンレスポンスからTraceInteractのトレース応答をブロックにしておきます。

またSphereコリジョンを追加します。Sphere Radiusを350にし、コリジョンレスポンスはPawnのみにしておきます。

このSphereからOn Component Begin Overlapというイベントを作成します。

On Component Begin Overlapイベントから、PlayerCharacterへキャストし、On Interact Eventにイベントをバインドします。これでプレイヤーがインタラクトしたときにInteractというカスタムイベントを呼ぶことができます。

また、複数のNPCがいる場合、バインドがどんどん増えていくため、会話後にバインドを解除します。ただ、この場合、一度会話をした相手にもう一度話しかけるには一度Sphereの範囲外にいかないといけないので、連続で話しかけられるようにするにはEnd Overlap Eventにバインドを解除をいれるなど少し工夫が必要です。

NPCごとに会話を変えるにはTextIndexをインスタンス上で編集できるようにすればできます。

 

あとはローカライゼーションダッシュボードで翻訳すれば会話できるNPCが完成です。