Jump to content
Unity Insider Forum

Text string ausgeben


NewbiLars

Recommended Posts

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

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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

seh leider nichts da :unsure:

 

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

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

Mhh vielleicht:

  1. stört die DLL irgendwie den Mainthread von Unity, was nicht gut wäre ...
  2. 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

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

Archiviert

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

×
×
  • Neu erstellen...