这是我阅读 UGUI 源码记录的相关笔记,共三部分、文件结构和部分组件使用、输入事件、核心部分

ZeroyiQ:UGUI 源码笔记(一)文件结构和部分组件使用

ZeroyiQ:UGUI 源码笔记(二)输入事件

ZeroyiQ:UGUI 源码笔记(三)核心部分

一、UGUI

1. Define

通过 3D 网格系统构建的 UI 系统。源码地址

1.1 实现

使用 UGUI 制作一个图元(图片、按钮...),会先构建一个方形网格,然后绑定材质球,材质球里存放了要显示的图片。

1.2 问题

材质球和网格的渲染,性能开销过大,drawcell 过高。

1.3 解决

  1. 减少材质球:一部分类型相同的图片,进行合图。多个图元可以只是用一个材质球,改变模型顶点上的 UV 就能显示不同的图片了。
  2. 合并网格:将有相同材质球(图片、shader)和相同层级的网格,进行合并。

2. 源码文件结构(v2019.1)

  • EventSystem 输入事件
  • EventData 事件数据
  • InputModules 输入事件捕捉模块
  • Raycasters 射线碰撞检测
  • EventHandle 事件处理和回调
  • Animation 动画
  • CoroutineTween 补间动画
  • Core 渲染核心
  • Culling 裁剪
  • Layout 布局
  • MaterialModifies 材质球修改器
  • SpecializedCollections 特殊集合
  • Utility 工具集
  • VertexModifies 顶点修改器

二、部分组件

1. Canvas

类似于画画的画布。Canvas 包含了上述解决步骤中的合并网格的功能。

1.1 Render Mode

  • Screen Space - Overlay:不与空间上的排序有任何关系,常用在纯 UI。Sort Order 值越大,显示越前面
  • Screen Space - Camera:依赖 Camera 的平面透视,能够加入非 UGUI的元素到 UI 中。【常用】
  • World Space: UI 物体会放出现在世界空间中,常在世界空间中与普通3D物体一同展示,列如场景中对象的血条。

2. Canvas Scale

缩放比例组件,用来指定 Canvas 中元素的比例大小。

2.1 UI Scale Mode

  • Constant Pixel Size:指定比例大小。
  • Scale With Screen Size:以屏幕基准自动缩放,能设置以宽还是以高。【手游项目常用】
  • Constant Physical Size:以物理大小为基准。

2.2 ScreenMatchMode.MatchWidthOrHeight

根据屏幕高宽匹配。使用对数空间转换能够有更好的表现。

float logWidth = Mathf.Log(screenSize.x / m_ReferenceResolution.x, 2);
float logHeight = Mathf.Log(screenSize.y / m_ReferenceResolution.y, 2);
float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, m_MatchWidthOrHeight);
scaleFactor = Mathf.Pow(2, logWeightedAverage);

e.g. 设备和游戏屏幕比例,宽是 10/5 = 2,高是 5/10 = 0.5,匹配值设定为 0.5。

正常空间平均值计算:(2+0.5)* 0.5 = 1.25,会放大 Canvas。

对数空间平均值计算:2^((log2(2)+log2(0.5))*0.5) =2^((1+-1)*0.5) = 1 ,Canvas 比例不变。

3. Image 、RawImage

对于图片、图集展示的组件。

3.1 区别

  • Image:展示图集中的图元,能够参与合并。
  • RawImage:能展示单张图片,不能合并。

3.2 选择

图片尺寸小,能够打成图集 -> Image

图片尺寸大,合图效率低 -> RawIamge

图片相同类型数量多,合并图集太大,实际展示图片又很少 -> RawIamge

4 RectTransForm

虽然 RectTransform 是 UnityEngine 下的类,但是在 UGUI 中大量使用,也需要有所了解。

简单来说,UGUI 通过 RectTransform 来定义 UI 的位置、大小、旋转。

4.1 Anchors

锚点:子节点相对于父节点的对齐依据。数值为相对于父节点的比例。

100X100的图片,全展 Anchors,父节点 120X120 效果如下。

Anchors Presets 工具,列出了常用的 Anchor 布局。按住 Shift 可以连同 Pivot 一同改变,按住 Alt 可以连同位置一同改变,在子节点铺满父节点的时候非常好用。

4.2 Pivot

物体自身的支点,影响物体旋转、缩放、位置。

ugui源码_UGUI 源码笔记(一)文件结构和部分组件使用相关推荐

  1. ugui获取坐标_UGUI源码解析(六)Raycast

    Raycast 编程小技巧: Mathf.Approximately(0.0f, projectionDirection); 比较两个float值,如果他们在很小的相差(Epsilon)内,返回tru ...

  2. 《Java修炼指南:高频源码解析》阅读笔记一Java数据结构的实现集合类

    一.Arrays工具类 来自java.util.Arrays,用来处理数组的各种方法. 1.1 List asList(T- a) 用来返回由自定数组支持的固定大小列表,虽然这里返回了一个List,但 ...

  3. Unity UGUI图文混排源码(二)

    Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...

  4. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  5. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  6. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  7. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

  8. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」

    作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...

  9. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

最新文章

  1. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
  2. CentOS 6.6 x86_64升级内核到最新版2.6.32-642.3.1.el6.x86_64
  3. Python之自动单元测试之一(unittest使用实例)
  4. Activiti部署报错
  5. 采用web技术开发PC应用
  6. 详解GAN的谱归一化(Spectral Normalization)
  7. leetcode 643 Maximum Average Subarray I
  8. 汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)
  9. java找不到符号类socket,编译报错+解决方法:错误: 找不到符号
  10. np.memmap读取大文件
  11. andorid 录音去噪音
  12. [Data Structure Algorithm] 有向无环图的拓扑排序及关键路径
  13. vue.js 常用语法总结(一)
  14. SBCL 使用中文时的错误记录 --close 问题已经解决
  15. linux 忘记原来的myql的root的密码
  16. JAVA输入jdb,解决 JAVA 单步调试键盘输入被 JDB 占用的问题
  17. 分解质因数(包括证明的详解)
  18. 毕设题目:Matlab人脸识别
  19. Scratch 模拟病毒传染小程序
  20. CSS font-family常见中文字体对应的英文名称

热门文章

  1. vscode 常用插件
  2. linux命令--VI命令详解(一)
  3. reactjs路由router的基本使用
  4. ubuntu安装cgroup-tools
  5. 使用npm init生成package.json
  6. Python Django related_name属性使用示例
  7. volatile的实现细节
  8. Spring Boot连接多个Redis库配置方案及代码示例
  9. VS2015+OpenCV2.4.13环境搭建详细步骤及自带示例编译运行
  10. Ubuntu20.04 Desktop image 添加快捷方式