Unbedingt lesen!: GUI positionieren, oder programmieren? Natürlich positionieren!
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 .
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
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 .
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