在Unity中将Debug.log作为GUI元素放置

3

我的程序当前在控制台中显示文本。

我希望这些文本可以显示在游戏窗口中。

这些数据是网络请求的一部分。

有没有一种简单的方法将控制台中显示的内容显示为GUI元素?


我建议您应该查看Unity UI - Thalthanas
3个回答

6

可以简单地将回调函数添加到例如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();

有没有办法让字体变大?它太小了,我什么都看不清。否则一切似乎运作良好。谢谢。 - Christoph
没关系,我用GUI.skin.textArea.fontSize = 40;在GUI Label函数之前解决了它。谢谢。 - Christoph

0

DotPlay也有一个不错的解决方案。这是示例代码:

using UnityEngine;
using DotPlay;

public class Class1 : MonoBehaviour
{
    private void Start ()
    {
        DebugAgent.LogGUI ("Hello!");
        DebugAgent.LogGUI ("Bye!");
    }
}


0

这是一个使用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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接