详解Unity 4.6新UI的布局
本文所讲的是Unity 4.6中新加入的uGUI,官方称Unity UI,而不是过去的OnGUI式的旧UI(官方称Legacy GUI)。
我曾经在8月份对照4.6 Beta的文档写过一篇笔记学习Unity 4.6新GUI系统,但对Anchors不够深入,而且有了一些API上的变化。下面就是我对新UI布局的理解,以及最后Canvas Scaler组件的介绍。
放置任意一个UI元素到场景中,首先可以看到自动创建了一个Canvas对象;另外这个元素一定会拥有一个Rect Transform组件。
Rect Transform是专为UI元素准备的,它的一个重要属性就是锚点Anchors,用于指定自身相对父级的布局。对于这个UI元素,它的父级就是Canvas。锚点一共有四个,分别对应自身矩形的四个顶点。在父级元素形状发生变化时,四个锚点到四个顶点的偏移offset不变。

我们可以直接在场景中拖动锚点来设置,拖动时有数值显示,非常直观。但有时候我们希望更精确一点。注意到四个锚点可以聚集在一点,也可以在一条线,也可以分散成矩形。这样,它们的位置总能由两个点来确定,就是图中Anchors下面Min和Max两个属性。Min代表更左边、更下边的点,Max代表更右边、更上边的点。数值范围是0~1,以左下为(0,0),右上为(1,1)。图中的锚点可以看出就是矩形的中心。
其实通过左上角你已经可以直观看出锚点的位置了。点击左上角可以弹出一个菜单,这里是Unity预置的几种布局。有固定在一点的,也有在一条边上的,还有更加自由的布局。确定一种模式后,右边的属性也会随之变化,方便你调整元素的大小或偏移。

在固定在一点的模式下,元素的形状不变,位置随这一点变化。所以可以指定它的两个坐标轴的偏移Pos X和Pos Y。Pos X和Pos Y均为0时,元素的支点和锚点重合。因为大小不变,可以指定宽和高。效果如下图:

固定在一条边的情况下,元素的形状和位置均可能发生变化。以下图的固定在下边为例,受偏移量影响,它的宽会变而高不变。所以它可以设置的属性是Left、Right、Pos Y、Height,分别代表元素左(右)边距离父元素左(右)边的距离,支点距父元素下边的偏移、元素的高度。

注意不管是Left、Right还是Top、Bottom都是以元素的边为准,而Pos X和Pos Y则是以支点为准。
这种固定在边的两个顶点上的模式,这条边会显示为stretch。如果把锚点从顶点移开,则会变为custom。对于custom,当父元素形状变化时,元素自身会按比例变化。效果如图所示:

如果在两个坐标轴上都用custom,那么元素就能在不同的屏幕上显示类似的大小。以下图为例,如果想让Logo(Image对象)显示在屏幕中上部分,并且在不同分辨率下占据的比例都相同,就可以设置为custom,将锚点框住想显示的位置,并将上下左右边距都设为0,就能达到这种效果。

最后介绍一下Canvas Scaler这个组件。可以在Canvas上通过Add Component找到这个组件。

这个组件有三种模式:
Constant Pixel SizeScale With Screen SizeConstant Physical Size
选择Scale With Screen Size并设定默认分辨率,其他分辨率下的UI就会通过设定的分辨率拉伸得到。而且Canvas也会调整到默认分辨率大小,方便UI设计。应该算是一个偷懒的方法吧。在4.6 Beta中,曾经有个Reference Resolution组件,现在已经被它替代了。
详解Unity 4.6新UI的布局的更多相关文章
- 详解Java8特性之新的日期时间 API
详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...
- 详解C#7.0新特性
1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: 1 var input ...
- 详解Vue的slot新用法
摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...
- 详解QUiLoader 动态加载.ui文件
http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...
- 详解Unity Profiler内存分析问题
在使用Unity开发游戏的过程中,借助Profiler来分析内存使用状况是至关重要的.但许多开发者可能还对Profiler中各项数据表示的含义不甚明确,今天我们Unity官方的技术工程师柳振东,将针对 ...
- Java lambda 表达式详解(JDK 8 新特性)
什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...
- 详解 Java 17 中新推出的密封类
Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409.Seal ...
- iOS 9界面适配利器:详解Xcode 7的新特性UIStackView
升级Xcode7后老项目storyBoard出现问题了,一看时新特性搞的鬼.具体 详见:http://www.csdn.net/article/2015-08-04/2825372
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
随机推荐
- SpringBoot应用篇(一):自定义starter
一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...
- Codeforces Beta Round #71 C【KMP+DP】
Codeforces79C 题意: 求s串的最大子串不包含任意b串: 思路: dp[i]为以i为起点的子串的最长延长距离. 我们可以想到一种情况就是这个 i 是某个子串的起点,子串的长度-1就是最短, ...
- 求组合数 C(n,m)
下面内容转自: http://blog.csdn.net/zengaming/article/details/63681754 一.求解C(n, m) 公式一: 公式二: 公式二可以这么理解,从n个物 ...
- Kipmi0 占用CPU 100%
查看当前正在运行的进程发现kipmi0进程占用率达到100% kipmi -% of the CPUs, %/% comes when the machine is idle? A second is ...
- shiro 重定向 后 带有 sessionId 的 解决 办法
http://blog.csdn.net/aofavx/article/details/51701012
- UVa 10652(旋转、凸包、多边形面积)
要点 凸包显然 长方形旋转较好的处理方式就是用中点的Vector加上旋转的Vector,然后每个点都扔到凸包里 多边形面积板子求凸包面积即可 #include <cstdio> #incl ...
- 2017 ACM/ICPC Asia Regional Shenyang Online transaction transaction transaction
Problem Description Kelukin is a businessman. Every day, he travels around cities to do some busines ...
- 解决tomcat闪退问题
https://blog.csdn.net/zh2nd/article/details/79068680 转载此博客链接内容,非常感谢博主 本文参考CSDN博主 哈克沃德.的<Tomcat8启动 ...
- windows7安装完上不了网
安装完Windows7后发现上不了网,网卡驱动没有安装的原因:但是没有网怎么下载驱动呢,,先装一个网卡版驱动精灵(貌似叫驱动精灵万能网卡版)什么的安装一个网卡驱动,就解决了