質問: 当たり判定時のGetComponentについて こんにちは。 GetComponentは処理が重いのであまり使わない方が良いと聞いたのですが、当たり判定時のPhysicsクラスなどを使った時やOnCollisionEnter等の内部で、どんなオブジェクトに当たったのかを調べる時にはGetComponentを使わざるを得ないように思うのですが、皆さんはどうしているのでしょうか?
回答: こんにちは。 細かい所を気にしていると、ちょっとした気づきもあり楽しいですよね。 本題ですが、多分パフォーマンスに対する懸念が根底にあるのかな?と推測します。 GetComponent自体はオブジェクトについてるコンポーネントを上から舐めるだけなので気にするレベルでは無いと思います。 そのうえで敢えてやれる事は無いか?と言うと 質問のOnCollisionEnterの場合はまず、Collisionクラスからrigidbody、Transform、gameobjectが取れます。 これだけでも、相当幅が広がる筈です。GameObjectなんて、名前やTagも持ってますので。 他にもContactsからそのフレームで侵入した相手のN数分の場所、入射のNormal、collider等が取れます。これらを使えば物理挙動は結構カバー出来ると思います。 又、GetComponentを成るべく減らす手としてはStart時にキャッシュしてしまう手法があります。 ○○クラスをアタッチして、○○クラスのStartやAwakeで同Objectにあるコンポーネント類を全て取得しておいてしまう方法です。 接触時にGetComponentをする際にこのアタッチした○○を一回とれば他のコンポーネントは皆取れる形になります。 ただこれはキャッシュをPublicにしないと、相手に通知する為の過程を生む為、パフォーマンス的には本末転倒になり、GetComponentの方がいいやと成ります。 Publicにしたらしたで、どのオブジェクトがどのオブジェクトに影響を及ぼしたか把握し辛く成り、今度は設計的に把握し辛くなってきます。 Publicにする場合は、明確に、当てる方が取得するんだ!いや当たる方が取得するんだ!と、開発関係者で意思統一することをお勧めします。 世間的にはパターンやベストプラクティスは転がっていますが、自分で出来る事はやっておくんだ!と言う気持ちは大事にしたいところですね!頑張って下さい!