Jump to content
Unity Insider Forum

Kann Text-Label über Programmcode nicht ändern


Recommended Posts

Hallo Unity-Freunde,

ich bin neu bei Unity (Programmiere aber schon lange in anderen Sprachen) und scheitere schon beim Ändern eines Textlabels per Code. Es gibt mehrere Tutorials die das ausführlich zeigen und genauso habe ich es nachgebaut:

1. Im Script eine public-Variable vom Typ Text angelegt

2. Das Script in das übergeordnete Element in der Hierarchy (ein Canvas) eingefügt.

3. Das entsprechende Textlabel neben dem Variablennamen in der Component des Canvas ausgewählt.

Beim Ausführen des Codes bekomme ich aber jedes mal die Meldung: 

"NullReferenceException: Object reference not set to an instance of an object"

Grundsätzlich habe ich wohlo noch ein Verständnisproblem, wie die Objekte in Unity mit dem Code verbunden sind!

Für einen Tipp wäre ich dankbar! 🙂

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit dem Click auf den Login-Button wird SendLogin() ausgeführt, was auch soweit klappt. Aber am Ändern des Textes scheitert es dann! 😞

using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using UnityEngine;
using UnityEngine.UI;


public class login : MonoBehaviour
{
    private static readonly HttpClient client = new HttpClient();
    private string user;
    private string password;
    private string server;

    public Text myText;

    void Start()
    {
        
    }

    void Update()
    {
        
    }

    public void ReadUserInput(string s)
    {
        this.user = s;
        Debug.Log(s);
    }

    public void ReadPassInput(string s)
    {
        this.password = s;
        Debug.Log(s);
    }

    public void ReadServerInput(string s)
    {
        this.server = s;
        Debug.Log(s);
    }

    public void TheEnd()
    {
        Debug.Log("Programm wird beendet");
        Application.Quit();
    }

    public void SendLogin()
    {
        var values = new Dictionary<string, string>
            {
                {"user", this.user },
                {"pass", this.password },
                {"server", this.server}
            };

        var content = new FormUrlEncodedContent(values);

        this.myText.text = "Verbindung wird hergestellt";

        var request = client.PostAsync("http://localhost:8080/login", content);
        string result = request.Result.Content.ReadAsStringAsync().Result;
    }
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, wenn die Exception bei "this.myText.text = ..." fliegt, dann sehe ich im Code kein Problem, das dazu führen könnte. Entsprechend würde ich sagen, dass kein Objekt durch Drag and Drop im Inspektor referenziert wurde. Wenn du das doch gemacht hast, ist das wahrscheinlichste Problem, dass du dieses Script hier mehrfach in deiner Szene hast, und die Instanz, bei der diese Methode aufgerufen wird, da nichts zugewiesen hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das kann natürlich sein. Mir fehlt völlig das Verständnis dafür wie und wo und warum Scripte auf irgendwelche GameObjects gezogen werden müssen, dürfen oder nicht dürfen und wie und wann ich vom Code aus darauf zugreifen oder nicht zugreifen kann. Ich komme aus einer Welt, wo Programme nur aus Programmcode entstehen! 😉

Gibt es irgendwo ein Tutorial für Umsteiger die aus der "Klassichen" Programmierung kommen? 😅

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da fällt mir direkt keins ein.

Ist aber eigentlich nicht so komplex. Du hast halt Entitys (hier "GameObjects"), die keine eigene Semantik haben, sondern nur Container für Komponenten sind. Diese Komponenten definieren dann, was das für ein Objekt ist. Eine Unterkategorie davon sind MonoBehaviours, also deine Scripts. Die klinken sich in Events ein, die aus der Engine kommen und kriegen so ihre Impulse, um irgendetwas zu tun.

Wann du was auf welches GameObject packst, ist nicht fest definiert, aber es gibt natürlich Ansätze, die schlauer sind als andere. Z.B. sollten Objekte sich so weit wie möglich selber managen. Ein Hubschrauber hat dann eine Komponente, die sich um das Einsteigen können kümmert und eine weitere für's Fliegen. Vermutlich noch die eine oder andere mehr, um's single purpose und modular zu halten.

Wenn du so etwas abstraktes hast, das eigentlich gar nicht so richtig Teil deiner Szene ist, dann kannst du das Ding auf irgendein ansonsten leeres GameObject schmeißen. Oft kann man die Komponente aber auch direkt mit auf den Button kleben, der deinen Code auslösen soll. Man kann aber auch überlegen, ob man das überhaupt als Komponente braucht und ggf. stattdessen einfach eine normale Klasse bauen.

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