Unity2019 UIElement 笔记(四)UXML的特性

在前面三部分,翻译了一下UXML元素的部分,也介绍了如何编写最简单的C#、UXML、USS。
而在这一部分中,主要介绍UXML的特性
本案例来自Unity官方文档 https://docs.unity3d.com/Manual/UIE-WritingUXMLTemplate.html

简单编写UXML

以下代码展示了一个简单面板:

<?xml version="1.0" encoding="utf-8"?>
<UXML
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="UnityEngine.UIElements"
    xsi:noNamespaceSchemaLocation="../UIElementsSchema/UIElements.xsd"
    xsi:schemaLocation="UnityEngine.UIElements ../UIElementsSchema/UnityEngine.UIElements.xsd">

    <Label text="Select something to remove from your suitcase:"/>
    <Box>
        <Toggle name="boots" label="Boots" value="false" />
        <Toggle name="helmet" label="Helmet" value="false" />
        <Toggle name="cloak" label="Cloak of invisibility" value="false"/>
    </Box>
    <Box>
        <Button name="cancel" text="Cancel" />
        <Button name="ok" text="OK" />
    </Box>
</UXML>
  • 文件的第一行是XML的声明,声明是可选的,如果要包含声明,则必须位于第一行,并且不得在其前面显示其他内容或空格。version属性必需,encoding属性可选,如果包含encoding,则必须声明字符编码。
  • 下一行开始定义根目录< UXML >,在UIElement中,元素在UnityEngine.UIElements或在UnityEditor.UIElements命名空间下。例如:想要使用Button组件那么就必须指定<UnityEngine.UIElements:Button />
  • 如果要更方便的使用组件,就可以指定命名空间,例如,xmlns:engine=“UnityEngine.UIElements”,那么就将engine这个前缀定义为UnityEngine.UIElements,这意味着< engine:Button />等同于<UnityEngine.UIElements:Button />
  • 还可以通过排除前缀来定义默认命名空间。例如,该行xmlns="UnityEngine.UIElements"定义UnityEngine.UIElements为默认命名空间,这意味着< Button />等同于<UnityEngine.UIElements:Button />
  • 如果定义自己的元素,则这些元素可能在其自己的命名空间中定义。如果要在UXML模板中使用这些元素,则必须在< UXML >标记中包含命名空间定义和文件位置以及Unity命名空间。
  • UI定义是一系列嵌套的XML元素,每个XML元素代表一个VisualElement
  • VisualElement作为所有元素的基类,它为所有元素提供以下属性:
  1. name:元素的标识符,名称唯一。
  2. picking-mode:Position响应鼠标事件,Ignore忽略鼠标事件。
  3. focus-index:( 弃用)
  4. tabindex:整数,用于定义当前元素的Tab键位置。
  5. focusable:布尔值,指示元素是否可聚焦。
  6. class:以空格分隔的标识符列表,使用类为元素指定视觉样式,还可以使用类在UQuery中选择一组元素。
  7. tooltip:当鼠标悬停在元素上时显示为工具提示的字符串。
  8. view-data-key :一个字符串,用于定义用于序列化元素的Key值。
  • UXML定义样式信息,例如用于绘制UI的尺寸,字体和颜色等,请使用单独USS文件

重用UXML

通过在UXML中定义组件,然后导入< Template >中并作为< Instance >在另一个UXML文件中实例化该元素。在设计大型的UI界面的时候,可以将部分的UI定义为模板UXML文件。
实际操作方式请参考我写的 Unity2019 UIElement 笔记(二)中模板一部分
https://blog.csdn.net/qq_43500611/article/details/89604942

从C#加载UXML

实际操作方式请参考我写的 Unity2019 UIElement 笔记(一)
https://blog.csdn.net/qq_43500611/article/details/89604455

UQuery

UQuery提供了一组方法来从UIElements中检索元素。
UQuery基于JQuery或Linq,但UQuery旨在尽可能地限制动态内存分配,这样可以在移动平台上实现。
要使用UQuery检索元素,使用UQueryExtensions.Q或初始化QueryBuilder用UQueryExtensions.Query
例如:
我现在做了一个嵌套式的结构:

  <Box name="BoxA">
   <Box name="BoxA1">
      <Label name="labA1 1" text="labA1 1"/>
      <Label name="labA1 2" text="labA1 2"/>
      <Label name="labA1 3" text="labA1 3"/>
    </Box>
   <Box name="BoxA2">
      <Label name="labA2 1" text="labA2 1"/>
      <Label name="labA2 2" text="labA2 2"/>
      <Label name="labA2 3" text="labA2 3"/>
    </Box>
  </Box>
  <Box name="BoxB">
    <Box name="BoxB1">
      <Label name="labB1 1" text="labB1 1"/>
      <Label name="labB1 2" text="labB1 2"/>
      <Label name="labB1 3" text="labB1 3"/>
    </Box>
  </Box>

那么我就可以从根开始找到第一个具有名字为labA2 2的元素,并把它的名字修改为change

root.Query<Label>("labA2 2").First().text = "change";

同样我们也可以迭代的去使用
比如我们想把BoxB1内的所有Label的text换成"newTitle",就可以用下面的方式

root.Query("BoxB1").Children<Label>().ForEach(lab => lab.text = "newTitle");

最后的效果如下
在这里插入图片描述
那么到此为止UXML部分就简单的介绍完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值