我的程序当前在控制台中显示文本。
我希望这些文本可以显示在游戏窗口中。
这些数据是网络请求的一部分。
有没有一种简单的方法将控制台中显示的内容显示为GUI元素?
我的程序当前在控制台中显示文本。
我希望这些文本可以显示在游戏窗口中。
这些数据是网络请求的一部分。
有没有一种简单的方法将控制台中显示的内容显示为GUI元素?
可以简单地将回调函数添加到例如Application.logMessageReceivedThreaded
。
这是从此帖子中扩展了OnGUI
脚本的API示例。
// Put this on any GameObject in the scene
public class ExampleClass : MonoBehaviour
{
// Adjust via the Inspector
public int maxLines = 8;
private Queue<string> queue = new Queue<string>();
private string currentText = "";
void OnEnable()
{
Application.logMessageReceivedThreaded += HandleLog;
}
void OnDisable()
{
Application.logMessageReceivedThreaded -= HandleLog;
}
void HandleLog(string logString, string stackTrace, LogType type)
{
// Delete oldest message
if (queue.Count >= maxLines) queue.Dequeue();
queue.Enqueue(logString);
var builder = new StringBuilder();
foreach (string st in queue)
{
builder.Append(st).Append("\n");
}
currentText = builder.ToString();
}
void OnGUI()
{
GUI.Label(
new Rect(
5, // x, left offset
Screen.height - 150, // y, bottom offset
300f, // width
150f // height
),
currentText, // the display text
GUI.skin.textArea // use a multi-line text area
);
}
}
通常情况下,OnGUI
已经过时了,你应该只在调试时使用它。
但是,你基本上也可以将同样的脚本用于例如UI.Text
组件,并把文本分配给它而不是使用OnGUI
。
脚本基本上看起来是一样的,但有一个
public Text text;
而不是使用OnGUI
,直接执行以下操作:
text.text = builder.ToString();
DotPlay也有一个不错的解决方案。这是示例代码:
using UnityEngine;
using DotPlay;
public class Class1 : MonoBehaviour
{
private void Start ()
{
DebugAgent.LogGUI ("Hello!");
DebugAgent.LogGUI ("Bye!");
}
}
这是一个使用TextMeshPro更新的2023年答案,源自derHugo的回答。
DebugLogCanvas.cs
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
public class DebugLogCanvas : MonoBehaviour
{
[SerializeField] int maxLines = 50;
[SerializeField] TextMeshProUGUI debugLogText;
Queue<string> queue = new Queue<string>();
void OnEnable()
{
Application.logMessageReceivedThreaded += HandleLog;
}
void OnDisable()
{
Application.logMessageReceivedThreaded -= HandleLog;
}
void HandleLog(string logString, string stackTrace, LogType type)
{
// Delete oldest message
if (queue.Count >= maxLines) queue.Dequeue();
queue.Enqueue(logString);
var builder = new StringBuilder();
foreach (string st in queue)
{
builder.Append(st).Append("\n");
}
debugLogText.text = builder.ToString();
}
}