版本:Unity 6 (6000.0)
语言英语
  • C#

PanelSettings.SetPanelChangeReceiver

建议更改

成功!

感谢您帮助我们改进 Unity 文档质量。虽然我们无法接受所有提交,但我们会阅读用户建议的每项更改,并在适用情况下进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请在几分钟后<a>再试</a>。感谢您花时间帮助我们改进 Unity 文档质量。

关闭

取消

声明

public void SetPanelChangeReceiver(UIElements.IDebugPanelChangeReceiver value);

描述

在 panelChangeReceiver 设置项中设置自定义 IPanelChangeReceiver,以接收每次更改事件。此方法仅在开发版本和编辑器中可用,因为这是一项调试功能,用于配合应用程序的配置文件。

请注意,随着底层架构的修改,返回的值可能会随着时间的推移而改变。

由于在面板的任何视觉元素上标记的每次更改都会调用此功能,因此开销不可忽视。在发行版中不会调用回调,因为该方法已剥离。以下示例在游戏中使用 panelChangeReceiver。要对其进行测试,请将组件添加到 GameObject,并在组件字段中链接 Panel Setting 资产。

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

public class ChangeLogger : MonoBehaviour, IDebugPanelChangeReceiver
{
    public PanelSettings panelSettings;
    public bool logChanges = true;
    public bool printOnConsole = false;
    public bool includeStacktrace = true;
    public List<ChangeEntry> changes;

    private void OnEnable()
    {
        panelSettings.SetPanelChangeReceiver(this);
    }

    public void Initialize()
    {
        changes.Clear();
    }

    public void OnVisualElementChange(VisualElement element, VersionChangeType changeType)
    {
        if (logChanges)
        {

            if (changes == null)
                changes = new List<ChangeEntry>();

            changes.Add(new ChangeEntry()
            {
                changeType = changeType,
                element = element.ToString(),
                stackTrace = includeStacktrace ? Environment.StackTrace : null
            });
        }

        if (printOnConsole)
        {
            Debug.Log($"{string.Join(",", changeType.toStrings()),-40} {element}");
        }
    }

    [Serializable]
    public struct ChangeEntry
    {
        public string element;

        public VersionChangeType changeType;

        [TextArea(10, 30)]
        public string stackTrace;
    }
}

public static class ChangeTypeHelpers
{
    public static List<string> toStrings(this VersionChangeType type)
    {
        var changes = new List<string>();

        foreach (var value in (VersionChangeType[])Enum.GetValues(typeof(VersionChangeType)))
        {
            if ((type & value) != 0)
                changes.Add(value.ToString());
        }
        return changes;
    }
}