Einheitlicher benutzerdefinierter Editor wie 'Layer Collision Matrix'

8

Ich versuche ein zweidimensionales Array im Editor zu zeigen, wie die "Layer Collision Matrix" in Unity gezeigt wird:

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

Hinweis: Die bevorzugte Sprache ist c #, auch wenn dies möglich ist.

Danke.

    
The Oddler 13.11.2012, 15:00
quelle

1 Antwort

6

Der Code für das, wonach Sie suchen, ist ziemlich komplex, deshalb werde ich mich darauf verlassen, dass Sie wissen, wovon ich hier rede. Die Unity-Dokumente sind Ihr Freund.

  1. Erstelle ein GUIArea , wo dein spezielles Editor-Tool sein wird. Drinnen legen Sie a Funktionsaufruf, der dann die anderen Renderfunktionen aufruft. ich Ich vermute, du wirst hier eine Kapselung machen wollen. Durch das Einkapseln der GUI in eine andere Funktion können Sie ihre Funktionalität (innerhalb der Grenzen Ihrer Abstraktion) duplizieren und die Dinge auf dem Bildschirm leichter verschieben.

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

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

  4. Schreibe eine lange GUI.Label (oder mehrere davon) für deine Labels. Verankere sie am Säulenanker. Für das Bild oben, Ihr Etikett String könnte etwas wie lesen "Default \ nTransparentFX \ nIgnoreRaycast \ nWater", wo \ n erstellt wird eine neue Zeile.

  5. Drehen Sie erneut um -90 ° zurück zur ursprünglichen Matrix. Alternativ, du kann GUI.matrix vor Schritt 3 kopieren und dann für a zurückgeben garantierter Matrix-Reset. Das Hin- und Herdrehen kann aufgrund von Gleitkomma- und anderen Ungenauigkeiten zu Fehlern führen.

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

  7. Das ist der schwierigere Teil. Iterieren Sie durch Ihr Datenfeld und erstellen Sie ein klein EditorGUI.IntField() oder StringField() oder gerade ObjectField() für jedes Element in Ihren Daten. Jedes Element wird brauche einen eigenen Anker, der dann mit dem Datenfeldanker summiert wird. Wenn Ihr Datenfeld ein quadratisches 2D-Array ist, werden die Anker abgeleitet sei einfach - obwohl du auch leere Elemente in deinem Array hast (wenn Sie möchten die oben beschriebene genaue Funktionalität). Wenn du möchtest Speicher sparen, müssen Sie die Element-Indizes in konvertieren Koordinaten mit einigen kniffligen Mathe. Ich bin mir nicht ganz sicher Kopf, wie ich es machen würde.

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

    
cjcurrie 08.01.2013, 22:44
quelle

Tags und Links