簡體   English   中英

使用多個對撞機找到與GameObject發生碰撞的兩個對撞機

[英]Find both colliders involved in a collision on GameObject with Multiple colliders

總結一下:我想從OnTriggerEnter2D事件中找到碰撞中涉及的兩個對撞機。 我怎樣才能做到這一點?

我有兩個游戲對象。 兩者都有對撞機和觸發器。

在對象A上,它被觸發器包圍。 在對象B上,觸發器僅圍繞特定部分。

當對象A的觸發器碰到對象B的任何對撞機(是否觸發)時:我希望對象B失去健康。 反之亦然。

但是,當對象A的觸發器觸摸對象B的碰撞器(不是觸發器)時,兩個對象都會失去健康狀態。

我在控制台中得到這個

Object A hit Object B
Object B hit Object A

我得出的結論是,對象A的觸發器正在對象B上調用Ontrigger2d事件。

我認為處理此問題的最佳方法是找到“發現”碰撞的對撞機,並據此:忽略碰撞。

我如何找到哪個觸發器“發現”了碰撞?

[也張貼在Unity論壇上]

編輯:代碼

private void OnTriggerEnter2D(Collider2D collision)
{
    Consumeable con = collision.GetComponentInParent<Consumable>();

    if (con != null && con.gameObject != gameObject)
    {
        Debug.Log(gameObject.name + " hit " + con.gameObject.name);

        con.Damage(1);
    }
}

綜上所述,我想找到參與碰撞的兩個對撞機

當腳本從MonoBehaviour繼承時,聲明了一個gameObject變量。 此變量引用此腳本附加到的GameObject。 您可以從一個帶有該gameObject變量的gameObject獲取一個,而從OnTriggerEnter函數中的Collider2D參數中獲取OnTriggerEnter

void OnTriggerEnter2D(Collider2D collision)
{
    GameObject obj1 = this.gameObject;
    GameObject obj2 = collision.gameObject;

    Debug.Log("Triggered Obj1: :" + obj1.name);
    Debug.Log("Triggered obj2: :" + obj2.name);
}

編輯

這些物品對我毫無用處。 我需要對撞機。 不,我不能使用“ getcomponent”,因為它們有多個對撞機,而在碰撞中我只需要一個

碰撞器應該成為GameObject的子對象,並且腳本必須附加到每個子碰撞器上,然后此答案中的內容才起作用。


如果出於某種原因,您必須在不使該GameObject成為碰撞子的情況下執行此操作,則可以使用布爾變量僅一次檢測碰撞。

這是帖子答案的修改。

具有一個名為theOtherCollider的本地Collider2D變量,用於存儲在調用OnTriggerEnter2D時首先報告的碰撞數據,然后具有另一個名為detectedBefore boolean變量,以確定之前是否已調用過OnTriggerEnter2D

調用OnTriggerEnter2D ,檢查該boolean變量的本地/此版本是否為false 如果不true則這是第一次OnTriggerEnter2D 使用GetComponent拿到其他腳本則SET boolean 其他腳本變量true 同時,還使用OnTriggerEnter2D函數中的Collider2D值在另一個腳本上初始化theOtherCollider變量。

現在,如果調用了OnTriggerEnter2D並且該boolean變量的本地/此版本為true ,請將其設置為false以進行重置,然后從OnTriggerEnter2D函數中獲取theOtherCollider變量和Collider2D變量。

這可能會造成混淆,但是通過查看代碼,它更容易理解。

注意:

YOURSCRIPTOnTriggerEnter2D函數內置在腳本中的名稱,該腳本附加到碰撞體上。 您必須將其更改為該腳本的名稱。

public bool detectedBefore = false;
public Collider2D theOtherCollider;

void OnTriggerEnter2D(Collider2D collision)
{
    //Get both colliders then exit if we have already ran this code below
    if (detectedBefore)
    {
        //Reset
        detectedBefore = false;

        //Get both Colliders once below
        Collider2D col1 = theOtherCollider;
        Collider2D col2 = collision;

        Debug.Log("Triggered Obj1: " + col1.name);
        Debug.Log("Triggered obj2: " + col2.name);

        return; //EXIT the function
    }

    //Set the other detectedBefore variable to true then set get the first Collider
    YOURSCRIPT myScript = collision.gameObject.GetComponent<YOURSCRIPT>();
    if (myScript)
    {
        myScript.detectedBefore = true;
        myScript.theOtherCollider = collision;
    }

}

實現這一目標的一種方法是創建一個子游戲對象來處理其中一個對撞機。

因此,例如,您有一個具有非觸發對撞機的父對象,以及一個具有觸發對撞機的孩子。

這樣,它很容易找出碰撞中的對撞機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM