[英]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);
}
}
我已經有一段時間沒有使用 Unity 網格了,但是在將頂點和三角形添加到網格之后,可能會添加 MeshCollider 的 sharedMesh。 也許 MeshCollider 在分配時使用 Mesh 的頂點和三角形,而不是在超時時使用更新的值。
據我所知,為了讓光線投射捕捉到網格對撞機,它需要在檢查器中標記為“凸”。
否則,您可以通過腳本在運行時啟用凸配置,但是檢查器選項總是更好一些,因為您可以查看對撞機是否與您的形狀匹配!
這可能是您的光線投射無法捕捉到它的另一個原因! 您的對撞機需要與您的對象的形狀相匹配! 這解釋了為什么您可以捕捉球體和盒子碰撞器,但不能捕捉網格碰撞器(假設它們一開始就被標記為凸面),因為球體和盒子具有光線投射碰撞和觸發的特定形狀。 當然要確保圖層和標簽也合適!
確保你的對撞機足夠大。 如果從 Gizmo 啟用,您可以檢查它們的外觀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.