Jump to content
Unity Insider Forum

Button/Text zu UITextButton


MaZy

Recommended Posts

Hallo

mich nervt es schon länger, dass Button- und Textcomponenten getrennt sind. Wenn man InputField anschaut, da haben die in eins gepackt und bei Button nicht. Aber das ist auch verständlich. Warum? Buttons funktionieren auch ohne irgendwelche Texte. Man kann ja auch Bilder nehmen oder ganz alles weglassen. Beispiel bei Farbauswahl, braucht mal sowohl keine Bilder, aber auch keine Texte. Aber warum dann Button und Text nicht in einem GameObject. Irgendwie mögen Image component und Text component sich nicht. Beides zusammen dürfen nicht in einem GameObject existieren (Warum auch immer). Darum ist der Text component im Child GameObject.

Doch mich nervt es meistens da rum zu klicken..

Daher hab ich kleinen Script geschrieben, der mir Hilft alles in eins zu Packen.
UITextButton

UITextButton hat folgende Member

  1. button
  2. text

Wie man hier erkennt kann man also per Instance auf die Componenten zugreifen. Beispiel

void Start() {
	uiTextButtonInstance.OnClick.AddListener(OnCloseButtonClicked);
	uiTextButtonInstance.text.text = "Close Menu";
}

Der Vorteil hier ist ich brauche nicht zwei Variablen erstellen, wegen einmal Button und einmal Text, sondern habe gleich ein Instanz wo beides existieren.

Ebenfalls wurde der Script so aufgebaut, dass automatisch die Componenten erkennt. Das heißt man muss selber da nichts machen. Auch einen Textfield hab ich hinzugefügt, so dass man per Inspector den Text da eintragen kann. Somit muss man nicht da sich durch navigieren (was ich öfters genervt hat). Das alles kann man nochmal besser anpassen und vielleicht mehr eintragen wie z.B. Textgröße,  jedoch das hab ich weggelassen.

Code

using UnityEngine;
using UnityEngine.UI;

public class UITextButton : MonoBehaviour {

    public Button buttonComponent;
    public Text textComponent;

    [SerializeField]
    string input = "";

    void Start()
    {
        if (buttonComponent == null)
            buttonComponent = GetComponent<Button>();

        if (buttonComponent == null)
            Debug.LogError("Button component not found");

        if (textComponent == null)
            textComponent = GetComponentInChildren<Text>();

        if (textComponent == null)
            Debug.LogError("Text child component not found");
    }

    void Update()
    {
        if (textComponent != null)
            input = textComponent.text;
    }

    void OnValidate()
    {
        if (Application.isPlaying)
            return;

        Start();

        if (textComponent != null)
            textComponent.text = input;
    }
} 

So, der Script ist so aufgebaut, dass es bei jede Veränderung OnValidate() getriggert wird. Das funktioniert auch in PlayMode. Daher lasse ich die Funktion returnen, also "abbrechen", wenn es in PlayMode ist. Wer das doch anders will, kann ja die zwei Zeilen löschen.

bearbeitet von MaZy
Etwas mehr info
Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

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

Gast
Auf dieses Thema antworten...

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