jjzjj

【Unity UI ToolKit】01 - 新手教程 从控件创建到C#代码控制

恩博同学 2023-10-12 原文

UI ToolKit分为Editor和Runtime,这里先梳理下运行时(Runtime)的,从新建工程,创建UIDocument,VisualElement,演示USS,到用C#获取控件,绑定事件等一系列基础使用流程。

大致流程如下:

1.创建项目。(unity版本选择及基础介绍)

2.创建UIDocument

3.部分基础控件VisualElement,label,button创建及样式编辑

4.创建USS,及使用

5.创建C#脚本,获取控件及绑定事件

6.运行测试

1.创建项目

Unity2021.3.X已经内置了UI Toolkit,因此我这里使用的是2021.3.0,如果是较旧版本需要去PackageManager自己安装。

由于创建UI Document需要保存UXML文件,并且后面还需要保存样式表USS文件,因此,按如下目录结构创建文件夹,以方便后面清晰明了的存储文件。

2.创建UIDocument

直接在Hierachy中右键,即可创建UIDocument

同时,Unity会自动创建如下文件

创建的UIDocument如下

其中,PanelSetting是可以在不同 UIDocument中复用的

SourceAsset即是UXML文件,需要单独为特定的UIDocument创建

接下来,我们创建一个UXML文件,

在之前创建的UXML文件夹下,右键创建一个UI Document(注意,这里虽然也叫UI Document,但它实际创建出来的是uxml文件,用来赋值给上面的SourceAsset,之后我会称这里创建的UI Document文件为uxml文件,注意不要与hierachy中的混淆了)

 为创建出来的uxml文件命名为

UXML_Examp1

 然后将其赋值给Hierachy的UI Document中的SourceAsset

然后,双击UXML_Examp1,打开UI Builder窗口

注:

如果要打开代码编辑UXML,只需要在文件上右键-Open C# Project

 或者,点开文件小箭头,双击其子物体即可

 代码长这样,本文我们不在这里手写代码。先回过头来,继续使用UI Builder

3.部分基础控件VisualElement,label,button创建及样式编辑

3.1 先简单介绍一下界面

 首先,左上StyleSheet

用来显示USS样式表,这部分后面会提到

Hierachy

和编辑器的Hierachy功能类似,用来显示我们都在此uxml中创建了哪些控件

Library

控件库,我们可以拖拽控件到Viewport中

Viewport

类似编辑器的Scene窗口,预览我们UI结果的

Inspecter

属性窗口,调节属性,

下方Preview(默认是收起来的)

用来预览代码的,如图中红箭头,拖拽上来就可以了,默认它是隐藏的

3.2 创建一些基础控件

这里我打算做这么一个简单的功能,如下

 Label是一个标签,ADD和Clear是按钮,

当点击ADD时,Label显示一个数据,从零开始自增

当点击Clear时,清空数据,并刷新Label

首先,拖拽一个VisualElement到ViewPort中,并适当向下拉,调节一下它的大小

 注:点击Fit Canvas可以让窗口居中

接下来,拖拽一个Label到VisualElement下

 点击label,在Inspector中设置其Margin为auto(即居中)

直接在红框打auto,下面即会自动识别

然后修改Text的Size属性为50,

并单独调节Margin的top属性为40,让其靠近上边缘,给按钮留位置

 最后在最上方,修改label名字为【MyLabel】,可以看见Hierachy中也同步了名字,之后我们获取控件,需要用这个名字来获取

然后,我们再拖拽一个Button到VisualElement下,排在MyLabel后面

同样设置其

Margin四个属性为auto,

Text-Size 为40,拉到最上,

修改Button-Text为ADD,

然后修改按钮名字为【MyAddBtn】

4.创建USS及使用

首先创建一个USS

我们选中上面创建的ADD按钮,在其Inspector中找到StyleSheet

 可以看见,

下面有 Extract Inlined Style to New Class 按钮(将行内样式表添加到新类),这个可以将当前控件的行内样式,存储成样式表

我们在输入框中输入样式表的名字,点击Extract

点击添加到新的USS

 弹窗,让我们选择路径,这里我们选择之前创建好的USS文件夹,并为文件名好名【USS_Examp1】

创建完成后,可以看到

左上StyleSheets中已经出现了我们常见的样式表,里面有.btn

下方代码中,AddButton也相应更新成了,引用class样式表,而不是行内样式了(下方红框)

使用USS

再新建一个按钮,拽到VisualElement下,

 然后按住.btn拖拽到新创建的Button下

最后修改一下button的Name和Text 

创建好的界面如下

此时运行测试一下,可以看见game中已经生成了UI,并且按钮可以正常点击

5.创建C#脚本,获取控件及绑定事件

新建C#脚本Examp1Ctrl.cs

将脚本挂到UI Document上

添加引用

using UnityEngine.UIElements;

获取某根下的控件

label = rootElement.Q<Label>("MyLabel");

为控件绑定事件

btn_add.RegisterCallback<ClickEvent>(evt => {
    //
});

完整代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class Examp1Ctrl : MonoBehaviour
{
    private UIDocument document;

    private VisualElement rootElement;
    private Label label;
    private Button btn_add;
    private Button btn_clear;

    private int countNum = 0;

    void Start() {
        document = GetComponent<UIDocument>();

        rootElement = document.rootVisualElement;//获取根

        //在根下,通过JQuery和名字获取控件
        label = rootElement.Q<Label>("MyLabel");
        btn_add = rootElement.Q<Button>("MyAddBtn");
        btn_clear = rootElement.Q<Button>("MyClearBtn");

        //为按钮绑定事件
        //匿名方法绑定按钮点击事件(需要带ClickEvent参数)
        btn_add.RegisterCallback<ClickEvent>(evt => {
            countNum++;
            UpdateLabelText();
        });
        //使用普通方法绑定按钮事件
        btn_clear.RegisterCallback<ClickEvent>(OnClearBtnClick);

        //初始化内容显示
        UpdateLabelText();
    }

    private void OnClearBtnClick(ClickEvent evt) {
        countNum = 0;
        UpdateLabelText();
    }

    private void UpdateLabelText() {
        label.text = $"Num = {countNum}";
    }

}

6.运行测试

参考连接:
UI Toolkit | 计数器案例 In-game | Unity3d教程_哔哩哔哩_bilibili

有关【Unity UI ToolKit】01 - 新手教程 从控件创建到C#代码控制的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  9. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐