重写Text.text的行为会很奇怪。
我正在使用Text组件的文本在Unity的游戏屏幕上显示日志。由于TCP接收到异步操作,因此将Log放入队列一次,并在Update方法中检索并显示它。
private void Update()
{
if (LogQueue.Count > 0)
{
var msg = LogQueue.Dequeue();
Debug.Log(msg);
LogText.text = msg + "\n" + LogText.text;
}
}
public void CreateServer()
{
var portText = IpInput.text;
var port = int.Parse(portText);
server = new TcpListener(IPAddress.Any,port);
server.Start();
server.BeginacceptTcpClient(new AsyncCallback(acceptClientCallback),server);
LogQueue.Enqueue($"Server listening on port {port}");
LogQueue.Enqueue($"wait client ...");
}
private void acceptClientCallback(IAsyncResult ar)
{
var listener = (TcpListener)ar.AsyncState;
client = listener.EndacceptTcpClient(ar);
stream = client.GetStream();
var msg = System.Text.Encoding.ASCII.GetBytes("connected");
stream.Write(msg,msg.Length);
LogQueue.Enqueue("connectd");
var buffer = new byte[128];
stream.BeginRead(buffer,buffer.Length,ReadStreamCallBack,buffer);
}
private void ReadStreamCallBack(IAsyncResult ar)
{
Debug.Log("called");
var buffer = (byte[])ar.AsyncState;
var msg = System.Text.Encoding.ASCII.GetString(buffer,buffer.Length);
LogQueue.Enqueue(msg);
var back = System.Text.Encoding.ASCII.GetBytes("received");
stream.Write(back,back.Length);
var nextBuffer = new byte[128];
stream.BeginRead(nextBuffer,nextBuffer.Length,nextBuffer);
}
实际执行时,同步处理的日志正确显示,如下所示。
sync log 1
sync log 2
sync log 1
sync log 3
sync log 2
sync log 1
但是,当开始显示与TCP异步接收的消息的日志时,先前的日志消失,仅显示最新的日志。
received message 1
received message 2
received message 3
为什么会这样?