キャラクターに話しかけてフラグが立つ仕組みを作りたい

レベル上に配置したTalkAIというキャラクターに話しかけ、Hello!というメッセージが出たら
フラグを立て、Cleared!という文字列を出したいです。

Boolean変数「Talkto」を使って「Hello!を読んだかどうか」を判断し、
もしTalktoがtrueならCleared!というメッセージを出す、というやり方で実現しようと思いました。

以下のサイトを参考にしてEvent Any Damage を使って当たり判定?を得るようにしました。

しかし、レベルブループリント上からTalktoを呼び出そうとして、Cast To TalkAIを配置すると、
参照元のオブジェクトに何を設定してもエラーになってしまいます。
(言わずもがな、TalkAIの親クラスはキャラクターです)

ブループリント間でイベントを呼び出すには「カスタムイベント」を使うのが一般的という
情報を見かけたのですが、EventAnyDamageが必須な都合上、カスタムイベントが使えず…。
他に「バインド」を使う方法もありそうでしたが、
EventAnyDamageには対応していないようでピンをつなぐことができませんでした。

最終的にはこの仕組みを使ってRPGのようにフラグを回収していく仕組みを作りたいと思っているのですが、
UE4でJRPGっぽいものを作る講座で初心者向けのものが見つからず手詰まりです…

どなたか知恵を貸してくださればありがたいです。よろしくお願いします。

まず、AnyDamageイベント及びApplyDamage関数はあくまでダメージを与えるために使われるもののため、今回のように話しかけるために使われるのは適切ではありません。

参考にされたサイトの方法でイベントを取得することももちろん可能ですが、不適切な使用方法のためあまりお勧めはしません。

そこで、話しかける反応を取りレベルブループリントがそれを判断するという処理について解説します。

まず、話しかけられる側にフラグを用意します。カスタムイベントについてはご存じのようなので説明は省略しますが、ほかのキャラクターなどからこの処理を呼び出すことができるようになります。

324358-2.png

そしてこちらがThirdPersonCharacter側のブループリントで、いわゆるプレイヤーの処理の中身です。

参考にされたサイトとほとんど同じ処理の流れですが、DrawDebugTypeに「ForDuration」を設定することでゲーム中にトレース判定が表示されるようになります。

この状態で実行することで、以下のようにトレースを飛ばし、その範囲に話しかけられる側がいれば会話イベントを実行するという処理ができます。

そして、レベルブループリントに移りますが、レベルに配置した話しかけられる側を選択した状態のままレベルブループリントを開き、何もないところで右クリックすることで「TalkAIのリファレンスを作成」という項目が表示されます。

324363-4.png

これにより配置したTalkAIキャラクターの参照、つまり実体を取得できるため話しかけられたかどうかの状況も取得することができます。

そしてTickイベントを追加し、常時話しかけられたかをチェックすることでやろうとしたことはできると思います。

おそらくですが、参考にしたサイトはトレースした後のキャストを嫌いデフォルトで用意されているApplyDamageを利用したものと思われますが、これがやや混乱のもととなっているようです。

実装する方法はこの方法の他にもBoxCollisionを利用した判定の取得やインターフェースを用いた汎用的なイベント呼び出し、GetAllActor関数などによる特定対象の検索など無数にあるため、最適解こそあれ、一つの情報源をみてこの方法以外は使えないという事はまずないでしょう。

長くなりましたが、うまくいくことを願っています。

丁寧な解説をありがとうございます!
アンサーを頂けるか不安だったのですが、とても助かりました。
おかげさまでメッセージを表示することができました。

ただ、今のままだとゲームクリアの表示が
無限に続いてしまうので、
最初にフラグを立てたときに限って発生するイベント、などを
どう実装していくか、が難しそうですね。とにかく頑張ってみます。
JRPGがこんなに高度な仕組みで出来ていたとは…。

また壁にぶつかったらこちらのハブに質問させていただくと思います。
今後ともよろしくお願いいたします。