[UE4]LastSensedStimuliの順序について

概要

AI Perception ComponentのGet Actors Perceptionノードで得るLast Sensed Stimuli配列の順序は

AI Perception ComponentのSenses Configで設定した順序とは必ずしも一致しない。

(UE4.23.1調べ)

詳細

・Last Sensed Stimuliの並びはSenseID順である

・SenseIDはAISense派生ClassがUpdateSenseID()した順に発行される

・UpdateSenseID()は、AI Perception ComponentのOnRegister()時に、Senses Configの順序で呼ばれる

・発行されたSenseIDはAISense派生ClassのDefault Objectに保持される

即ち、EditorなりRuntimeなりのUE4インスタンスが起動している間、SenseIDは固定になる。

よって、以下の様な事をすると順序が一致しなくなる。

・Senses ConfigにひとつSenseを追加してPlayした後、別のSenseを0番目に挿入した

→この場合はUE4再起動で一致するようになる。

・AI Perception Componentが複数存在し、Senses Configの並びが一致しない

→視覚NPCと聴覚+視覚NPCが共存する場合などが該当。

→Senses Configの並びを揃えれば一致するが、歯抜けがあるとやはり一致しない。

対応

これらの順序が一致するとした公式Documentやコードコメントは見つけられなかった。

順序は揃わない前提でノードを組む方が良いだろう。

Stimuliの正体はGet Sense Class for Stimulusで識別できる。

AIPerception last sensed stimuli suddenly swappedposition - UE4 AnswerHub

文字列処理の負荷が気になる場合は、C++で上記ノードの処理を流用すればindexまで変換できるだろう。

所感

ユーザー側でAISense派生Classを増やせるのでIDが動的に発行されるのは納得である。

このIDを振る仕組みのtemplateテクニックも中々面白かった。

IDの固定化は配列参照の高速化に寄与しているはずで(コードの組みやすさもある)、

エンジン側としては高速に動作するものを提供していると考えれば妥当な挙動ではないかという気はする。

ユーザー側で各AI Perception Componentが順序を一致させるような拡張をするのは自由だ。

Last Sensed Stimuli配列のIndexを直値で参照するのはいわばハックであり、実験的Project等ならば有効だが、

スケールしたい場合は丁寧に処理した方が良いだろう。

以上