2012-11-13 9 views
8

Ich versuche, ein zweidimensionales Feld im Editor wie die "Layer Kollision Matrix" wird in der Einheit, um zu zeigen: enter image description hereUnity Editor für benutzerdefinierten Like 'Layer-Kollision Matrix'

Obwohl anstelle von Kontrollkästchen Ich brauche Ints, und ein vollständiges Gitter (nicht die Dreiecksform.) Ich kann nicht herausfinden, wie man das tut, obwohl ... Ich kann einen benutzerdefinierten Editor bekommen, obwohl das Gitter ausfällt. Also, gibt es irgendeine Möglichkeit, den Code des Physik-Manager-Editors zu sehen (die Layer Collision Matrix ist da drin) oder kennt jemand einen guten Weg, dies zu tun?

Hinweis: Bevorzugte Sprache ist C#, obwohl alle tun können.

Danke.

Antwort

6

Der Code in dem, was Sie suchen, ist ziemlich komplex, also werde ich auf dich verlassen, um zu wissen, worüber ich hier spreche. The Unity docs are your friend.

  1. erstellen GUIArea wo Ihr spezielles Editor-Tool sein. Setzen Sie einen Funktionsaufruf , der dann die anderen Renderfunktionen aufruft. I Verdacht, dass Sie hier eine Kapselung machen wollen. Wenn Sie die GUI in einer anderen Funktion einkapseln, können Sie ihre Funktionalität (innerhalb der Grenzen Ihrer Abstraktion) duplizieren und die Dinge auf dem Bildschirm leichter verschieben.

  2. Design drei Ankerpunkte (Vector2). Sie sollten jeweils die obere linke Koordinate Ihrer Zeilenbeschriftungen, Spaltenbeschriftungen und Datenfelder darstellen. Beachten Sie, dass der Spaltenanker direkt über (der gleiche x-Wert wie) der Zeilenanker sein muss, da rotieren (nächster Schritt) den Anker transformieren wird.

  3. Verwenden Sie GUIUtility.RotateAroundPivot(), um die GUI-Transformation Matrix um 90 ° um den Spaltenankerpunkt zu drehen.

  4. Schreiben Sie eine lange GUI.Label (oder mehrere von ihnen) für Ihre Etiketten. Verankern Sie sie am Säulenanker. Laut dem obigen Bild könnte Ihr Label string etwas wie "Default \ nTransparentFX \ nIgnoreRaycast \ nWater" enthalten, wo das \ n ein Zeilenumbruch erzeugt.

  5. Nochmals drehen, -90 ° zurück zur ursprünglichen Matrix. Alternativ können Sie vor Schritt 3 GUI.matrix kopieren und dann für einen garantierten Matrix-Reset zurück zuweisen. Das Hin- und Herdrehen kann aufgrund von Gleitkomma- und anderen Ungenauigkeiten zu Fehlern führen.

  6. Schreiben Sie die Beschriftungen für die Zeilen. Die gleiche Methode wie zwei Schritte zurück. Anker sie am Anker der Reihe.

  7. Dies ist der schwierigere Teil. Iterieren Sie durch Ihr Datenfeld und erstellen Sie für jedes Element in Ihren Daten eine kleine EditorGUI.IntField() oder StringField() oder sogar ObjectField(). Jedes Element benötigt seinen eigenen Anker, der dann mit dem Datenfeldanker summiert wird. Wenn Ihr Datenfeld ein quadratisches 2D-Array ist, ist das Ableiten der Anker einfach - obwohl Sie auch leere Elemente in Ihrem Array haben (wenn Sie wollen die genaue Funktionalität oben beschrieben).Wenn Sie Speicher sparen möchten, müssen Sie die Element-Indizes in Koordinaten mit einigen kniffligen mathematischen umwandeln. Ich bin mir nicht sicher, ob ich den Kopf meines Kopfs hätte, wie ich es machen würde.

Hoffe, ich vergesse nichts. Die GUI von Unity ist ein b ----. Kommentar und ich werde mein Bestes tun, um Ihnen zu helfen.

+1

Danke, sieht gut aus. Ich wusste nichts über das RotateAroundPivot-Ding (und suchte offensichtlich nicht gründlich genug, um es zu finden.) Der Rest scheint relativ einfach zu sein (obwohl, wie Sie sagten, die GUI manchmal ein wenig nervig sein kann.) Danke! Wenn ich es mache, poste ich meinen Code, obwohl ich keine Zeit habe, also könnte es eine Weile dauern. –

+0

Froh, dass es immer noch relevant ist. Mir ist aufgefallen, dass die Frage zwei Monate alt ist: P – cjcurrie

+1

Ja, zur Zeit habe ich es auf eine weniger benutzerfreundliche Art und Weise gelöst, aber es war in Ordnung, da ich nur es benutzen muss. –