Unity 用脚本操作常用UI控件(上)

2023-11-19

控件介绍:

在界面系统的术语中,将一个具有独立状态、外观和操作的对象称为控件。例如,常用的交互控件有按钮、输入框、滑动条等,常见的非交互式控件有文本标签、图片等。

Unity采用了父子物体和组件的设计思想,其每个界面控件,往往也是由游戏物体挂载组件,以及一些子物体实现的。例如,按钮控件是由按钮物体加上一个文本子物体构成的,而按钮和新的功能组件也叫按钮(Button),要注意区分"按钮组件"和"按钮控件"。


一、创建游戏界面

为了方便介绍,先搭建一个简单的界面

UI系统对于2D和3D区别不大,可以随意创建一个Unity工程

控件实际上是一个游戏物体,因此只要在Hierarchy窗口空白处右键,选择UI,先创建一个UI Text,然后观察Canvas(画布),Text(文本控件)和EventSystem(事件系统)。

1.Canvas与EventSystem简介

要想理解Canvas存在的必要性,便需要知道在一个游戏中,它和普通物体不同,界面上各种控件的布局会更复杂一些,如需要考虑位置对齐、适配、缩放等实际情况。因此,一般来说所有UI控件都必须是Canvas的子物体,这样才能方便统一布局。

另外,Unity也允许存在多个Canvas,形成多个独立的界面层。例如,游戏中人物的血条就可以放在单独的Canvas中表示,但是过多的Canvas会影响游戏性能。

EventSystem代表着事件系统。UI系统一定会用到事件系统,例如单机按钮、输入文字等操作都需要事件系统的辅助。事件系统不是UI系统专用的,它本身也有其他用途。

2.界面的比例问题

如果新建多个UI控件,我们会发现在Game窗口里能看到控件,而在场景里,UI控件会以非常极大的比例展现,必须将场景镜头拉得很远才能看清楚UI控件整体。

这是由于UI系统是以Canvas为载体,而Canvas很多时候和最终屏幕显示有直接的对应关系。UI 的默认比例时以1像素为单位的,而正常三维场景是以1米为单位的。因此,UI的一个像素等驾驭三维世界的1米。对于1920✖️1080像素的界面来说,横向就有1920米。

三维游戏场景的比例尺与默认界面系统的比例尺差距很大,就导致在编辑界面时很不自然,为了改善操作的便利性,Unity在场景中提供了2D按钮,为编辑界面带来了方便。

二、矩阵变换(Rect Transform)组件

如果选中界面上的控件,会发现每个物体并不带有基本的Transform组件,取而代之的是Rect Transform组件。其实Rect Transform组件是Transform组件的子类,因此并不违反"每个物体必须有且只有一个Transform组件"的规定。其中Rect是Rectangle的简写,即"矩形"的意思。

在UI系统中用Rect Tranform的原因是界面控件的位置、大小相对于游戏中的其他物体来说要复杂得多。复杂性体现在很多方面,下面举例

界面布局直接收到客户端屏幕大小、长宽比例的影响。比如,移动端显示屏具有多种分辨率和长宽比,加上个人计算机,情况就更多了。

界面上控件位置、大小直接影响用户体验。在很多游戏中,用户可以拖拽窗口的位置或修改窗口的大小。例如,游戏的聊天窗口位置和大小是可以动态调整的。在这种情况下使窗口内部元素动态适应窗口大小、自动改变窗口内部元素的布局十分必要。

由于存在种种复杂的情况,如果UI控件还是用简单的"位置、旋转和缩放"来定义自身位置,显然无法满足要求。因此Unity总结了众多游戏屏幕适配的经验和方法,设计了 Rect Transform组件

简单来说,Rect Transform组件使用多种相对参数取代了绝对的位置参数。上文制作的UI场景中,所有物体都是默认的"居中对齐"方式。这时右边的位置参数为Pos X、Pos Y,其代表的是控件与父控件之间的偏移量,(POs x=0,POs Y=0)就代表位于父控件的正中央。

非拉伸情况下,物体的位置是相对的,通过Anchor Presets和Pos来调整;大小是确定的,通过Height和Width来改变。

而当选择Stretch(拉伸)模式时,位置和大小的参数会发生根本的变化。例如,最典型的"上下左右都拉伸"的方式下,界面参数会发生改变:

定位物体的Pos X,Pos Y消失了,取而代之的是Left(左偏移),Top(上偏移),Right(右偏移),Bottom(下偏移)。如果将4个偏移参数改为0,则代表这个控件将铺满父控件的全部控件,而且无论父控件扩大或缩小,依然会保持铺满的状态。

这时"左偏移"代表的是"离左边有多远","上偏移"代表的是"离顶部有多远",如左偏移文本框中填写10代表离左边10个单位,填写负数则表示可以超出父控件的范围。这种铺满的模式适合用于表示游戏中的主体窗口。

三、图片(Image)组件

图片组件用于展示UI上的图片。在界面上可以设置的属性如下:

  1. 指定片源(Source Image)
  2. 修改图片的叠加颜色(Color)
  3. 指定图片材质(Materal),一般为空
  4. 射线检测目标(Raycast Target),大部分的UI组件都包含着一选项,它决定了控件是否会被单击到
  5. 图片类型(Image Type),包括简单(Simple)、切片(Sliced)、瓦片(Tiled)与填充(Filled)4种类型。其中切片与瓦片类型需要对图片导入参数进行设置后才能正常使用。切片类型通常用于制作可以任意缩放但边缘不变形的图片(也称为九宫格图片)
  6. Set Native Size(设为原始大小)按钮可以充值整个图片为原始像素大小
  7. 当图片类型为简单和填充时,会出现"Preserve Aspect(保留长度比)"选项,勾选它能够保证图片在放大、缩小时长宽比例不变,比较常用 

为演示用脚本控制图片的基本方法,给图片增加一个脚本ImageAnimTest,内容如下

public class ImageAnimTest : MonoBehaviour

{

        Image image;

        //可以在编辑器里指定另一张图片

        public Sprite otherSprite;

        float fillAmount=0;

        void Start()

        {

              //获取Image组件

               image=GetComponent<Image>();

              //直接将图片换为另一张图片

              if(otherSprite!=null)

              {

                     image.sprite=otherSprite;

              }

              //将图片类型改为Filled,360度填充,方便制作旋转动画

              image.type=Image.type.Filled;

              image.fillMethod=Image.FillMethod.Radial360;

           }

        Void Update()

          {

              //制作一个旋转现实的动画效果,直线效果也是类似的

              //取值为0~1

              image.fillAmount=fillAmount;

              fillAmount+=0.02f;

              if(fillAmount>1)

              {

                    FillAmount=0;

              }

      }     

}

在运行之前,可以给脚跟的Other Sprite字段制定一张新图片,这样在运行时,就会将内容替换为新的图片,并产生旋转现实的效果

四、文本(Text)组件

文本组件也是最常用的组件之一,用来显示文本信息。Unity的文本组件功能施恩丰富,在界面上可以设置的属性如下:

  1. Text(文本内容,就是要现实的文字内容
  2. Font(字体),默认为Arial。Unity支持安装其他类型的字体,只要将合适的字体文件复制到工程的Assets/Fonts文件夹下即可自动导入
  3. Font Style(字体风格)包括普通、黑体、斜体、黑体加斜体四种选择
  4. Line Spacing(行间距)
  5. Rich Text(富文本)
  6. Alignment(段落对齐方式)包括横向的靠左、居中和靠右对齐,以及纵向的靠左、居中和靠右对齐
  7. Horizontal Overflow(横向超出),指定横向超出控件大小的自负的处理方式,可以选择Wrap(折行)或Overflow(放任跑出边界)
  8. Vertical Overflow(纵向超出)
  9. Best Fit(最佳匹配),自动根据文本控件的大小改变字体的大小,可以限制自动调整的最大值和最小值
  10. Color(文字颜色)
  11. Materila(材质)一般留空
  12. Raycast Target(射线检测目标)与图片中的作用一样

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 用脚本操作常用UI控件(上) 的相关文章

  • SharedPreferences自定义XML文件保存位置

    声明 本篇文章的相关技术来自于 反射机制修改SharedPreferences存储路径 作者 Harlan9001 基于 实用的SharedPreferences工具类 前言 因为之前的文件是保存在项目目录下的 所以只要软件卸载了 本地的X

随机推荐

  • JAVA 中String 转JSONObject并取值

    今日在做Springboot时把请求放在后端进行 请求返回的结果的字符串需转化为JSON格式才能在后端进行交互 转换时遇到没有的问题 找寻后发现应该导入相关依赖包才能使用JSONObject import net sf json JSONO
  • Android_推送技术研究

    前言 最近研究Android推送的实现 研究了两天一夜 有了一点收获 写下来既为了分享 也为了吐槽 需要说明的是有些东西偏底层硬件和通信行业 我对这些一窍不通 只能说说自己的理解 为什么要研究Android推送技术 主要还是毕业设计要做一个
  • docker的数据卷、docker数据持久化

    目录 前言 docker数据持久化的2种方式 数据卷 bind mount 即 v参数 匿名数据卷 docker manager volume v参数和匿名卷的区别 docker volume 命令的使用 数据卷容器 孤儿volume mo
  • Linux操作系统Fedora命令界面与图形界面间切换

    Linux操作系统Fedora命令界面与图形界面间切换 听语音 浏览 5986 更新 2014 12 11 15 43 标签 linux 1 2 3 4 5 6 7 分步阅读
  • AI在玩一种很新的艺术,700万网友在线围观,ControlNet又立功了

    图片来源 由无界AI生成 文章来源 公众号量子位 QbitAI AI又在玩一种很新的艺术 一组 在离谱与合理的边缘反复试探 的图席卷各大平台 最火的一条 已有近700万查看16 8万点赞 到处有人在求教程 除了棋盘样式 还有一种螺旋样式的也
  • 定时器&pwm

    定时器TIM STM32F1 系列中 除了互联型的产品 共有 8 个定时器 分为基本定时器 通用定时器和高级定时器 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器 只能定时 没有外部 IO 通用定时器 TIM2
  • 腾讯mini项目-【指标监控服务重构】2023-07-30

    今日已办 调研 CPU Memory Cadivisor adivisor gt Prometheus gt Grafana SigNoz Web google cadvisor Analyzes resource usage and pe
  • Java字符串转换成字符数组

    方法1 package com oracle import java util Scanner public class Test param args public static void main String args TODO Au
  • VMWARE 占用硬盘空间越来越大的解决方法

    1 问题现象 为了开发android驱动 我使用vmware虚拟机运行UBUNTU12 04 硬盘分区有150G 分配了130g给虚拟机 还剩下不到20G的空间作为预留 本来想着130G的空间应该足够跑ubuntu的 但当我编译过几次and
  • 3D游戏编程——与游戏世界交互

    HW5 1 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏内容要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由
  • 【LLM】如何将开源基础模型训练成特定领域的LLM?

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • xxxxxxxxxxxxxx

    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
  • python生成10个随机数并排序_生成一个随机数的列表,然后对它们进行排序

    首先 我想向您展示完整的代码 稍后我将发表评论 import random def randomNum return random sample range 1 100 5 numbers list randomNum print numb
  • BUUCTF LOVESQL

    打开网页后 利用hackbar 先来查询他的列数 1 order by 3 试了1 2 3 4都不行 初步判断 是被后端代码过滤掉了 我们试试 和 的效果是一样的 但是当我尝试使用 后发现仍然没有反应 说明后端代码也过滤掉了 我们采用另外一
  • 二进制在数学中的妙用

    二进制在数学中的妙用 goal00001111搜集整理 十 八世纪初 莱布尼茨发明了二进制数 当时的他肯定没有预料到二进制在信息时代会有着如此广泛的应用 二进制数以其工作可靠 运算简单 逻辑严密 容易实现 等特点 成为了计算机的专用语言 在
  • linux下安装中文输入法及vim支持中文的方法

    最近折腾Ubuntu 之前一直是用英文显示系统 输入法也是Ubuntu14默认的拼音 一开始也没觉得不好 可是在vim编辑文档时 需要添加注释 这就显得十分不方便 所以花点时间来解决这个问题 一开始是想找vim如何支持中文的方法 网络上的各
  • Springboot Maven显示缺少org.junit.jupiter.api

    原因 spring boot 2 2 之前使用的是 Junit4 而后续的使用的是Junit5 导致缺少包 解决方法 导入包
  • C语言-多选题

    C语言多选题 1 若有字符串char string和缓冲区char buf MAX LEN string非空 并且缓冲区长度MAX LEN大于string的长度 则将字符串string复制到缓冲区buf 下列做法正确的是 AB A spri
  • CentOS 7查看磁盘空间

    CentOS如何查看硬盘大小 CentOS是一种基于Linux的操作系统 主要用于服务器端应用 在服务器管理中 硬盘大小是一个非常重要的指标 查看硬盘大小可以帮助系统管理员有效地管理硬盘空间和避免硬盘满了的情况 方法一 使用df命令 df命
  • Unity 用脚本操作常用UI控件(上)

    控件介绍 在界面系统的术语中 将一个具有独立状态 外观和操作的对象称为控件 例如 常用的交互控件有按钮 输入框 滑动条等 常见的非交互式控件有文本标签 图片等 Unity采用了父子物体和组件的设计思想 其每个界面控件 往往也是由游戏物体挂载