たくさんの会話できるnpcを実装する方法

お世話になっております。
以前こちらの質問をした者です。

前回の質問にいただいたアンサーにより、

  1. プレイヤーキャラクターがNPCに話しかける
  2. カスタムイベント「会話イベント」がONになる
  3. 会話イベント」を持つアクターであるTalkAIがセリフをしゃべる

といった仕組みを作ることができました。

これをアレンジして、
NPCを複数配置してセリフの種類を増やそうとしたのですが、
TalkAIを親にしているカスタムイベントには
複製したNPCからはアクセスできず(わかりにくい書き方ですみません)、
アクターの数だけ個別にキャストする、という形になってしまいました…。

このままだとNPCの数だけ「Cast to TalkAI」と「会話イベント」をつなげていくことになりそうです。
すっきりまとめる方法などございますでしょうか。
初歩的な質問になりすみませんが、よろしくお願いいたします。

※ちなみに、「create advanced dialogue」といったオリジナルのノードは、メッセージを出すためのもので、
マーケットプレイスから購入しました。

※2 すみません、上記の画像のノードの組み方間違っていました…。
BoxTraceByProfileからピンをTalkAI2に伸ばしてこないとどちらにしろ動きませんでした。
しかし、BoxTraceByProfileピンを同時に2本以上伸ばせないという点でもこの方法は無理があるようです…。

親、という表現が間違っているように思えますね
親子関係があるなら、子が親のイベントを呼ぶことは当然できるので
つまり、単に複製してある、ということですね

継承の概念そのものに関しては、オブジェクト志向というプログラムの概念によるので、ここでは説明しません
検索すれば山程参考資料が出てきますので、肌が合うものを探して読み込んでください

会話が必要なNPC毎にクラスを複製して…という考えだったのでしょうが、それは実に非効率です
こういったものは共通化するに限ります

DialogueのAssetの使い方をよく見てみると、DataTableのRowNameを指定していますね
このRowNameさえ変数として持つことができれば、あとの動作は基本的に同じで良いはず…という感じで
共通項目と変数を分けて設計をしていくことになります

細かい分岐に関してはまた別途頭を捻ることになりそうですが、一般的に大量に配置されるActorは、基礎部分を共通化し、Parameterで動作を切り替えられるように設計されています

参考

ご回答ありがとうございます。
参考に上げていただいたサイトを3つとも見てみたのですが、
理論からの話が多かったため、これをどのように自分のやりたいことに
適用すればよいかわかりませんでした…。おでんの記事は実践的でしたがやはり会話するNPCにどう応用するのか?で止まってしまいました。
素人質問でたいへん申し訳ないのですが、もう少し詳細なご説明をいただければ幸いです…!

質問に対する答えとはならないと思いますが、つい先ほどこういった記事が上がっていました。参考にどうぞ。

【UE4】NPCとの会話システム実装

プログラミングには基本的に「やりたいことにそのまま使える正解のサンプル」なんてものはありません
ですので、自分のやりたいことにするにはどうすればいいか、というのを常に考える必要があります

それから、難しいことを難しいまま考えて実現しようとしても、大抵は実現できません
ですので、簡単に考えられるように分解する必要があります

うまく分解できれば、その小さい単位であればすぐにサンプルが見つかるか、うまい方法を思いつくかもしれません

今回でいうと「人物が複数人いて、それぞれ違うことを話す」というところが重要ですね
他の要素(DialogueのAssetの使い方等)は一旦脇に置いて、重要なところをいかに実現するかを考えましょう

上記納得がいかなければ、心ゆくまで検索してみると良いでしょう


一応サンプルは用意しました

NPCのクラスです
話しかけられたら、決められた文言を返すように設計します
人物毎に別の内容を返してもらいたいので、この部分は変数にすべきですね
このとき、InstanceEditable(インスタンス編集可能)にチェックを入れておきましょう

次に、Playerのクラスです
今回は単純に、目の前をチェックして、NPCがいれば話しかけるようにしました

そして、作ったNPCをLevelに配置し、Details(詳細)パネルで変数にした会話内容を編集します
これで、同じBPだけど違うことを話すNPCができました
あとはこれを応用すれば、Dialogueのアセットを使うのであれば、データテーブルのRowNameあたりを変数にしておけば、それに従った内容を喋らせる事ができますね

同じように会話をするけれど、会話時の処理を変えたい、という考えが出てきた場合は、ChildBlueprintClass…いわゆる継承をしてみると良いでしょう

今回の例では、NPCのクラスを継承して、話しかけられた回数を数えるようにしてみました
なお、Player側は変える必要がありません
NPCクラスに対してアクションするようにしておけば、NPCクラスを継承したクラスにも同じようにアクセスできるからです
(このへんの理由に関しては、オブジェクト志向について調べてみるべきでしょう)

丁寧なご説明、ありがとうございます。
とても勉強になりました。

>あとはこれを応用すれば、Dialogueのアセットを使うのであれば、データテーブルのRowNameあたりを変数にしておけば、それに従った内容を喋らせる事ができますね

購入したBP( Extreme Dialogue System:ブループリント - UE マーケットプレイス )の
RowNameを変数にできないか見てみたのですが、
このBP、テキストを出すだけでなくカメラワークをつけたりすることができるもので、
ブループリントもとんでもなく複雑化していました…。
「ブループリントファンクションライブラリ」クラスに変数を作ろうとしましたが、
このクラスにはローカル変数しか作れないようで…。
今の自分の実力では購入したものをアレンジするのは難しそうでした。
(イベントの開始条件がOnComponentBeginOverlaoになってしまうのに目をつぶれば
そのまま使えますが、やはりキーを押して話しかける動作にこだわりたかったので)

教えていただいた方法を参考にイチから同じような仕組みを作れないか、
模索してみたいと思います。
C++はおろかブループリントの仕組みもよくわかっていないことを痛感したので、
もう一度基礎を固めようと思います。

貴重なお時間を割いていただきありがとうございました。

情報ありがとうございます!
購入したブループリントはとても複雑でほとんど意味が分からなかったのですが、
この記事を読んでさっそくその一部は謎が解けました…!
こちらの記事を参考に作り直したほうが、機能は少ないですが確実そうですね。
試してみようと思います。