深挖 NGUI 基础 之UIRoot (一)

当你开始使用NGUI的时候,简单的从项目视图 中一个”Control”预设体 拖拽到场景视图中,你将会发现 Hierarchy层次面板中会出现以下层次结构:

  1. 其中 UI Root作为根节点,是每个NGUI元素的顶级父节点
  2. 在Unity中,每个元素都具有最基本的Transform属性,这也叫基元属性;
  3. UI Root是用于管理和处理UI的变化和缩放
  4. Camera其实是一个独立的UICamera,负责渲染UI对象到视图中,作为UI Root的子节点存在
  5. 剩下的蓝色文字的物体就是最关键的UI部分.

(一) UI Root缩放方式之 Scaling Style

  1. NGUI中 UI Root 缩放方式有三种,默认为Flexible

    public enum Scaling
        {
            Flexible,
            Constrained,
            ConstrainedOnMobiles,
        }
  2. public Scaling scalingStyle = Scaling.Flexible;

他们之间的关系是:默认为Flexible,若手动选 Scaling.ConstrainedOnMobiles,应该符合的平台是编辑器,IPhone,安卓,Window Phone8或者Unity_WP_8_1,或者黑莓.那么这些情况将把UI Root缩放方式变为Scaling.Constrained,其他时候设置无效,将会默认为Flexible固定缩放,也就是说当你发布在网页平台的时候设置为ConstrainedOnMobiles为无效操作.

public Scaling activeScaling
    {
        get
        {
            Scaling scaling = scalingStyle;

            if (scaling == Scaling.ConstrainedOnMobiles)
#if UNITY_EDITOR || UNITY_IPHONE || UNITY_ANDROID || UNITY_WP8 || UNITY_WP_8_1 || UNITY_BLACKBERRY
                return Scaling.Constrained;
#else
                return Scaling.Flexible;
#endif
            return scaling;
        }
    }

Flexible 意味着保持原有像素,不进行缩放.分辨率的变化不影响UI的像素.

Unity默认按照UI Root Minimum Height 最小高度限制来设定 该UI元素的实际高度.

而且UI Root脚本中 默认最小高度为720px,最大高度为1280px

并且限定范围为320px <=  Height <= 1536px

比如当我们把屏幕的宽高度设置为1280 * 7200 px

那么在固定缩放的情况下,Scaling.Flexible中,实际高度activeHeight是怎么计算的呢?让我们看看脚本,先计算出屏幕的宽高比,限制最小和最大高度.

if (scaling == Scaling.Flexible)
            {
                Vector2 screen = NGUITools.screenSize;
                float aspect = screen.x / screen.y;

                if (screen.y < minimumHeight)
                {
                    screen.y = minimumHeight;
                    screen.x = screen.y * aspect;
                }
                else if (screen.y > maximumHeight)
                {
                    screen.y = maximumHeight;
                    screen.x = screen.y * aspect;
                }

                // Portrait mode uses the maximum of width or height to shrink the UI
                int height = Mathf.RoundToInt((shrinkPortraitUI && screen.y > screen.x) ? screen.y / aspect : screen.y);

                // Adjust the final value by the DPI setting
                return adjustByDPI ? NGUIMath.AdjustByDPI(height) : height;
            }

接下来我们用案例来看UI实际情况:首先设置屏幕大小为1270*720ox

把UI Root 的最小Minimum 设置为 720px,也就是以此 UI Root为画布的元素(画布和屏幕大小一致),默认与画布的比例是自身元素高度  :  720px

如我们把Button设置的宽高设置为72 px * 1280 px,那么刚好 10个Button元素就能把画面填充满

最顶部Button元素的坐标Y轴是324,那么它是怎么来的呢?

计算:屏幕高度 / 2 - 元素高度 /2 = 720/2 – 72/2 = 324 px

这在做网格类游戏很有用哦:比如三消游戏或者SLG游戏等

时间: 2024-08-04 12:30:07

深挖 NGUI 基础 之UIRoot (一)的相关文章

深挖 NGUI 基础 之UICamera (二)

一.UI Camera作用 UICamera需要挂载在摄像机上才能发挥作用 UICamera仅负责 发送NGUI 事件 到 脚本所附加的摄像机中看得到的对象,比如我自定义了NGUI层(在Inspector面板中Layer添加),并且把UI Root下所有UI元素的Layer都设置成自定义的NGUI层. 事件发送不仅取决于挂载摄像机渲染的层对象,还取决于UI Camera脚本中的Event Mask,EventMask决定了哪些游戏对象的层能用于接收事件(可以一个或者多个层). 你可以手动的去选择

京东深挖物流,引领双十一理性消费

电商圈关于双十一的筹备工作已悉数完成,阿里与京东两大巨头的"猫狗大战"如期上演.近日关于两巨头双十一宣传海报相继问世,不再是来言去语式争风吃醋,而是各自风格迥异,黑白分明.而正是这种全然不同,吸引了笔者的注意:冲动消费已成过去,完善服务倡导理性回归. 消费结构趋向价值引导 随着社会消费结构的升级以及线上线下电商的相互融合,以价格战为主导的双十一已不再适合当下的消费需求.我国居民可支配收入的增加,中产阶级群体以超过一亿之多,加之长达八年双十一的消费洗礼,现在的消费不在看中价格,而偏向价值

美国联邦调查局FBI继续深挖大北农窃种行动的“内奸”

2013年12月12日,大北农"窃种行动"案件的经办人,Klinefeldt检察官在新闻发布会上表示,FBI要继续深挖那些暗藏在美国公司内部与中国大北农"窃种行动"同谋的"内奸"("insider"),正是这些"内奸"向大北农偷窃种子的执行者提供转基因玉米测试场地的具体所在位置以及相应的转基因玉米的基础遗传基因序列. 转基因玉米的基础遗传基因序列是绝对的商业秘密,涉及到国家的根本利益.在美国,转基因玉米的4

任务7,深挖K近邻

任务7 深挖K近邻 一, 缺失值的处理 处理缺失值的方法:需要理解数据,察觉到哪些数据是必要的哪些不必要 1, 删除法: (1)     删整个列 (2)     删整行(丢弃此记录) 2, 填补法 (1)     用平均值来填补缺失值 (2)     均值,中位数填补 二,特征编码 ——机器学习的核心是建模,基础是数据,且输入一定是数值类型的,因此要把字符串转为字符类型,向量或矩阵类型 ——这个转换的过程叫类别特征 ——最常用的编码技术叫 独热编码 对于标签编码,用0,1,2表示特征的取值,但

写作社群圈子牛人:矩阵不如深挖

不知大家对"矩阵"一词是否了解,它常用在数学中,是一个按照呈方形陈列排列的复数或实数集合.我发现不少人在发布文章的时候都会采用矩阵的方法,就是将一篇文章发10个,20个,甚至更多的平台,不管平台大小,只要是平台都会发到. 我的做法正好相反,不会将文章随便发到一个平台上.我的文章绝大部分都发布在阿里和慧聪网,其中又以阿里为重点,而且我不会将文章随意发到阿里的任何一个论坛.我的方向性很强,只发在一个论坛上,这一习惯已经保持了好几年.选择矩阵式的发布文章的人一直都很忙碌,他们到一个平台发完文

批量发货阻塞启示:深挖系统薄弱点

背景 最近发生了一起"批量发货阻塞"的线上问题,值得深思和记录. 批量发货的流程是:商家上传一个里面可能含有一万多的订单号及物流发货信息的发货文件,然后PHP后台接收和解析文件,提取出待发货的信息,每5000个订单号发货信息打包成一个消息后批量推送到NSQ消息队列中.后台PHP脚本从NSQ消息队列中取出打包的发货消息,打散成单个的发货消息,然后循环调用Java发货服务化接口完成批量发货. 这里采用5000个订单号发货信息打包一个消息批量推送,是考虑到前端超时限制,采用其他数量总有偶发的

深挖“窄带高清”的实现原理

过去几年,又拍云一直在点播.直播等视频应用方面潜心钻研,取得了不俗的成果.我们结合点播.直播.短视频等业务中的用户场景,推出了"省带宽.压成本"系列文章,从编码技术.网络架构等角度出发,结合又拍云的产品成果,向大家介绍节省流量,降低带宽成本的妙招. <降低30%视频码率,深挖"窄带高清"的实现原理>是"省带宽.压成本"系列文章的第3篇.本文将深挖又拍云最新技术窄带高清,讲解窄带高清是怎样在不改变视频主观质量的情况下,通过改变码率来降低

深挖JDK动态代理(二):JDK动态生成后的字节码分析

接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transClass() throws IOException { URL resource = rpcMain.class.getClass().getResource("/"); byte[] bts = ProxyGenerator.generateProxyClass("$Proxy0

深挖Openstack Nova - Scheduler调度策略

深挖Openstack Nova - Scheduler调度策略 一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(Fliter)和计算权值(Weight) 1. 过滤: 过滤掉不符合我们的要求,或镜像要求(比如物理节点不支持64bit,物理节点不支持Vmware EXi等)的主机,留下符合过滤算法的主机集合. 2. 计算权值 通过指定的权值计算算法,计算在某物理节点上申请这个虚机所必须的消耗cost.物理节点越不适合