確認したいこと
Rigidbody+Colliderを持つオブジェクト(A)が、トリガー化したColliderを持つ複数のオブジェクト(B,C)の範囲内に"同時に"入ったとき、AのOnTriggerEnter2D(Collider2D)に渡されるB,Cの順番を確認したい。
例えば、大きめの弾丸が複数の敵に同時ヒットしたケースや、長い剣が盾と肉体に同時に突き刺さったケースで、この仕様が気になってくるのかなと。
結局わかったこと
試行のたびに、AのOnTriggerEnter(Collider2D)に渡されるB,Cの順番が変わる。ただし完全にランダムな順番ではなく、何らかの法則はある様子。
確認のために用意したプロジェクト
Unityのバージョン:2022.3.15f1
「白い円」と「赤い円」と「青い円」を用意。
- 白い円
前述のオブジェクトAに相当。Rigidbody+Collider。 - 赤い円
前述のオブジェクトBに相当。トリガー化したCollider。タグはRed、レイヤーはDefault。 - 青い円
前述のオブジェクトCに相当。トリガー化したCollider。タグはBlue、レイヤーはDefault。
スペースキーを押下すると赤い円と青い円のColliderの有効/無効が切り替わり、有効化のタイミングで白い円のOnTriggerEnter2D()が呼ばれる...というスクリプトを作成した。
赤い円のスクリプトは下記の通り。青い円も同様。
private CircleCollider2D circleCollider;
void Awake()
{
circleCollider = GetComponent<CircleCollider2D>();
circleCollider.enabled = false;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
circleCollider.enabled = circleCollider.enabled ? false : true;
Debug.Log("Blue Trigger : "+ circleCollider.enabled);
}
}
白い円のスクリプトは下記の通り。
public class WhiteCircle : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Blue"))
{
Debug.Log("BLUE!");
}
if (collision.gameObject.CompareTag("Red"))
{
Debug.Log("RED...");
}
}
}
結果
上記のプロジェクトを実行し、スペースキーを何度か押した。そして、白い円のOnTriggerEnter2D()に渡されるオブジェクトが赤、青どちらが先なのかを記録した。
1回目:青い円が先
2回目:赤い円が先
3回目:青い円が先
4回目:赤い円が先
5回目:青い円が先
6回目:赤い円が先
...
32回試したが、青い円が先のケースと赤い円が先のケースが交互に発生した。
→つまり、試行のたびに、AのOnTriggerEnter(Collider2D)に渡されるB,Cの順番が変わる。ただし何らかの法則はある様子。