2016-06-05 4 views
0

Ich verwende das DontGoThroughThings Skript, um Kollisionen von sich sehr schnell bewegenden Objekten zu beheben. Was ich tun möchte, ist das Entfernen des Treffdreiecks innerhalb einer Kugel, wenn mein sich schnell bewegendes Objekt auftrifft. Es funktioniert für wirklich langsame Objekte, aber wenn ich ein schnelles Objekt abfange, ruft das Objekt den OnCollisionEnter auf, aber ich kann das Dreieck, auf das es trifft, nicht finden und das sich schnell bewegende Objekt klebt auf dem kollidierten Gegenstand. Ich denke, es liegt daran, dass DontGoThroughThings die Objektposition auf das kollidierte Objekt setzt und die Richtung verloren geht, sodass mein Strahl das richtige Dreieck nicht finden kann.DontGoThroughThings und OnCollisionEnter

enter image description here

Hier ist der Code auf meinem Gebiet:

void OnCollisionEnter(Collision collisionInfo) 
{ 
    int[] triangles = mesh.triangles; 

    for (var i = 0; i < collisionInfo.contacts.Length; i++) 
    { 
     RaycastHit hit; 
     colliderRay.Raycast(new Ray(collisionInfo.contacts[i].point, collisionInfo.contacts[i].normal), out hit, 10.0f); 

     if (hit.collider != null && hit.triangleIndex != -1) 
     { 
      triangles = removeTriangle(hit.triangleIndex, triangles); 
     } 
    } 

    mesh.triangles = triangles; 
    meshCollider.sharedMesh = mesh; 
} 

private int[] removeTriangle(int triangle, int[] tris) 
{ 
    for (var i = triangle * 3; i < tris.Length - 3; ++i) 
    { 
     if (tris[i] == -1) break; 
     tris[i] = tris[i + 3]; 
    } 
    return tris; 
} 

Antwort

0

ich das Problem gefunden zu haben. Ich musste den Punkt ein paar Einheiten zurück bewegen und dann den Raycast werfen. So würde es aussehen:

colliderRay.Raycast(new Ray(collisionInfo.contacts[i].point - (collisionInfo.contacts[i].normal.normalized), collisionInfo.contacts[i].normal), out hit, 10.0f);