質問: ### 前提・実現したいこと PhysicsのOverlap系のメソッドで、 検知領域内に入ったオブジェクト(例えばキャラクター等)には、 そのオブジェクトが持っている振る舞いA(わかりやすくin_method)を実行し続け、 検知領域内に入っていないときは振る舞いB(out_method)を実行し続ける処理について考えています。 (振る舞いAも振る舞いBも、一度、それに対応する振る舞いメソッドが呼ばれたら、振る舞いし続けるものとします。) この処理に関して、どういった設計で実装できるかご教示お願い致します。 いろいろなやり方があると思うので、この設計が1番良いという正解はないかもしれませんが、 もしベストな方法があれば知りたいですし、なくても、どういった設計があるのか知りたいです。 ご教示お願い致します。 ### 試したこと 自分が考えた設計は下記2点です。 ``` 1点目。 UpdateのOverlapで予め検知で取得したコライダー配列を前のフレームの検知取得コライダー配列として保存しておく。 さらにUpdateで前フレームに取得したコライダーの配列と、Overlapで現在のフレームで取得しているコライダーの配列を比較し、 差分要素を抽出する。 差分要素が前フレーム配列に属しているものは、今のフレームで検知外に出たコライダーなので、out_methodを実行する。 差分要素が現在のフレーム配列に属しているものは、今回新たに検知されたコライダーなので、in_methodを実行する。 2点目。 予めフィールドに、検知に関して管理するオブジェクト全てを配列に格納しておく(all_arrという名前の配列にしておきます。) Updateでall_arrと、Overlapで取得したコライダー配列を比較する。 Overlapのコライダー配列に属している要素は、in_methodを呼ぶ。 all_arrの、Overlapのコライダー配列の要素を取り除いた要素は、out_methodを呼ぶ。 ``` 2点目に関しては、オブジェクトのフィールドに現在、検知内か検知外かを管理するフラグを立てておいて、 例えば、既に検知内のフラグが立っているのに、in_methodが呼ばれようとしてたら、フラグの条件分岐で、 in_methodは呼ばないことにして、重複呼び出しは避けます。 ただし、Update毎に必ず、all_arrの全ての要素のオブジェクトは、 少なくともフラグによる条件分岐を行わなければならないので、効率的じゃない気がして、 いい設計ではないような気がします。 この他の設計や、または自分が考えた設計に関して改善点等があればご教示お願い致します。
回答: ちょっと、やりたいことが**詳細すぎて**よく分からないのですが、達成したいことってなんでしょうか? 「とある範囲にキャラクターが入ったら動きを変える」みたいな動作で認識あってますか? シンプルに考えるのであれば、全体を管理するオブジェクトを用意するのではなく、キャラクター自身で「とある範囲に入ったかどうか」を検知して振る舞いを変えるのがいいかなと思いました。 いわゆるAI的な感じで挙動を変えるってことですね。 質問を見ていると、全体を管理するオブジェクトの必要性をあまり感じなかったので。