簡體   English   中英

檢查兩個碰撞器是否與Raycast重疊?

[英]Check if two Colliders overlap with Raycast?

通過使用距離很小或沒有距離的光線投射球體來嘗試檢測一個對象是否與另一個對象重疊。 我的相關代碼如下:

//Check at location using Stationary Spherecast, apply damage effect if its a unit
        if (Physics.SphereCast (transform.position, 3, Vector3.up, out hit, 1)) {
            Debug.Log ("In Spherecast");
            if (hit.transform.CompareTag ("Enemy unit") || hit.transform.CompareTag ("Player Unit")) {
                Debug.Log ("In Spherecast's If");
                int Dmg = MM.MoveStat (Ours, SM.selected.GetComponent<EidolonClass> (), hit.transform.gameObject.GetComponent<EidolonClass> ());
                hit.transform.gameObject.GetComponent<EidolonClass> ().TakeDamage (Dmg);
            }
        }

但是,目前,這些Debug.Log語句均未輸出到控制台。 關於球面球或其構造函數,我是否有誤解?

嘗試檢測一個對象是否與另一個對象重疊

使用Physics.OverlapXXX函數之一。 它們很多,但是如果您要使用的是Sphere,則應使用Physics.OverlapSphere

為了性能起見,請使用以NonAlloc結尾的NonAlloc

Physics.OverlapSphereNonAlloc應該可以解決這個問題。 只要檢查它返回的值是否> 0

Collider[] colliders = new Collider[5];

void Update()
{
    if (Physics.OverlapSphereNonAlloc(transform.position, 3, colliders) > 0)
    {
       //Overlaps!
    }
}

注意事項

確保在要檢查的兩個GameObject上都附加了一個Collier,以確保它們彼此重疊。

編輯

如果您還需要訪問Colliders

Collider[] colliders = new Collider[5];

void Update()
{
    int hitCount = Physics.OverlapSphereNonAlloc(transform.position, 3, colliders);

    if (hitCount > 0)
    {
        Debug.Log("Touching!");

        for (int i = 0; i < hitCount; i++)
        {
            Collider C = colliders[i];

            Debug.Log("In Foreach for: " + C.name.ToString());
            if (C.transform.CompareTag("Enemy Unit"))
            {
                Debug.Log(C.name.ToString() + " Is an enemy");

                //...
            }
        }
    }
    else
    {
        Debug.Log("Not Touching!");
    }
}

最終找到了一個可行的解決方案,並從程序員和rutter建議的解決方案中汲取了靈感,並在此站點和Unity Unity官方論壇上四處尋找了可以滿足我需要的解決方案。 這是代碼的完成部分:

 Collider[] collisions = Physics.OverlapSphere(transform.position,.75f); foreach (Collider C in collisions) { Debug.Log("In Foreach for: " + C.name.ToString()); if (C.transform.CompareTag ("Enemy Unit")) { Debug.Log (C.name.ToString () + " Is an enemy"); int Dmg = MM.MoveStat (Ours, SM.selected.GetComponent<EidolonClass> (), C.transform.gameObject.GetComponent<EidolonClass> ()); C.transform.gameObject.GetComponent<EidolonClass> ().TakeDamage (Dmg); } } 

暫無
暫無

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

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