Jump to content
Unity Insider Forum
Shaitan1805

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

Share this post


Link to post
Share on other sites

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).

Share this post


Link to post
Share on other sites

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);

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Sag mal... soll der Text in der GUI immer über dem GameObject liegen oder willst du eher einen Text in der 3D-Welt an dem Objekt kleben haben?

Share this post


Link to post
Share on other sites

Sag mal... soll der Text in der GUI immer über dem GameObject liegen oder willst du eher einen Text in der 3D-Welt an dem Objekt kleben haben?

 

Es soll in der GUI über einem GameObject liegen, also nicht in der 3D-Welt.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...

×
×
  • Create New...