Buschmann Geschrieben 25. Juli 2023 Melden Share Geschrieben 25. Juli 2023 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! 🙂 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Juli 2023 Melden Share Geschrieben 25. Juli 2023 Moin! Würde helfen, wenn du den relevanten Code einmal zeigen würdest Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Buschmann Geschrieben 25. Juli 2023 Autor Melden Share Geschrieben 25. Juli 2023 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; } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Juli 2023 Melden Share Geschrieben 25. Juli 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Buschmann Geschrieben 25. Juli 2023 Autor Melden Share Geschrieben 25. Juli 2023 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? 😅 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. Juli 2023 Melden Share Geschrieben 25. Juli 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.