ちょっと私の知る限りOnTrigger○○やOnCollision○○では、衝突している複数のオブジェクトの同時取得は難しかったと思います。
ただいくつか代替案があります。
1つ目は、Physics.OverlapBox()
を使う方法です。
Physics.OverlapBox
この関数では指定した位置や大きさを指定することで、その内部にあるColliderを全て取得することができます。
ただし、自分自身のColliderまで取得してしまう点や、レイヤーマスクの指定は自らで行う必要があります。
csharp
1void FixedUpdate()
2{
3 // ※ 自分自身にColliderがアタッチされている場合、自分自身も返り値のリストに含まれるので注意が必要です
4 Collider[] collisions = Physics.OverlapBox( transform.position, GetComponent<BoxCollider>().size / 2.0f, transform.rotation );
5}
球型のPhysics.OverlapSphere()
もあります。
Physics.OverlapSphere
2つ目は、OnTriggerStay()
で衝突したオブジェクトをリストで管理し、FixedUpdate()で処理する方法です。
csharp
1using UnityEngine;
2using System.Collections.Generic;
3
4public class Test : MonoBehaviour
5{
6 // 衝突しているオブジェクトリスト
7 private List<GameObject> m_hitObjects = new List<GameObject>();
8
9 void FixedUpdate()
10 {
11 if( m_hitObjects.Count >= 2 )
12 {
13 // TODO:2つ以上同時に衝突していた場合の処理
14 }
15
16 // 毎回衝突したオブジェクトリストをクリアする
17 m_hitObjects.Clear();
18 }
19
20 void OnTriggerStay( Collider i_other )
21 {
22 // 衝突しているオブジェクトをリストに登録する
23 m_hitObjects.Add( i_other.gameObject );
24 }
25}
26
ただし、こちらのイベント関数の実行順を見てもらえればわかる通り、1更新分遅れてしまう欠点があるので注意が必要です。
イベント関数の実行順
ご参考になればと思います。