質問: ### 前提・実現したいこと 衝突や検知などでゲームオブジェクトのコライダーを取得したとき、 そのコライダーのゲームオブジェクトが単一のゲームオブジェクトでなく、 キャラクターなどの階層構造でコライダーも階層の中にあり、 その取得した相手のゲームオブジェクトにスクリプトで何かしらの振る舞いをさせたい場合、 どういった設計がよいのかご教示お願い致します。 ### 試したこと 例えば、キャラクターの手の部分のゲームオブジェクトにコライダーがアタッチしていて、 その手の部分のゲームオブジェクトは、キャラクターのルートオブジェクトでない場合を想定します。 このような場合、キャラクターのゲームオブジェクトの設計と、 その取得した手のゲームオブジェクトから、キャラクターに何かしらの振る舞いをさせる方法としては、 次のようなものがよいのかと考えました。 ``` ・キャラクターの振る舞いをするスクリプトはキャラクターのルートオブジェクトにアタッチさせる。 ・取得したコライダーの手のゲームオブジェクトからルートのゲームオブジェクトを取得して、 GetComponentでキャラクターのスクリプトにアクセスし、そのスクリプトで振る舞いを実行する。 ``` このような設計が良いと考えているのですが、いかがでしょうか? もしくは他にも良い設計がある場合、ご教示お願い致します。 また、GetComponentは負荷がかかるという認識がある為、なるべく避けたいのですが、 コライダーからスクリプトを取得する場合は、GetComponentしか方法がないと思うのですが、いかがでしょうか? すみません、もう1点質問です。 今回のコライダーに限らず、そしてキャラクターにも限らず、基本的に階層構造のゲームオブジェクトは、 基本的にルートのゲームオブジェクトにスクリプトをアタッチすべきと考えているのですが、いかがでしょうか?
回答: GetComponentは重いので、複数回取得するのなら、変数に入れておきましょう、ということでしょう とりあえず、私なら親のStartで自分自身に処理を移譲してくれるようにかきますかね ``` public class Hit : MonoBehaviour { public Player player; void OnTriggerEnter(Collider collision){ player.TriggerEnter(collision); } void OnCollisionEnter(Collision collision){ player.CollisionEnter(collision); } } 親のスタート void Start(){ var player = GetComponent(); foreach(var c in GetComponentsInChildren()){ var hit = c.gameObject.AddComponent() as Hit; hit.player = player; } } ```