回答させていただきます。
#1. IsTriggerにチェックを入れる
OnCollisionEnterはColliderのIsTriggerにチェックを入れれば反応しなくなります。
それを利用すれば、無視することはできます。
#2. 相手に教えてもらう
少し回りくどいですが、相手はどのColliderに衝突したか分かるので相手に教えてもらうのも良いかもしれません。
C#
1using UnityEngine;
2
3public class HitMultipleColliderTest : MonoBehaviour
4{
5 [SerializeField] Collider Collider1;
6 [SerializeField] Collider Collider2;
7
8 public void HitCollider(Collider collider)
9 {
10 if(collider == Collider1)
11 {
12 Debug.Log("Hit to Collider1");
13 }
14 else if(collider == Collider2)
15 {
16 Debug.Log("Hit to Collider2");
17 }
18 }
19}
using UnityEngine;
[RequireComponent(typeof(Collider))]
public class HitMultipleColliderTestReceiver : MonoBehaviour
{
void OnCollisionEnter(Collision col)
{
var script = col.gameObject.GetComponent<HitMultipleColliderTest>();
if(script != null)
{
script.HitCollider(col.collider);
}
}
}
#3. オブジェクトを分ける
ひとつのオブジェクトではなくなりますがColliderAとColliderBのオブジェクトを入れ子で持ち、そのオブジェクトに教えてもらう方法です。
オブジェクト
L ColliderA
L ColliderB
C#
1using UnityEngine;
2
3public class HitMultipleColliderTest : MonoBehaviour
4{
5 [SerializeField] HitMultipleColliderTestReceiver Collider1;
6 [SerializeField] HitMultipleColliderTestReceiver Collider2;
7
8 void OnEnable()
9 {
10 Collider1.OnHit += OnHItCollider1;
11 Collider2.OnHit += OnHItCollider2;
12 }
13
14 void OnDisable()
15 {
16 Collider1.OnHit -= OnHItCollider1;
17 Collider2.OnHit -= OnHItCollider2;
18 }
19
20 void OnHItCollider1()
21 {
22 Debug.Log("Hit to Collider1");
23 }
24
25 void OnHItCollider2()
26 {
27 Debug.Log("Hit to Collider2");
28 }
29}
C#
1using System;
2using UnityEngine;
3
4[RequireComponent(typeof(Collider))]
5public class HitMultipleColliderTestReceiver : MonoBehaviour
6{
7 public event Action OnHit;
8
9 [SerializeField] Collider Collider;
10
11 void OnCollisionEnter(Collision col)
12 {
13 OnHit?.Invoke();
14 }
15}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/24 00:31 編集