运行时Scene显示Debug框打印信息

本文介绍了一个在Unity中实现的日志系统,该系统能够记录不同类型的日志信息,包括普通日志、警告和错误,并提供了日志显示窗口,允许用户筛选和查看不同类型的日志,同时具备日志清除功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class LogObject
{
    public string output = "";
    public string stack = "";
    public LogType logType;
}

public class DebugOutside : MonoBehaviour
{
    //public long maxLogCount = 200;

    private List<LogObject> lo = new List<LogObject>();
    private Rect m_logWinRect = new Rect(0, 0, 600, 400);
    private Rect m_minBtnRect = new Rect(0, 0, 140, 55);
    private Vector2 scrollPosition;
    private bool m_showLog = true;
    private bool m_showWarning = true;
    private bool m_showError = true;
    private bool m_showLogWin = true;

    void Start()
    {
    }

    void OnEnable()
    {
        Application.RegisterLogCallback(HandleLog);
    }
    void OnDisable()
    {
        Application.RegisterLogCallback(null);
    }
    void HandleLog(string logString, string stackTrace, LogType type)
    {
        LogObject o = new LogObject();
        o.output = logString;
        o.stack = stackTrace;
        o.logType = type;
        if (lo.Count > 200)
        {
            lo.RemoveAt(0);
        }
        lo.Add(o);
    }
    void OnGUI()
    {
        if (m_showLogWin)
        {
            m_logWinRect = GUI.Window(0, m_logWinRect, LogWin, "输   出");
        }
        else
        {
            m_minBtnRect = GUI.Window(1, m_minBtnRect, MinBtnWin, "输   出");
        }
    }

    void MinBtnWin(int id)
    {
        GUILayout.Space(5);
        if (GUILayout.Button("展   开"))
        {
            m_showLogWin = !m_showLogWin;
        }
        GUI.DragWindow(new Rect(0, 0, 1000, 20000));
    }

    void LogWin(int id)
    {
        scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, true, GUILayout.Width(585), GUILayout.Height(350));
        foreach (LogObject item in lo)
        {
            if (item.logType == LogType.Log && !m_showLog)
            {
                continue;
            }
            if (item.logType == LogType.Warning && !m_showWarning)
            {
                continue;
            }
            if (item.logType == LogType.Error && !m_showError)
            {
                continue;
            }
            switch (item.logType)
            {
                case LogType.Log:
                    GUI.color = Color.white;
                    break;
                case LogType.Warning:
                    GUI.color = Color.yellow;
                    break;
                case LogType.Error:
                    GUI.color = Color.red;
                    break;
                default:
                    GUI.color = new Color(.3f, .3f, .3f, 1f);
                    break;
            }
            GUILayout.Label(item.output + "\n" + item.stack);
            GUILayout.Space(-25);
            GUI.color = Color.gray;
            GUILayout.Label("------------------------------------------------------------------------------------------------------------------------------------------");
            GUILayout.Space(-10);
        }
        GUILayout.EndScrollView();
        GUILayout.BeginHorizontal();
        GUI.color = Color.white;
        if (GUILayout.Button("折   叠"))
        {
            m_showLogWin = !m_showLogWin;
            m_minBtnRect.x = m_logWinRect.center.x - m_minBtnRect.x / 2;
            m_minBtnRect.y = m_logWinRect.center.y - m_minBtnRect.y / 2;
        }
        if (GUILayout.Button("清   除"))
        {
            lo.Clear();
        }
        m_showLog = GUILayout.Toggle(m_showLog, "日   志");
        m_showWarning = GUILayout.Toggle(m_showWarning, "警   告");
        m_showError = GUILayout.Toggle(m_showError, "错   误");
        GUILayout.EndHorizontal();
        GUI.DragWindow(new Rect(0, 0, 1000, 20000));
    }
}

挂载相机上

<think>嗯,用户之前问了关于国家代码GB的问题,现在转向Unity的界面元素信息打印工具。我需要先理解用户的需求。用户可能是在使用Unity开发,想要调试或记录UI元素的信息,比如位置、大小、组件属性等。有没有现有的工具或者方法可以实现这个呢? 首先,用户可能是开发者,尤其是Unity新手,可能在调试UI遇到了问题,比如元素不显示或者布局不正确。他们需要一种方法来获取UI元素的实信息,以便检查问题所在。这候,用户想知道是否有现成的工具,或者需要自己写代码。 接下来,我应该回顾Unity自身的功能。Unity Editor本身有没有内置的工具?比如Scene视图中的调试信息,或者通过Inspector查看属性。但这些可能不够,特别是运行需要动态获取信息。可能需要编写脚本,使用Debug.Log或者UI Debugger工具。 然后,考虑第三方工具。有没有Asset Store里的工具可以推荐?比如UI Debugger、Runtime Hierarchy Explorer、Odin Inspector等。这些工具可能提供更直观的界面查看UI元素的信息。 另外,用户可能需要详细的步骤,比如如何通过代码遍历UI元素,打印它们的属性。比如使用Canvas的组件,递归查找子物体,输出RectTransform的信息。这候需要给出具体的代码示例,用C#展示如何实现。 还要注意用户可能的深层需求,比如性能优化,或者自动化测试。这候可能需要更专业的工具,或者结合单元测试架。但用户当前的问题比较基础,可能只需要简单有效的方法。 最后,总结一下,既有Unity原生的方法,也有第三方工具,根据用户的需求和项目复杂度选择合适的方式。确保回答结构清晰,分说明,帮助用户逐步解决问题。</think>在 Unity 中,可以通过以下工具和方法打印或获取界面元素(UI Element)的信息: --- ### **一、Unity 原生工具** #### 1. **Debug.Log + 脚本遍历** - **原理**:通过编写脚本访问 UI 元素的属性(如位置、尺寸、父子关系等),并用 `Debug.Log` 输出到控制台。 - **示例代码**: ```csharp using UnityEngine; using UnityEngine.UI; public class UIDebugger : MonoBehaviour { void Start() { // 遍历所有 Canvas 下的 UI 元素 Canvas[] canvases = FindObjectsOfType<Canvas>(); foreach (Canvas canvas in canvases) { Debug.Log($"Canvas: {canvas.name}"); foreach (Transform child in canvas.transform) { LogUIElement(child); } } } void LogUIElement(Transform element) { RectTransform rect = element.GetComponent<RectTransform>(); if (rect != null) { Debug.Log($"元素名称: {element.name}"); Debug.Log($"位置: {rect.anchoredPosition}"); Debug.Log($"尺寸: {rect.sizeDelta}"); } // 递归遍历子物体 foreach (Transform child in element) { LogUIElement(child); } } } ``` #### 2. **Editor 调试模式** - **操作步骤**: 1. 在 Unity Editor 的 **Hierarchy 窗口** 中选择 UI 元素。 2. 在 **Inspector 窗口** 中查看其属性(如 `RectTransform`、`CanvasGroup` 等)。 3. 启用 **Debug 模式**(击 Inspector 右上角的齿轮图标,选择 **Debug**),查看隐藏属性。 --- ### **二、第三方工具** #### 1. **UI Debugger(Asset Store 插件)** - **功能**: - 实显示 UI 元素的层级结构、尺寸和布局。 - 高亮选中元素并显示属性(如锚、对齐方式)。 - **推荐插件**:[UI Debugger](https://assetstore.unity.com/packages/tools/gui/ui-debugger-146655) #### 2. **Runtime Hierarchy Explorer** - **功能**: - 在运行查看所有 UI 元素的层级结构。 - 支持筛选和搜索特定元素。 - **推荐插件**:[Runtime Hierarchy Explorer](https://assetstore.unity.com/packages/tools/utilities/runtime-hierarchy-explorer-120903) #### 3. **Odin Inspector(高级可视化工具)** - **功能**: - 自定义属性面板,支持复杂 UI 数据的可视化。 - 结合代码快速生成调试信息。 - **链接**:[Odin Inspector](https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041) --- ### **三、扩展方法** #### 1. **使用 Unity 的 UI 分析工具** - **UI Profiler**(菜单栏:**Window > Analysis > UI Profiler**): - 分析 UI 的渲染性能。 - 查看 Canvas 的渲染批次和顶数量。 #### 2. **自动化脚本生成报告** - 编写脚本将 UI 元素信息导出为文本或 CSV 文件: ```csharp // 示例:导出到文本文件 System.IO.File.WriteAllText("UI_Report.txt", GetUIHierarchy()); ``` --- ### **四、适用场景** | 场景 | 推荐工具 | |----------------------|-----------------------------| | 快速调试单个元素属性 | Unity Editor 的 Inspector | | 运行动态获取信息 | Debug.Log + 自定义脚本 | | 复杂项目可视化分析 | UI Debugger 或 Odin Inspector | 如果需要更具体的实现方案,可以补充说明你的需求(例如“获取某个按钮的击事件绑定信息”或“批量导出所有 Text 组件的文字内容”)!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值