2dゲーム アイテムを掴んで離すアクションについて

現在スプライトを使用して2Dゲームを制作しており、キャラクターがアイテムを 掴む/離す 処理をしたいのですが、
下記のような予期せぬ動作が起きてしまいます。

340978-1.png

Aは掴む対象の物で、1つのBPをレベル上に2個置いている状況で、
Pはキャラクターです

PがAを1つ掴むときは、問題無いのですが、

Pが既にAを1つ掴んでいる時に、他のAに近づくと、同時に2つ掴んでしまいます。

この挙動にはしたいと思っておらず、

1つ掴んでいる時は、他のAを掴まないようにしたいです。(=1つ以上は掴めない)

またAはたくさん置く想定なので、Aを置く個数ごとに個別のBPを作ることは考えていません。

下記ノード
—————————————————————————————

(Pのイベントグラフ)

PがAに近い時にホールドボタンを押すと、ホールドブーリアンがON/OFFになる

この近いかどうかの検出は

PがAにBeginOverlapするとブーリアンがON

PがAにEndOverlapするとブーリアンがOFF

の処理で行っています。

(Aのイベントグラフ)

ホールドボタンが押されている&このAがPに近づいていたら、
Pに追従する

※AにPの座標を代入して追従=掴む

※Xは奥行きなので0に

ちなみにAがPに近づいているかを分岐ノードの条件に繋いでいる理由は

この処理がなかった場合、1つのAの近くでホールドを押すと、レベル上全てに配置されているAが一気にPに集まってホールドしてしまうからです

つらつらと書きながら、そもそもこの実装方法は周りくどいかもしれない…と思ってきましたが

解決方法がお分かりになる方がいましたらご回答いただければと思います。

また、ご回答いただいた内容が今より実装方法が大まかに違っても

望んでいる処理ができるならば、実装をまるっと変えてしまいたいと思っています。

よろしくお願いいたします。

そうですね…正直言うと無駄に複雑になっていると思います
PとAとの間の話なのにGameInstanceが絡んできているところが特に…

まず複数掴んでしまう原因から考えましょう
AはPが近くにあり、掴む状態に入っていたらくっつく、という挙動になっています
が、 Pが別のAを掴んでいる、という情報は一切見ていません
ですので、各々掴まれてるのは自分だと思い込み、各々の判断で勝手についてきているわけですね

逆にPから見ると、Pは掴む状態にこそなるものの、 今何を掴んでいるのか把握していません
掴む動作さえすれば、あとはAが勝手についてくる状態になっているわけです
勝手についてくるので、掴む数をコントロールするどころではありませんね

ですので、Pの掴む数をコントロールしたいのであれば、まずPがどのAを掴んでいるのかを明確化する必要があります

なお謎の第三者(GameInstance)はAとPの間を取り持っているふうに見えますが…いちいち第三者を通してやり取りするのは無駄なように見えますね


僕ならどうするか?という一例を貼っておきます
P側に当たるBPです
掴んだActorを変数に持ち、PがどのAを掴んでいるのか把握できるようにしています
Attachするなら移動処理は不要になりますが、元の構成に合わせてあります

A側には処理は書きません
Aが自分で動くこと、が重要なのであれば、移動処理はA側に書き、P側は掴んでいるものに対して移動を許可する形にすると良いでしょう

なおGameInstanceは不要です

T_Sumisaki さん

プロジェクトに組み込むのが遅れ、返信遅れてしまいました。すみません。

ご回答頂いた実装で無事解決しました!
丁寧に答えていただきありがとうございました。