版本:Unity 6 (6000.0)
语言:英语
当绑定属性更改时接收回调
使用 ListView 绑定到列表

当任何绑定属性更改时接收回调

版本: 2021.3+

这些示例演示了如何在绑定序列化对象的任何属性发生更改时接收回调。

示例概述

此示例创建一个自定义的 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
查看 词汇表
,其中包含两个字段。如果字段的值超出特定范围,它会警告用户。

您可以在此 GitHub 存储库 中找到示例的完整文件。

先决条件

本指南适用于熟悉 Unity 编辑器、UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。更多信息
查看 词汇表
工具包和 C# 脚本的开发人员。在您开始之前,请熟悉以下内容

创建武器对象

创建一个 C# 脚本,将 Weapon 类定义为 MonoBehaviour,其中包含两个属性:m_BaseDamagem_HardModeModifier

  1. 在 Unity 中使用任何模板创建一个项目。

  2. 在您的 项目窗口一个显示 Assets 文件夹内容的窗口(项目选项卡)更多信息
    查看 词汇表
    中,创建一个名为 callback-any-SerializedProperty-changes 的文件夹来存储您的文件。

  3. 创建一个名为 Weapon.cs 的 C# 脚本,并将它的内容替换为以下内容

    using UnityEngine;
    
    namespace UIToolkitExamples
    {
        public class Weapon : MonoBehaviour
        {
            public const float maxDamage = 9999f;
    
            [SerializeField]
            float m_BaseDamage;
    
            [SerializeField]
            float m_HardModeModifier;
    
            public float GetDamage(bool hardMode)
            {
                return hardMode ? m_BaseDamage * m_HardModeModifier : m_BaseDamage;
            }
        }
    }
    

创建绑定以接收回调

创建一个 C# 脚本,为 Weapon 定义一个自定义检查器,并使用 TrackSerializedObjectValue() 方法来检查 m_BaseDamagem_HardModeModifier 属性的变化。

  1. callback-any-SerializedProperty-changes 文件夹中,创建一个名为 Editor 的文件夹。

  2. Editor 文件夹中,创建一个名为 WeaponCustomEditor.cs 的 C# 脚本,并将它的内容替换为以下内容

    using UnityEngine;
    using UnityEditor;
    using UnityEngine.UIElements;
    using UnityEditor.UIElements;
    
    namespace UIToolkitExamples
    {
        [CustomEditor(typeof(Weapon))]
        public class WeaponCustomEditor : Editor
        {
            // This is text used for the warning labels.
            const string k_NegativeWarningText =
                "This weapon has a negative final damage on at least 1 difficulty level.";
            static readonly string k_DamageCapWarningText =
                "This weapon has an excessive final damage that is capped to " + Weapon.maxDamage +
                " on at least 1 difficulty level.";
    
            // These are labels to warn users about negative damage and excessive damage.
            Label m_NegativeWarning, m_DamageCapWarning;
    
            public override VisualElement CreateInspectorGUI()
            {
                VisualElement root = new();
    
                // Create FloatFields for serialized properties.
                var baseDamageField = new FloatField("Base Damage") { bindingPath = "m_BaseDamage" };
                var modifierField = new FloatField("Hard Mode Modifier") { bindingPath = "m_HardModeModifier" };
                root.Add(baseDamageField);
                root.Add(modifierField);
    
                // Create warning labels and style them so they stand out.
                var warnings = new VisualElement();
                m_NegativeWarning = new(k_NegativeWarningText);
                m_DamageCapWarning = new(k_DamageCapWarningText);
                warnings.style.color = Color.red;
                warnings.style.unityFontStyleAndWeight = FontStyle.Bold;
                warnings.Add(m_NegativeWarning);
                warnings.Add(m_DamageCapWarning);
                root.Add(warnings);
    
                // Determine whether to show the warnings at the start.
                CheckForWarnings(serializedObject);
    
                // Whenever any serialized property on this serialized object changes its value, call CheckForWarnings.
                root.TrackSerializedObjectValue(serializedObject, CheckForWarnings);
    
                return root;
            }
    
            // Check the current values of the serialized properties to either display or hide the warnings.
            void CheckForWarnings(SerializedObject serializedObject)
            {
                // For each possible damage values of the weapon, determine whether it's negative and whether it's above the
                // maximum damage value.
                var weapon = serializedObject.targetObject as Weapon;
                var damages = new float[] { weapon.GetDamage(true), weapon.GetDamage(false) };
                var foundNegativeDamage = false;
                var foundCappedDamage = false;
                foreach (var damage in damages)
                {
                    foundNegativeDamage = foundNegativeDamage || damage < 0;
                    foundCappedDamage = foundCappedDamage || damage > Weapon.maxDamage;
                }
    
                // Display or hide warnings depending on the values of the damages.
                m_NegativeWarning.style.display = foundNegativeDamage ? DisplayStyle.Flex : DisplayStyle.None;
                m_DamageCapWarning.style.display = foundCappedDamage ? DisplayStyle.Flex : DisplayStyle.None;
            }
        }
    }
    

测试绑定

  1. 在一个 场景一个场景包含您游戏的环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,基本上是分段设计和构建您的游戏。更多信息
    查看 词汇表
    中创建一个空 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、相机、航路点等等。游戏对象的功用由附着在其上的组件定义。更多信息
    查看 词汇表

  2. 选择游戏对象。

  3. 在检查器中添加武器组件。

  4. 武器 组件中,更改字段的值

    • 如果 基础伤害基础伤害 乘以 困难模式修改器 为负数,则会出现警告消息。
    • 如果 基础伤害基础伤害 乘以 困难模式修改器 大于 9999,则会出现不同的警告消息。

其他资源

当绑定属性更改时接收回调
使用 ListView 绑定到列表