Jump to content
Unity Insider Forum

Text über Objekte


Willy_Wonder

Recommended Posts

Hallo, freunde der sonne! ich bin ein noob, was scripting angeht...muss aber für ein projekt ein problem lösen.

es geht um folgendes: ich habe eine szene mit mehreren Objekten. Meine Kamera wird mit hilfe von einem First Person Controller bewegt. Objekte muss ich anwählen können und wenn man die Maustaste drückt (OnMouseDown) soll ein Text ÜBER (oder auch in der nähe) der Objekte erscheinen. soweit so gut. Ich habe es nun geschafft, einen Script zu schreiben, bei dem per Mausklick ein Text erscheint, ABER der bleibt immer in der gleichen Ecke hängen.

Ist mein Problem nachvollziebar? und könnte mir eventuell bitte bitte jemand helfen? :3

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst das Textobjekt in einen Canvas erzeugen das als child dem Objekt über dem der Text erscheinen soll hängt. Das Canvas musst du dann noch von Screen Overlay auf World Space stellen. Damit bewegt sich nun schonmal dein Text mit dem Objekt nun musst du noch den Text so positionieren das er Über dem Objekt ist. In deinen Script kannst du nun das Textobjekt für das jeweilige Objekt an und aus schalten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Im Moment sieht mein Script so aus:

 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class ClickOnObject : MonoBehaviour
{

        private bool showText = false;





        void OnMouseDown()
        {
            if(!showText)
                showText = true;
            
    }

        void OnGUI()
        {
        
            if(showText)
            {
                
            if(GUI.Button(new Rect(600,600,200,40), "Anlage in Ordnung")) //600,600,200,40 Position und Größe des Buttons
                    
                    showText = false;
            }
        }
    }

 

 

an sich alles super, funktioniert einwandfrei, WENN dieser Button nicht immer am gleichen fleck hängen würde. Die Position des Buttons muss von der Postion des Objektes abhängen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das nimmt man nur noch fürs Debuggen... aber der Code wäre wie folgt:
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class ClickOnObject : MonoBehaviour
{
    private bool showText = false;

    void OnMouseDown()
    {
        if (!showText)
            showText = true;

    }

    void OnGUI()
    {

        if (showText)
        {
            var x = Event.current.mousePosition.x;
            var y = Event.current.mousePosition.y;
            if (GUI.Button(new Rect(x - 149, y + 40, 300, 60), "Anlage in Ordnung")) //600,600,200,40 Position und Größe des Buttons

                showText = false;
        }
    }
}

Wenn der Text weiter oben erscheinen soll, dann entsprechend von Y mehr abziehen, z.B.:
x - 149, y - 60, 300, 60

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde so vorgehen:

Unter GameObject -> 3D Object -> 3D Text ein Text erstellen und als Prefab abspeichern.

using UnityEngine;

public class ClickOnObject : MonoBehaviour
{
    public GameObject prefab;
    private GameObject _text;

    void OnMouseDown()
    {
        if (!_text) //überprüfen ob noch kein Text erstellt urde
        {
            _text = Instantiate(prefab); // Text erstellen
            _text.transform.SetParent(transform); //Den Text als Child des Objektes einstellen
            _text.GetComponent<TextMesh>().text = "Dein Text"; //Dem 3D Text den gewünsten inhalt geben
            _text.transform.localPosition = new Vector3(0, 0, 0); // hier kannst du das gewünste offset einstellen
            _text.transform.rotation = Quaternion.Euler(90, 0, 0); //hier die Rotation (So wie es eingestellt ist ist es parallel zum Boden)
        }
    }

    private void OnMouseExit()
    {
        if (_text) //überprüfen, ob ein Text vorhanden ist
        {
            Destroy(_text); //zerstöre den Text
        }
    }
}

Nur noch dem Skript das Prefab zuweisen und es sollte klappen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Stunden schrieb Zer0Cool:

Ja, das nimmt man nur noch fürs Debuggen... aber der Code wäre wie folgt:
 


using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class ClickOnObject : MonoBehaviour
{
    private bool showText = false;

    void OnMouseDown()
    {
        if (!showText)
            showText = true;

    }

    void OnGUI()
    {

        if (showText)
        {
            var x = Event.current.mousePosition.x;
            var y = Event.current.mousePosition.y;
            if (GUI.Button(new Rect(x - 149, y + 40, 300, 60), "Anlage in Ordnung")) //600,600,200,40 Position und Größe des Buttons

                showText = false;
        }
    }
}

Wenn der Text weiter oben erscheinen soll, dann entsprechend von Y mehr abziehen, z.B.:
x - 149, y - 60, 300, 60

vielen Dank, da komme ich meinem Ziel schon wesentlich näher! Richtig stark wäre es allerdings, wenn der Button der Maus nicht mehr folgen würde, nachdem ich die anlage angeklickt habe... ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb FileStriker:

Ich würde so vorgehen:

Unter GameObject -> 3D Object -> 3D Text ein Text erstellen und als Prefab abspeichern.


using UnityEngine;

public class ClickOnObject : MonoBehaviour
{
    public GameObject prefab;
    private GameObject _text;

    void OnMouseDown()
    {
        if (!_text) //überprüfen ob noch kein Text erstellt urde
        {
            _text = Instantiate(prefab); // Text erstellen
            _text.transform.SetParent(transform); //Den Text als Child des Objektes einstellen
            _text.GetComponent<TextMesh>().text = "Dein Text"; //Dem 3D Text den gewünsten inhalt geben
            _text.transform.localPosition = new Vector3(0, 0, 0); // hier kannst du das gewünste offset einstellen
            _text.transform.rotation = Quaternion.Euler(90, 0, 0); //hier die Rotation (So wie es eingestellt ist ist es parallel zum Boden)
        }
    }

    private void OnMouseExit()
    {
        if (_text) //überprüfen, ob ein Text vorhanden ist
        {
            Destroy(_text); //zerstöre den Text
        }
    }
}

Nur noch dem Skript das Prefab zuweisen und es sollte klappen.

das sieht auch nicht schelcht aus, wenn der text allerdings als Button (bestenfalls als GUI button) erscheinen würde, wäre es perfekt! :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

An Stelle eines 3D Text könntest du ja auch ein UI Butten erstellen und diesen als Prefab speichern. Dann würde ich aber Nicht mehr das Objekt welches du anklickst als Parent nutzen sondern eine art Container im Canvas. Wenn du das so machst solltest du aber die OnMouseExit Funktion weg lassen, denn sonst kannst du den Button nicht anklicken.

Link zu diesem Kommentar
Auf anderen Seiten teilen

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class ClickOnObject : MonoBehaviour
{
    private bool showText = false;
    private bool readMouseCoords = false;
    float x;
    float y;

    void OnMouseDown()
    {
        if (!showText)
        {
            showText = true;
            readMouseCoords = true;
        }
    }

    void OnGUI()
    {
        if (showText)
        {
            if (readMouseCoords)
            {
                x = Event.current.mousePosition.x;
                y = Event.current.mousePosition.y;
                readMouseCoords = false;
            }

            if (GUI.Button(new Rect(x - 149, y - 60, 300, 60), "Anlage in Ordnung")) //600,600,200,40 Position und Größe des Buttons
                showText = false;
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Willy_Wonder Naja mit dem Canvas mein ich Das Object, welches automatisch erzeugt wir, wenn man ein UI Element ertsellt z.B. ein Text (GameObject -> UI -> Text). Dieser Text kann auch nur angezeigt werden wenn er ein Child Object eines Canvas ist (wie vielten grades ist egal). Mit Container meine ich ein weiters Gameobject im Canvas, welches für das Layout und Ordnung in der Hirachie sorgen soll, kannst es aber auch einfach nur dem Canvas unterordnen.

Auf @Zer0Cool Code wollte ich eigentlich auch noch eingehen aber dann kam schon die Antwort also muss ich das ja nicht mehr :P 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was mich nur wunderte war, daß "Input.mousePosition" andere Mousekoordinaten ausgibt wie "Event.current.mousePosition". Ich vermute mal beide haben einen anderen Koordinatenursprung? Vermutlich "Input.mousePosition" unten links und "Event.current.mousePosition" oben links...^_^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...