NewbiLars Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Hey Leute, Ich hab folgendes Problem, ich kriege einen String ohne Probleme mittels "Debug.Log(string);" ausgegeben. Was ich persönlich aber lieber in einem Text Ui angezeigt kriegen würde. Und zwar geht es um Daten, die vom Server zum Client gesendet werden. Übliche herangehensweise, ist mir klar - aber aus irgeneinem Grund geht es nicht. In der Letzten Methode using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ClientVerarbeitetDaten : MonoBehaviour { public Text serverFeedback; void VerarbeiteNachrichten(int packetNr, byte[] daten) { //Für Jedes mögliche DatenPaket wird ein "case"-Fall benötigt. switch (packetNr) { case 1: //Wenn PaketNr = 1 , dann folgt Case 1. VerarbeiteDatenPacket1(daten); break; case 2: break; } } public void VerarbeiteDaten(byte[] daten) { int packetNr; //Zur identifizierung des DatenPackets und zuordnung des Inhalts. KaymakGames.KaymakGames buffer = new KaymakGames.KaymakGames (); buffer.WriteBytes (daten); packetNr = buffer.ReadInteger (); buffer = null; if (packetNr == 0) return; VerarbeiteNachrichten (packetNr, daten); } void VerarbeiteDatenPacket1 (byte[]daten) { //dll-Plugin vom Tutorial. KaymakGames.KaymakGames buffer = new KaymakGames.KaymakGames (); buffer.WriteBytes (daten); //DatenPacket muss in der Reihenfolge ausgelesen werden, wie es versendet wurde! int nummer = buffer.ReadInteger (); string nachricht = buffer.ReadString (); //Debug.Log (nachricht); serverFeedback.text = nachricht; buffer = null; } } "Debug.Log (nachricht);" funktioniert, aber auch nur über der Zeile "serverFeedback.text = nachricht;" . Wenn ich das unter der Zeile habe, geht nicht einmal die Konsole. Eine Fehlermeldung kriege ich nicht, dem Script wurde auch das TextFeld zugeordnet. Mit dem String ansich, kann ja eigentlich kein Fehler vorliegen - da sonst die Console es ja auch nicht anzeigen dürfte. Vlt überseh ich da was oder hab irgendwo einen Denkfehler. Hoffe das mir dabei jemand helfen kann. Vielen Dank & habt noch einen Angenehmen Tag Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Probier mal folgendes: serverFeedback.text = nachricht.ToString(); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 Hatte ich noch nicht dran gedacht, danke dafür. Hat aber leider auch nicht geklappt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Mhhh, ReadString, was gibt er dir zurück. Einen oder mehrere Strings? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 der liefert immer einen String zurück. wenn ich in einem Datenpack mehr versenden würde, würde es so aussehen. Beispiel string nachricht1 = buffer.ReadString(); string nachricht2 = buffer.ReadString(); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Kannst du mal die Methode ReadString einstellen, mal sehen was der überhaupt macht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 viel kriege ich gerade nicht zu sehen dazu, public string ReadString (bool Peek = true); nicht besonders aufschlussreich für mein Empfinden ... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Mhhh eigentlich würde ich an dieser Stelle ein return; erwarten. ^^" Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 glaub liegt an der .dll datei... das PlugIn war bereits gegeben von ihm. Da ist ja die Einsicht begrenzt. Ich schau mal, glaube er hat im späteren Tutorial Part das PlugIn auch nochmal step by step erstellt. Schaue da rein, und melde mich dann hoffentlich mit neurer information Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 so okay, List<byte> Buff; byte[] readBuff; int readpos; bool buffUpdate = false; public void WriteString(string input) { Buff.AddRange(BitConverter.GetBytes(input.Length)); Buff.AddRange(Encoding.ASCII.GetBytes(input)); buffUpdate = true; } public int ReadInteger (bool Peek = true) { if (Buff.Count > readpos) { if (buffUpdate) { readBuff = Buff.ToArray(); buffUpdate = false; } int ret = BitConverter.ToInt32(readBuff, readpos); if (Peek & Buff.Count > readpos) { readpos += 4; } return ret; } else { throw new Exception("Byte Buffer is Past its Limit!"); } } public string ReadString(bool Peek = true) { int Len = ReadInteger(true); if(buffUpdate) { readBuff = Buff.ToArray(); buffUpdate = false; } string ret = Encoding.ASCII.GetString(readBuff, readpos, Len); if(Peek & Buff.Count > readpos) { if(ret.Length > 0) { readpos += Len; } } return ret; } hab jetzt auch den dazugehörigen WriteString ... aber viel schlauer werde ich dadruch auch nicht. Gut es wird alles in Bytes gespeichert, aber diese ja auch wieder in ein String encodiert... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Probier mal folgendes: string nachricht = buffer.ReadString (); string strCopy = string.Copy(nachricht); serverFeedback.text = strCopy; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 auch etwas, an das ich noch nicht gedacht habe. Aber das löst es auch noch nicht leider. bearbeitet: habe gerade mal ein leeres Script erstellt & nur das Text feld manuell ändern lassen. Das funktionierte Wollte dann mal in dem obigen Script was testen. bei der 1. Methode VerarbeiteNachrichten. Wenn case 1 erreicht wird, dort dann wie im Leeren Script das Text feld manuell ändern, aber auch das geht nicht einmal... case 1: //Wenn PaketNr = 1 , dann folgt Case 1. serverFeedback.text = "Verbindung zum Server herrgestellt!"; VerarbeiteDatenPacket1 (daten); in der Reihenfolge geht wieder der DebugLog nicht. umgedreht geht der DebugLog zwar aber das TextFeld nicht. Zitat case 1: //Wenn PaketNr = 1 , dann folgt Case 1. VerarbeiteDatenPacket1 (daten); serverFeedback.text = "Verbindung zum Server herrgestellt!"; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Mach mal oben eine neue Zeile in dein Skript und prüfe, ob der String wirklich "verschwindet": public class ClientVerarbeitetDaten : MonoBehaviour { public Text serverFeedback; public string message; ... ... string nachricht = buffer.ReadString (); string strCopy = string.Copy(nachricht); message = strCopy; Jetzt solltest du eigentlich die Message im Inspektor sehen. Und dann noch: Wie oft wird "VerarbeiteDatenPacket1" eigentlich aufgerufen? Wenn es jedes Frame 1x ausgeführt wird, dann wird er String natürlich immer wieder überschrieben ... public class ClientVerarbeitetDaten : MonoBehaviour { public Text serverFeedback; public string message; ... ... string nachricht = buffer.ReadString (); string strCopy = string.Copy(nachricht); // Nur neuen String setzen, wenn der neue String nicht leer ist if (String.IsNullOrEmpty(strCopy)) message = strCopy; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 seh leider nichts da falls, da vlt was hilfreiches dabei ist, das wäre aus der Console Verbindung zum Server hergestellt! UnityEngine.Debug:Log(Object) ClientVerarbeitetDaten:VerarbeiteDatenPacket1(Byte[]) (at Assets/Scripts/Netzwerk/ClientVerarbeitetDaten.cs:46) ClientVerarbeitetDaten:VerarbeiteNachrichten(Int32, Byte[]) (at Assets/Scripts/Netzwerk/ClientVerarbeitetDaten.cs:17) ClientVerarbeitetDaten:VerarbeiteDaten(Byte[]) (at Assets/Scripts/Netzwerk/ClientVerarbeitetDaten.cs:36) Netzwerk:BeiEmpfang(IAsyncResult) (at Assets/Scripts/Netzwerk/Netzwerk.cs:87) System.Net.Sockets.Worker:Receive() Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Hast du geprüft, wie oft der String neu geschrieben wird? Und schau auch mal, wie lang der String ist... string nachricht = buffer.ReadString (); Debug.Log("Zeit:" + Time.time); // Wie oft wird diese Stelle ausgeführt? Debug.Log("Aktuelle Stringlänge: " + test.Length); // Ist die Länge 0 wenn die Methode aufgerufen wird und kein String rauskommt? string strCopy = string.Copy(nachricht); Debug.Log("Aktueller String: " + strCopy); // Wird hier der aktuelle String geschrieben? message = strCopy; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 kriege ich folgende Fehlermeldung Zitat get_time can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 8. März 2018 Melden Share Geschrieben 8. März 2018 Mhh vielleicht: stört die DLL irgendwie den Mainthread von Unity, was nicht gut wäre ... oder dein Code wird aus dem Mainthread in einen anderen Thread verschoben 2.) Für diesen Fall kannst du ggf. Funktionen von Unity nicht mehr verwenden (daher meckert er auch bei der Time.time-Funktion). Eine "Unityfunktion" wäre dabei auch eine Aktualisierung eines UI-Feldes oder im Inspektor. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 8. März 2018 Autor Melden Share Geschrieben 8. März 2018 okay, danke dir. Versuche dann mal die DLL step by Step in Unity als C#-Klasse zu schreiben. Melde mich dann noch mal, wenn das erledigt ist, vlt klappt es dann sogar. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NewbiLars Geschrieben 10. März 2018 Autor Melden Share Geschrieben 10. März 2018 Hab es jetzt gelöst bekommen. Speicher den string "Nachricht" in einer statischen Variabel Klasse ab. und mit einem neuen Script dann auf das textFeld zugegriffen. Zitat void Update () { if (StaticStats.serverNachricht != null) { serverFeedback.text = StaticStats.serverNachricht; StaticStats.serverNachricht = null;} } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.