版本:Unity 6 (6000.0)
语言:英语
使用 Inspector 创建绑定
绑定到 UXML 模板

绑定到嵌套属性

版本: 2021.3+

本示例演示了如何在 UXML 中的 BindableElement 使用 binding-path 属性将字段绑定到 SerializedObject 的嵌套属性。

示例概述

本示例创建了一个自定义的 InspectorUnity 窗口,用于显示当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表
UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
,它包含以下内容:

  • 两个绑定到 GameObjectUnity 场景中的基本对象,可以代表角色、道具、场景、相机、路点等等。游戏对象的功能由附加到它的组件定义。 更多信息
    参见 术语表
    的名称和 USS 变换的比例的字段
  • 两个绑定到 SerializedObject 的嵌套属性的字段

您可以在这个 GitHub 仓库 中找到此示例创建的完整文件。

先决条件

本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:

创建可破坏的坦克对象

创建 C# 脚本以定义一个坦克类,该类具有生命值使其可破坏。

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

  2. 在您的 项目窗口一个窗口,显示您的 Assets 文件夹的内容(项目选项卡)更多信息
    参见 术语表
    中,创建一个名为 bind-nested-properties 的文件夹来存储所有文件。

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

    using System;
    using UnityEngine;
    using UnityEngine.Serialization;
    
    [Serializable]
    public struct Health
    {
        public int armor;
        public int life;
    }
    
    [ExecuteInEditMode]
    public class DestructibleTankScript : MonoBehaviour
    {
        public string tankName = "Tank";
        public float tankSize = 1;
    
        public Health health;
    
        private void Update()
        {
            gameObject.name = tankName;
            gameObject.transform.localScale = new Vector3(tankSize, tankSize, tankSize);
        }
    
        public void Reset()
        {
            health.armor = 100;
            health.life = 10;
        }
    }
    

创建 UXML 和 Inspector UI

创建一个带有 BindableElement 的 UXML 文件。将 BindableElement 的 binding-path 设置为 health 属性,并将 BindableElement 每个子元素的 binding-path 设置为 healtharmorlife 属性。

  1. bind-nested-properties 文件夹中,创建一个名为 Editor 的文件夹。

  2. Editor 文件夹中,创建一个名为 tank_inspector_styles.uss 的 USS 文件,并将它的内容替换为以下内容:

    .container {
        background-color: rgb(80, 80, 80);
        flex-direction: column;
    }
    Label {
        background-color: rgb(80, 80, 80);
    }
    TextField:hover {
        background-color: rgb(255, 255, 0);
    }
    FloatField {
        background-color: rgb(0, 0, 255);
    }
    
  3. 创建一个名为 destructible_tank_editor.uxml 的 UI 文档,并将它的内容替换为以下内容:

    <UXML xmlns="UnityEngine.UIElements" xmlns:ue="UnityEditor.UIElements">
        <Style src="tank_inspector_styles.uss"/>
        <VisualElement name="row" class="container">
            <Label text="Tank Script - Custom Inspector" />
            <ue:PropertyField binding-path="tankName" name="tank-name-field" />
            <ue:PropertyField binding-path="tankSize" name="tank-size-field" />
            <BindableElement binding-path="health">
                <ue:PropertyField binding-path="armor"/>
                <ue:PropertyField binding-path="life"/>
            </BindableElement>
        </VisualElement>
    </UXML>
    

创建自定义编辑器

创建一个 C# 脚本,为 DestructibleTankScript 注册一个自定义编辑器。

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

    using UnityEditor;
    using UnityEngine;
    using UnityEngine.UIElements;
    
    [CustomEditor(typeof(DestructibleTankScript))]
    public class DestructibleTankEditor : Editor
    {
        [SerializeField]
        VisualTreeAsset visualTreeAsset;
    
        public override VisualElement CreateInspectorGUI()
        {
            return visualTreeAsset.CloneTree();
        }
    }
    
  2. 在项目窗口中选择 DestructibleTankEditor.cs

  3. destructible_tank_editor.uxml 拖动到 Inspector 中的 可视树资源

测试绑定

  1. 在 Unity 中,将一个空游戏对象添加到一个 场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您可以放置环境、障碍物和装饰,本质上是按部分设计和构建您的游戏。 更多信息
    参见 术语表
  2. 选择游戏对象。
  3. 在 Inspector 中添加 可破坏坦克脚本 组件。护甲生命 字段绑定到 health.armorhealth.life 属性。如果您更改 Inspector 中的值,底层属性的值也会发生改变。

其他资源

使用 Inspector 创建绑定
绑定到 UXML 模板