takomk2
(takomk2)
1
NPCアクタに敵味方の識別機能を実装したいと考えています
現時点では、AIControllerのAIPerceptionで検出したアクタに対し
EQSのDistanceでスコアを割り当てる形でアクタの検出を行っています
(Lyraサンプルを参考にしています)
ここに敵味方の識別機能を追加したいと考えています
→検出したアクタとチームが同じ場合、検出しない(スコアを0にする?)
具体的な方法として現在、プレイヤー/敵の各アクタのTags[0]にチーム番号を入れています
これを参照し、チーム番号が同じならば検出しないという形で実装したいと考えていますが
現状のEQSテストでの実現方法が分からないため、お力をお貸しいただきたいです
可能な限りBPで実現したいと考えていますが、公式ドキュメントにカスタムテストを作成するにはC++必須という記載があったため
C++でしか実現できない可能性もあると思っています
その場合、どの部分を編集すればいいかご教授いただきたいです
PAVI_PAVI
(PAVI_PAVI)
2
テストで敵味方をフィルタリングするのではなく、ジェネレータでフィルタリングしてしまうのはどうでしょう?
ジェネレータはブループリントで自作することができます。
例えばGet All Actors of ClassでCharacterクラスを集め、Actor Has TagノードでQuerierと同じタグを持つキャラクター(つまり味方)をAdd Generated Actorすると味方のみにアイテムを生成できます。
以下のドキュメントページのCustom Generatorsの項目にジェネレータをブループリントで実装する方法が紹介されています。
takomk2
(takomk2)
3
PAVI_PAVI様
アドバイスありがとうございます
リファレンスを参考に自作ジェネレータを作成し、EQSを以下のように変更しました
(Generator_GetEnemyActorsが自作ジェネレータです)
アクタの検出自体はできたのですが、うまくいっていない部分が多く知恵をお借りしたいです
現状プレイヤーのTags[0]にTeam1、敵のTags[0]にTeam2を与えていますが
この状態で複数の敵を配置して動かしたところ、同チームにもかからわず同士討ちを始めてしまいます
(GetQuerierからタグの値を取得しても同様の結果でした)
ジェネレータの設定が間違っているのでしょうか…
また、最終的な実装として、敵のAIPerceptionと紐づけるために
自作ジェネレータとPerceivedActorsをCompositeして以下のように実装したいと考えています
ただ、現状の方法だとこのような実装はできないように思います
Composite+自作ジェネレータの組み合わせでこのような実装が可能なのかご教授いただきたいです
(Compositeの使用法を勘違いしていたら申し訳ありません)
PAVI_PAVI
(PAVI_PAVI)
4
理由はわかりませんが、確かに画像のように実装すると敵も味方も区別なくアイテムを生成してしまいますね…
試しにGet All Actors of ClassのActor Classを「Character」に変更すると正しく動作しました。
Compositeを使って実装は可能ですが、PerceivedActorsとGenerator_GetEnemyActorsを組み合わせても望ましい結果は出ないと思います。
Generator_GetEnemyActorsではGet All Actors of Classによって視野に含まれないアクターまで取得するので、Perceived Actorsの働きが無効になるからです。
例えば画像のように実装するとPerceived Actorsとうまく機能するはずです。
takomk2
(takomk2)
5
PAVI_PAVI様
迅速なご回答ありがとうございます
情報いただいた通り、検出クラスを子クラスのCharactorに変更したところ
正しく敵味方の識別を行えました
またAIPerceptionとの連携についてもご教授いただいた方法で実装できそうです
色々とありがとうございました