初質問につき、分かりにくい点などあると思います。
上記2サイトを参考にし、ファイアーエムブレムなどのような戦略ゲームを作成しようと考えています。
マス目アクタを作成し、そこにint型変数Move_Costを作成する形で再現しようと考えました。
しかし、このアクタの隣にあるマス目アクタのMove_Costを参照する方法が調べてもわかりませんでした。
〈座標を指定し、その座標に存在するアクタを参照〉もしくは、〈隣接するアクタを参照〉かができればよいかなと考えたのですが、その方法を実現するために知恵を貸していただけるとありがたいです。
また、図々しいお願いではありますが、BPでの実行例を張っていただけるとありがたいです。
Win11,UE5.3.2の環境で作成しています。
DROSS_JP
(DROSS_JP)
2
アクタの参照の方法について説明すればそこからは理解していそうに思えますので参照の方法だけ。
レベル上に置いたアクタを参照しようとするとレベルブループリントに直接参照させるか、GetAllActorsOfClass等で取得する必要があります。
あるいは、レベル上には置かず、実行時にTileを生成するクラスを用意してそこで生成、そのまま変数として保持しておくという方法もあります。
設計思想にもよるのでどの方法が良いとかはプロジェクト次第なのですが初心者がとりあえずエディタ上でマップ作りつつ希望の実装をするのなら前者が良いのかなと思うので前者の方法ご紹介します。
マス目アクタに座標としてX,Yという変数を追加してください。
全てのマス目アクタを取得するために新しくActorからBP_MapControllerを作成し、上記のようにノードを組んでください。その後、BP_MapControllerをレベルに配置します。
Tileを取得する場合、例えば上記のように組めばとりあえずは取れるでしょう。仕様次第ではいたずらにForLoopせずとももっとスマートに取れますがとりあえずこれで。
MapControllerそのものを何かに持たせる場合はGetActorOfClassで取得しましょう。
仕様が固まってくればそれに応じてもっと効率の良い方法は色々あるかと思いますが、とりあえずはこれをベースに考えれば良いのではないかなと思います。
回答ありがとうございます。
いろいろ試したのですが、キャラクターの行動回数やマス目の量などが多くなると、無限ループしていると判断されてしまいます。
無限ループと判断される基準などってどこなのでしょうか?
マスを少なくするor行動力を下げるのどちらかを行うと無事に実行できるため、処理そのものに問題があるわけではないと信じたいです
BPで実装することにこだわるのであれば、処理そのものに問題がある、という回答になります
BPではループ回数は制限されており、かつループ処理の要素が多くなるほどパフォーマンスが劇的に低下します
ループの閾値はProjectSettingsの Maximum Loop Iteration Count
を参照してください
無限ループの判断はループそのものではなく、1度のイベント呼び出しで実行されるBPノードの数を見ている、と考えてください
理論上のループ回数とイコールではないので、想定より少ないループ回数で無限ループ判定になります
参考にしたものをそのまま制限なく取り入れたいなら、C++で実装することをおすすめします