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をインスタンス上で編集できるようにすればできます。