簡體   English   中英

為什么我的光線投射在 Unity 中沒有檢測到任何網格對撞機?

[英]Why is my raycast not detecting any mesh colliders in Unity?

我有一個代碼,我在其中創建一個凸包,但為我的凸包中的每個不同的面/三角形實例化一個游戲對象(具有網格渲染器、網格過濾器和網格碰撞組件),因為我需要每個都是不同的顏色,然后我想根據鍵盤點擊移動光線投射(光線投射經過我想要擊中的點列表,光線投射的中心是我的凸包的質心,方向基於我 go 在該列表中的每個點)。

我的光線投射從不檢測網格碰撞器,它檢測到球體但從不網格,嘗試了許多解決方案,例如在 FixedUpdate 上而不是在 Update 上繪制光線投射。 還嘗試將兩個代碼放在同一個腳本中,並將所有三角形放在同一個 object 中(認為檢測非凸可能是個問題),但沒有任何效果。 我什至嘗試制作一個不會被光線投射忽略的新圖層,但仍然沒有。

我的凸創建代碼:

void CreateMyMesh()
    {
        for (int i = 0; i < faces.Count; i++)
        {
            if (faces[i].points.Count == 3)
            {
                Vector3 DirectionnnOFTRI = Vector3.Cross(faces[i].points[1] - faces[i].points[0], faces[i].points[2] - faces[i].points[0]).normalized;

                Vector3 CentroidTRI = new Vector3((faces[i].points[0].x + faces[i].points[1].x + faces[i].points[2].x) / 3
                , (faces[i].points[0].y + faces[i].points[1].y + faces[i].points[2].y) / 3
                , (faces[i].points[0].z + faces[i].points[1].z + faces[i].points[2].z) / 3);
                float Sign = Vector3.Dot(DirectionnnOFTRI, centroid - CentroidTRI);
                if (Sign > 0)
                {
                    for (int j = 2; j >= 0; j--)
                    {
                        Vector3 v = new Vector3(faces[i].points[j].x, faces[i].points[j].y, faces[i].points[j].z);
                        int iWhich = isExist(v, tmpVec);
                        if (iWhich == -1)
                        {
                            tmpVec.Add(v);
                            tmpTriangles.Add(tmpVec.Count - 1);
                        }
                        else
                        {
                            tmpTriangles.Add(iWhich);
                        }
                    }
                }
                else
                {
                    for (int j = 0; j < 3; j++)
                    {
                        Vector3 v = new Vector3(faces[i].points[j].x, faces[i].points[j].y, faces[i].points[j].z);
                        int iWhich = isExist(v, tmpVec);
                        if (iWhich == -1)
                        {
                            tmpVec.Add(v);
                            tmpTriangles.Add(tmpVec.Count - 1);
                        }
                        else
                        {
                            tmpTriangles.Add(iWhich);
                        }
                    }
                }
            }
            else
            {
                print("Error : #of points in Face != 3");
            }
            GameObject newMeshObject = Instantiate(MeshObject, MeshObject.transform.position, Quaternion.identity);
            newMeshObject.name = "triangle number " + i;
            
            Mesh mesh = new Mesh();
            newMeshObject.GetComponent<MeshRenderer>().material.color = new Color(tmpVec[0].x, tmpVec[0].y, tmpVec[0].z, 1f);
            newMeshObject.GetComponent<MeshFilter>().mesh = mesh;
            newMeshObject.GetComponent<MeshCollider>().sharedMesh = mesh;
            mesh.Clear();
            mesh.vertices = tmpVec.ToArray();
            mesh.triangles = tmpTriangles.ToArray();
            mesh.RecalculateNormals();
            mesh.name = "triangle mesh number " + i;

            tmpVec.Clear();
            tmpTriangles.Clear();
        }

我的光線投射代碼:

int ct = 0;
    public void Raycasttt()
    {
        if(Input.GetKeyDown(KeyCode.UpArrow))
        {
            if(ct<rayyy.Count-1)
            {
                ct++;   
            }
            else
            {
                ct=0;
            }
        }
        
        Debug.DrawRay(transform.position, (rayyy[ct]) * 10, Color.yellow);

        RaycastHit hit;
        Vector3 Direc = ((rayyy[ct] * 10) - transform.position ).normalized;
        
        if(Physics.Raycast(transform.position, Direc, out hit, Mathf.Infinity, 6))
        {
            Debug.Log("in raycast");
            if (hit.collider != null)
                {
                    Debug.DrawRay(transform.position, (rayyy[ct]) * 10 * hit.distance, Color.yellow);
                    Debug.Log("Did Hit");
                    Debug.Log("HitPosition = " + hit.collider.gameObject.transform.position);
                }
                Debug.Log(hit.collider.gameObject.name);
        }
    }

我實例化的網格 object: 網格對象

我已經有一段時間沒有使用 Unity 網格了,但是在將頂點和三角形添加到網格之后,可能會添加 MeshCollider 的 sharedMesh。 也許 MeshCollider 在分配時使用 Mesh 的頂點和三角形,而不是在超時時使用更新的值。

據我所知,為了讓光線投射捕捉到網格對撞機,它需要在檢查器中標記為“凸”。

否則,您可以通過腳本在運行時啟用凸配置,但是檢查器選項總是更好一些,因為您可以查看對撞機是否與您的形狀匹配!

這可能是您的光線投射無法捕捉到它的另一個原因! 您的對撞機需要與您的對象的形狀相匹配! 這解釋了為什么您可以捕捉球體和盒子碰撞器,但不能捕捉網格碰撞器(假設它們一開始就被標記為凸面),因為球體和盒子具有光線投射碰撞和觸發的特定形狀。 當然要確保圖層和標簽也合適!

確保你的對撞機足夠大。 如果從 Gizmo 啟用,您可以檢查它們的外觀。

暫無
暫無

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

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