标签: ui-toolkit

Unity UI 工具包:DropdownField 样式

我正在使用 Unity 的新 UI 工具包实现表单视图,并且使用 UI 构建器来设计我自己的东西的样式很简单。没什么大不了的。

当谈到 Unity 的预构建“控件”时,UI 构建器中的样式非常有限。我可以在最外面的父级上设置一些样式,但是内部控件,我不能乱搞。

不过,我可以查看这些组件使用的类,并且可以通过简单地手动编辑 USS 文件来覆盖它们的规则。不知道为什么会有这个限制,但就这样吧。

但是,使用DropdownField,我可以毫不费力地设置输入和箭头等的样式,但我找不到实际下拉面板的类,并且我希望能够修复颜色、字体、大小等. 也是这样,所以看起来没那么糟糕

在此输入图像描述

查看 的源代码DropdownField,我可以找到一些在 UI 构建器中看不到的类名,但即使在向它们发送垃圾邮件 CSS 规则时,我似乎也没有找到正确的类名

来自 DropdownField.cs

internal static readonly string ussClassNameBasePopupField = "unity-base-popup-field";
internal static readonly string textUssClassNameBasePopupField = DropdownField.ussClassNameBasePopupField + "__text";
internal static readonly string arrowUssClassNameBasePopupField = DropdownField.ussClassNameBasePopupField + "__arrow";
internal static readonly string labelUssClassNameBasePopupField = DropdownField.ussClassNameBasePopupField + "__label";
internal static readonly string inputUssClassNameBasePopupField = DropdownField.ussClassNameBasePopupField + "__input";
internal static readonly string ussClassNamePopupField = "unity-popup-field";
internal static …
Run Code Online (Sandbox Code Playgroud)

css unity-game-engine ui-toolkit

3
推荐指数
1
解决办法
3290
查看次数

有没有一种方法可以在运行时轻松地将数据绑定到UI

语境

因此,在对 UI 工具包进行了一些研究之后,我决定将其用于我的项目,因为我非常习惯 CSS 并且我鄙视 Unity3D 提供的“默认/遗留”UI 系统。

不幸的是,它还处于开发的早期阶段,他们似乎正在将其朝着“编辑器 GUI”方向发展。不管怎样,我选择它是因为它设计 UI 的速度比我使用通常的“Unity3D UI”方法更快。

客观的

我的目标相对简单,我想创建一个基于某些变量更新 UI 的行为,同时隐藏/抽象此行为(换句话说,我想将 UI 的值绑定到数据类上的某个整数)。

将来,由于我慢慢地将所有内容迁移到多人游戏环境,这将变得更加复杂

主要问题

经过几个小时的搜索/阅读文档,并强行解决问题,我设法找到了一个简单的解决方案,由于我硬编码了一些非常相似的行为,我将缩写该解决方案:

GameObject trackCanvas = GameObject.Find("Canvas");
UIDocument docum= trackCanvas.GetComponent<UIDocument>();
Label foodUI = docum.rootVisualElement.Q<Label>(name: "FoodVar");
        
if(playerResources!= null){
    SerializedObject pR = new SerializedObject(playerResources);
                
    SerializedProperty foodProp = pR.FindProperty("food");
                
    foodUI.BindProperty(foodProp);
                
}else{
    foodUI.Unbind();
}
Run Code Online (Sandbox Code Playgroud)

非常简单的解决方案,而且更好,但我节省了一些思考时间。这一切都像一个魅力,直到我尝试构建它......我看到多个与导入 UnityEditor 相关的错误,我开始删除它(因为我几乎导入了所有内容,并且只有在 CleanUp 上我才开始看到什么是必要的或不需要的)

不幸的是,在这个脚本上我不能,在重新阅读了细则上的文档(这不是那么好......)后,我读到SerializedObject不能在“生产/运行时/构建”版本中使用,因为它依赖于UnityEditor,而UnityEditor不会存在于最终产品上。

这真的让我很恼火,因为这是一个非常雄辩的解决方案。

后缀

该手册似乎暗示有一些方法可以使用 UnityEditor 命名空间。不幸的是,从他们非常模糊的教程中,我无法弄清楚它是如何工作的(我提到了坦克示例,它似乎只使用了 unityeditor,因为他们希望能够在编辑模式下绑定内容,而绑定本身似乎是通过 uxml 完成的)

我已经尝试了一些方法,但这一切似乎都脱离了上下文,就像有一些serializedField会神奇地与uxml绑定,只是因为绑定路径与变量名相同

然后我想,如果 Unity 不希望我在运行时模式下使用编辑器的东西,我会强制它,所以复制粘贴它的一些类,然后以某种方式破解它应该不那么困难。不幸的是,Unity 不仅拥有严格的专有许可证,不允许您以任何方式修改其软件,而且一些注释、函数等......都受到保护(尤其是他们使用的 C 内容)

然后我考虑手动完成,我得到了两个选择:

  1. 只需将 food.value = resources.food 放入某种更新中,并希望当我将其迁移到多人游戏环境时不会产生任何类型的问题

  2. 或者做一些更复杂的事情,比如我称之为更新 UI 的某种委托,理论上效率更高,因为我只更新需要的内容。 …

c# unity-game-engine ui-toolkit

2
推荐指数
1
解决办法
2484
查看次数

标签 统计

ui-toolkit ×2

unity-game-engine ×2

c# ×1

css ×1