Jump to content
Unity Insider Forum

Text an Position von Gameobject


Recommended Posts

Hey Leute,

 

ich arbeite noch nicht so lange mit dem neuen GUI-System, habe aber meiner Meinung nach mittlerweile schon recht viel gelernt :D dennoch bin ich gerade am Verzweifeln.

 

Und zwar habe ich ein Canvas für meine GUI (Screen Space - Overlay).

Was passieren soll: Wenn ich auf ein Gameobject klicke, soll an dieser Stelle ein Text entstehen.

 

Was ich bisher gemacht habe, war zu versuchen ein Text-Prefab zu erstellen und das dann per folgenden Code zu erzeugen:

 

GameObject textpoint = (GameObject)Instantiate(prefPointText, Camera.main.WorldToScreenPoint(position), Quaternion.identity);
textpoint.transform.SetParent(canPointText.transform);
textpoint.GetComponent<Text>().text = "+" + amount;

 

Grundlegend funktioniert der Code, der Text wird erstellt, laut hierarchy. Allerdings wird er nicht angezeigt.

 

Das Problem ist, dass die Anchors nicht an der richtigen Stelle sind und die Größe, also diese blauen Punkte an den Ecken (mir ist gerade der Name entfallen, srry) ist sehr klein.

Die Position ist perfekt durch den Code. Ich müsste also jetzt nurnoch die Größe und Anchors anpassen.

 

http://www.directupl...5fsamib_jpg.htm (So sieht es aus)

 

Kann mir jemand helfen? Oder eine simple Lösung für die Funktion geben?

 

Prinzipiell soll passieren, dass bei einem Klick auf bestimmte Gameobjects, das Gameobject verschwindet (Bis hier funktioniert es Problemlos) und an der Position ein Text, der als Prefab gespeichert ist entstehen.

 

 

Gruß

Shaitan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin grad am Handy, daher nur sehr grob: Camera hat eine Methode WorldToScreenPosition (oder so ähnlich) - und die liefert dir die korrekte Position für den Text im Screen-Koordinaten. Alternativ kannst du mit einem World Space Canvas arbeiten (da müsste dein Ansatz prinzipiell funktionieren, ggf. indem du den Canvas relativ klein machst und den Canvas auf das GO positionierst, statt dem Text).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin grad am Handy, daher nur sehr grob: Camera hat eine Methode WorldToScreenPosition (oder so ähnlich) - und die liefert dir die korrekte Position für den Text im Screen-Koordinaten. Alternativ kannst du mit einem World Space Canvas arbeiten (da müsste dein Ansatz prinzipiell funktionieren, ggf. indem du den Canvas relativ klein machst und den Canvas auf das GO positionierst, statt dem Text).

 

Danke für die schnelle Antwort. Welchem Wert muss ich das Ergebnis denn zurückgeben?

textpoint.position funktioniert schonmal nicht :(

 

Gruß

Shaitan

 

Edit: Bin jetzt schon ein Schritt weiter gekommen. Was nur jetzt komisch ist, dass meine Width und Height einen negativen Wert hat und dadurch nicht angezeigt wird.

 

GameObject textpoint = (GameObject)Instantiate(prefPointText, Camera.main.WorldToScreenPoint(position), Quaternion.identity);
textpoint.transform.SetParent(canPointText.transform);
Vector3 screenpos = Camera.main.WorldToScreenPoint(position);
textpoint.GetComponent<Text>().rectTransform.anchorMin = new Vector2(0, 0);
textpoint.GetComponent<Text>().rectTransform.anchorMax = new Vector2(0, 0);
textpoint.GetComponent<Text>().rectTransform.position = screenpos;

 

Auch mit folgender Anweisung kann ich es nicht ins positive ändern:

 

textpoint.GetComponent<Text>().rectTransform.sizeDelta.Set(-textpoint.GetComponent<Text>().rectTransform.sizeDelta.x, -textpoint.GetComponent<Text>().rectTransform.sizeDelta.y);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gab dazu auch schonmal einen Thread, der wahrscheinlich nur bedingt hilfreich ist:

 

Text auf GameoObject via C#

 

... und mindestens einem, in dem die Lösung drinnen stehen sollte:

 

Screen Space - Camera Canvas einem GameObject folgen lassen

 

An der Größe des RectTransform würde ich nichts ändern ... da würde ich eher einen ContentSizeFitter dranhängen, damit sich das selbst an den Text anpasst. Je nachdem, was du genau brauchst, sollte der Pivot Punkt dann wahrscheinlich in der Mitte liegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gab dazu auch schonmal einen Thread, der wahrscheinlich nur bedingt hilfreich ist:

 

Text auf GameoObject via C#

 

... und mindestens einem, in dem die Lösung drinnen stehen sollte:

 

Screen Space - Camera Canvas einem GameObject folgen lassen

 

An der Größe des RectTransform würde ich nichts ändern ... da würde ich eher einen ContentSizeFitter dranhängen, damit sich das selbst an den Text anpasst. Je nachdem, was du genau brauchst, sollte der Pivot Punkt dann wahrscheinlich in der Mitte liegen.

 

Den ersten Thread hatte ich auch gefunden, nur wie du schon sagst mäßig hilfreich. Der zweite sieht schon vielversprechender aus. Vielen Dank dafür. Ich versuche es weitestgehends ohne zweiten Canvas hinzubekommen. Zum einen, weil ich denke, dass das möglich sein muss und ich das lernen will und zum anderen habe ich es schonmal mit einem zweiten Canvas (mit Render Mode World Space) probiert, nur wurde mir darin der Text nicht angezeigt, warum auch immer.

 

Meine Frage wäre jetzt aber immernoch: Wo muss ich denn nun den Vector zuweisen? RectTransform.position war für mich bisher das logischste, ist das richtig?

 

Ich finde die Dokumentation von Unity da nicht wirklich aussagekräftig genug :(

 

Gruß

Shaitan

 

 

Edit: Hat sich erledigt, ich habe es nun herausgefunden.

 

Für alle, die wissen wollen wie es geht:

 

Bei mir hatte über Code in meinem vorherigen Code die Witdh und Heigth je einen negativen Wert. Wenn ich diesen im Inspector positiv gemacht habe, war die Position perfekt und der Text sichtbar.

 

Hier nun der Code womit das alles jetzt passt:

 

//Erzeugt Objekt
GameObject textpoint = (GameObject)Instantiate(prefPointText, Camera.main.WorldToScreenPoint(position), Quaternion.identity);

//Setzt Canvas, Panel, oder sonstiges in einem Canvas als Parent
textpoint.transform.SetParent(canPointText.transform);

//Zugriff aus Text
textpoint.GetComponent<Text>().text = "+" + amount;

//Negative Width und Heigth positiv machen
textpoint.GetComponent<Text>().rectTransform.sizeDelta = new Vector2(-textpoint.GetComponent<Text>().rectTransform.rect.width, -textpoint.GetComponent<Text>().rectTransform.rect.height);

 

Ich hoffe die Kommentare sind hilfreich. Natürlich kann es sein, dass es dafür eine einfachere Lösung gibt. Aber so funktioniert es auf jedenfall erstmal. Auch wenn sich die Bildschirmgröße ändert :D

 

@Jashan: Danke dennoch für Deine Hilfe.

 

Gruß Shaitan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...