【问题标题】:How to detect child collision other colliders?如何检测子碰撞其他碰撞器?
【发布时间】:2018-01-25 02:57:18
【问题描述】:

我的 collider 对象有两个子对象,分别是 camera 和 collider(is Triggered = true)。我需要检测碰撞子对撞机并识别此子对撞机所接触的所有对象。

  • gameObject(CapsuleCollider(isTriggered = false), 刚体)
    • 游戏对象(相机)
    • gameObject(CapsuleCollider(isTriggered = true))

我认为这是错误的代码,但也许不是,至少只是出于一些想象:

CapsuleCollider legsTrigger;  
void Update()
    {
        legsTrigger= GetComponentInChildren<CapsuleCollider>();

        if(legsTrigger.contact...){
          Debug.Log("This is : ");
          Debug.Log(legsTrigger.gameObject.tag);
        }

    }

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您需要为您的孩子添加单一行为。否则检测不到。如果你想从你的父游戏对象中检查它,on this linkrsodre 有一个非常好的解决方案。我从中复制了代码并将 2D 对撞机转换为 3D。

    首先,在父游戏对象和子对象之间创建一个桥接脚本

     public class ColliderBridge : MonoBehaviour
     {
         ColliderListener _listener;
         public void Initialize(ColliderListener l)
         {
             _listener l;
         }
         void OnCollisionEnter(Collision collision)
         {
             _listener.OnCollisionEnter(collision);
         }
         void OnTriggerEnter(Collider other)
         {
             _listener.OnTriggerEnter(other);
         }
     }
    

    然后,将此 ColliderBridge 脚本添加到所有子对象,然后像这样从父对象监听碰撞事件(将 ColliderListener 脚本添加到父游戏对象)。

    public class ColliderListener : MonoBehaviour
     {
         void Awake()
         {
             // Check if Colider is in another GameObject
             Collider collider = GetComponentInChildren<Collider>();
             if (collider.gameObject != gameObject)
             {
                 ColliderBridge cb = collider.gameObject.AddComponent<ColliderBridge>();
                 cb.Initialize(this);
             }
         }
         public void OnCollisionEnter(Collision collision)
         {
             // Do your stuff here
         }
         public void OnTriggerEnter(Collider other)
         {
             // Do your stuff here
         }
     }
    

    【讨论】:

    • 我编辑了答案。现在它适用于所有 3D 对撞机,而不仅仅是 CapsuleCollider。如果您希望它仅适用于胶囊对撞机,只需替换“Collider collider = GetComponentInChildren();”行用“CapsuleCollider collider = GetComponentInChildren();”
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多