Jump to content
Unity Insider Forum

MaZy's Blog

  • Einträge
    14
  • Kommentare
    32
  • Aufrufe
    46.300

Unbedingt lesen!: GUI positionieren, oder programmieren? Natürlich positionieren!


MaZy

1.511 Aufrufe

Hallo,

ihr kennt das bestimmt. Man hatte eine Vorstellung wohin dieser Button hin soll. Dann programmieren wir es und setzen die Werte ein. Doch dann passt es nicht. Oder man will es doch etwas verschieben. Jedoch kann es auf dauer nervig sein. Was tun wir da? Natürlich! Wir setzen alle Variablen Public damit wir nicht immer die Datei verändern brauchen.

Doch, was, wenn da eine bessere Methode gibt? Wo man überhaupt keine Zahlen eintragen muss? Genau! Du hast es erfasst. Wir nehmen einfach ein GameObject :D.

GameObjects liefern einige Informationen um so etwas zu realisieren. Wir können sie verschieben, skalieren und rotieren. Doch lass mal erst überlegen wie wir vor gehen wollen.
Bestimmt habt ihr schon mal gewollt, dass die Position des Mauses in Weltkoordination angegeben wird. Und das tut man in dem man mit Hilfe von Kamera sie berechnen lässt. Das können wir auch für die GUIs verwenden. Jedoch andersherum. Wir nehmen die Weltkoordinaten um dann daraus Screenkoordinaten zu machen. So da ich euch dies angedeutet habe nun ein bissel Code.

[CODE]
public class IngameElements : MonoBehaviour {
public Transform restartButton;
private Rect restartButtonRect;

void Start() {
if(restartButton != null) {
// Die Screenkoordinaten herauskriegen
Vector3 restartButtonWorld = Camera.main.WorldToScreenPoint (new Vector3(restartButton.position.x,
-restartButton.position.y,
restartButton.position.z));

// Die Screenkoordinaten verwenden um neuen Rect zu erstellen. Wir benutzen den localscale als breite und länge.
restartButtonRect = new Rect (restartButtonWorld.x,
restartButtonWorld.y,
restartButton.localScale.x,
restartButton.localScale.y);
}
}

// Nun "malen" wir es in OnGUI
void OnGUI () {
if (GUI.Button (restartButtonRect, "Restart Game")) {
RestartGame();
}
}
}
[/CODE]

Jetzt müsst ihr nur noch ein Gameobjects erstellen und zuweisen. Fertig.
Am Besten macht ihr es präziser.
--InGameMenu
---Panel(Bsp: Obenrechts)
----RestartButton
----SoundToggleButton

Damit könnt ihr die Gruppen besser an- und ausschalten oder verschieben usw. :)

Jetzt kann man dies noch mit einer Funktion erweitern, so dass er nicht immer alles schreiben musst. Oder am besten nen Library, aber ich belasse simpel bei dem selben Beispiel:
[CODE]
public class IngameElements : MonoBehaviour {
public Transform restartButton;
public Transform exitGameButton;

void OnGUI () {
if (DrawButton("Restart Game", restartButton) {
RestartGame();
}

if (DrawButton("Exit Game", exitGameButton) {
ExitGame();
}
}

bool DrawButton(string name, Transform t) {
return GUI.Button(transfomElementToScreen(t), name);
}

Rect transformElementToScreen(Transform t) {
Vector3 world = Camera.main.WorldToScreenPoint (new Vector3(t.position.x, -t.position.y, t.position.z));
return new Rect (restartButtonWorld.x, restartButtonWorld.y, restartButton.localScale.x, restartButton.localScale.y);
}
}
[/CODE]

Probiert es aus und liiiiiiiiiiiiiiiiken :)

6 Kommentare


Recommended Comments

Gefällt mir sehr gut die Idee. Ich hab nur ein Problem damit, welches ich auch mit NGUI gehabt habe und wegen welchem ich auch zu normalen GUI(Layout) zurück bin: Ich will dass meine Buttons auf jeder Auflösung gleich aussehen.
Link zu diesem Kommentar
Da habe ich selber das Problem. Dummerweise habe ich nicht so viele Handys oder Tablets um das auszuprobieren. Wenn man googlet findet man dafür einige Informationen aber kann es leider nicht testen.
Bei NGUI sollte eigentlich die Button je nach Auflösung gleichgroß sein.
Link zu diesem Kommentar
Naja, zum testen kannst du auch einfach die Auflösung beim Start deines Spieles im Launcher von Unity auf Desktop Platformen festlegen. Oder du änderst sie direkt im Game-View des Unity Editors. Dort kannst du neben dem normallen "Fullscreen"-View auch eigene Verhältnisse (4:3, etc.) oder aber auch feste Pixelmaße eingeben.
Link zu diesem Kommentar
Ja stimmt schon. Bis jetzt habe ich es so gemacht, aber auf dem Handy ist es natürlich besser. Man kann es besser nachvollziehen :). Im Endeffekt aber sieht alles (im Spiel) von Verhältnissen her immer anders aus :/
Link zu diesem Kommentar
Klar sind die Buttons bei NGUI immer gleich groß. Nur mit den Verhältnissen kommt NGUI gar nicht klar, da ist schnell mal was abgeschnitten. Und auf Auflösungen sollte man auch bei Standalone achten. 1980x1080 und 1366x768 sind schon ein Unterschied.
Ich berechne meine Buttons momentan immer als ein Prozentsatz der Höhe bzw Breite des Screens. Das funktioniert nur leider nicht mit methoden, wie du sie einsetzt
Link zu diesem Kommentar
Gast
Kommentar schreiben...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...