在 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; } }