お世話になります。
オーバーラップするコンポーネント(BoxCollision)を動的に変更したいのですが、うまく行かなく詰まっております。
BoxCollisionのオーバーラップを通常通り指定すると、オーバーラップイベントが発生するのですが、一度変数に入れてその変数のオーバーラップイベントを発生させようとすると、発生しません。
画像の「attackweapon1」「attackweapon2」を場合に応じて発生させたいのですが、それぞれのオーバーラップイベントを羅列していくしか方法はありませんでしょうか?
ご教授願います。
動的に切り替えたい理由がよくわかりませんが、 一度変数に入れて~
のほうがうまくいかない理由は、変数の中身がイベントの定義時には空であるため、イベントが定義できていないためです。
ところで2つのCollisionの役割は異なるのでしょうか?
おそらく同じ変数に入れて切り替えたいという要望から汲み取った限りでは、2つのCollisionの役割は共通である、という印象を受けます。
そういう場合は、関数やカスタムイベントを通すことで処理を共通化するのが一般的です。
参考になれば幸いです。
BeginPlayは「初期化の一番最初に実行されるイベント」ではありません
ActorがSpawnした後、最初のTickが開始されるタイミングで呼ばれます
EventノードでBindされるEventについてはおそらくConstructionのタイミングでBindされると思われます
そのタイミングにおいて、変数にはComponentに対するPointer(Reference)が設定されていないと予測されますので、どのComponentにもBindされません。
なお、変数内の参照を切り替えたからといって、EventのBind先は変更されません。
EventのBind先はあくまでもComponentのインスタンスであり、変数はインスタンスに対する参照を持っている、という関係でしかありません。
ですので、質問本文の試みは実現できないと思われます
以下個人的な見解ですが、
「役割が違う」が「同じイベントを実行したい」という考え方は破綻しているような気がします。
役割が違うなら、イベントは分けておくべきでしょう。
そのほうがシンプルです。
また、変数が1つしかないことから「どちらか1つしか有効である必要がない」と推測されるので、片方のCollisionが有効なときはもう片方を無効にする、という方が運用的には良いかと思います。
同じイベントに流したい場合は、AddEventで生成されるEventノードではなく、Bindノードを使いCustomEventをバインドするようにすると良いでしょう
これを変数を用いてやるならば、参照先が変更される前にUnbindして、参照先が変更されたあとにBindするという少々面倒な手順を踏むことになります
バグの要因になりえるので、個人的にはやりたくない手法です
ご回答ありがとうございます。
変数の中身がイベントの定義時には空
とのことですが、beginplayよりも先にイベントの定義が走ってしまっているということでしょうか?
その場合、どのような対策が考えられますか?
二つのコリジョンはキャラクター毎に異なった武器の当たり判定を持っており、武器の形状やコリジョンのプリセットを変更したりといった観点から、役割の異なったコリジョンとなっています。
そのため、今後の管理としては、コリジョン単位で持たせておいて、それを切り替える方が良いかと考えています。
こちらの件ですが、墨崎さんに直接お伺いさせていただきました。
手法として、コンポーネントでコリジョンを切り替えるのではなく、child ブループリントを用いて親の機能を継承し、子ブループリントの中でコリジョンを分ける形を取る形が良さそうです。
ありがとうございました。