原地址:http://www.cnitblog.com/updraft/archive/2013/11/12/88801.html

制作自适应的几个方法
1. 使用 UIROOT 里设置自定义高度的方法,然后配合 ANCHOR 左对齐,右对齐等方式,但在手机上经常会遇到宽高比不一样的分辨率,最后结果就是没有右对齐的部分容易被剪切。
    优势:简单,不用额外写脚本了,而且匹配的精度是原始的,效果也不错
    缺点:遇到宽高比不一致就没法解决了,有些UI会被剪切,而且居中TILED的部分在类似IPAD中正确,但在iphone会变得很大。

2. 使用UIStretch拉伸anchor或者uipanel,这种方法不算完美的自适应ui,纯粹只是按比例缩放拉伸对象和窗口,不过可以适配所有宽高比,而且整体UI的比例能保持不变。
    优势:简单,不用写额外的脚本,适合所有宽高比
    缺点:纯粹是拉伸对象,在宽高比差异很大时,整个UI变形比较大。而且还有个最大的问题,在使用UIPANEL的剪切(CLIPPING)功能时,UIStretch会导致剪切失效,所以使用clipping时是无法使用uistretch的。

3. 方法同2一样,使用UIStretch,但需要增加脚本处理下UIPanel,让uipanel的clipping能正常工作。
    通过查看uipanel的clipping的源码可以发现剪切是必须要求x,y,z的scale值一模一样的,但实际上一模一样也不能保证正确的clipping,我尝试改成(2,2,2)这种,剪切范围是对了,但UIPANEL不允许移动,一旦移动就会导致剪切范围移动,这个尼玛太不科学了。。。 特别是 UIDraggablePanel 使用了剪切后,直接拖出屏幕外边了。
    所以UIPANEL的scale值在全局范围内只能是(1,1,1),不是localScale=(1,1,1),所以需要取得uipanel对应的anchor上的uistretch修改的scale值,然后做一个逆变换,让其全局scale变为(1,1,1),在panel下动态创建一个group对象,把panel之前的所有孩子节点移动上去,重新增加一个uistretch,让uipanel保持1,1,1的比例,其他对象保持stretch的比例就ok了。

代码示例如下:

//  clipping panel auto uniform & change clipping range
public class EF_C_NGUI_Clipping_Panel_Uniform : MonoBehaviour
{
    public Transform ParentAnchor           = null;
    private bool m_IsInit                   = false;

void Update()
    {
        if( m_IsInit == false )
        {
            m_IsInit                        = true;
            this.enabled                  = false;

//  make uniform
            MakeUniform();
        }
    }

//  make uniform
    void MakeUniform()
    {
        if( ParentAnchor == null )
            return;

//  create parent obj
        GameObject objParent                = new GameObject("Panel_Clipping_Parent");
        GameObject objParent_Root           = new GameObject("Panel_Clipping_Parent_ROOT");
        Transform parentObj                 = objParent.transform;
        Transform parentObj_Root            = objParent_Root.transform;
        if( parentObj == null )
            return;

//  root parent
        {
            parentObj_Root.parent           = transform;
            parentObj_Root.localPosition    = Vector3.zero;
            parentObj_Root.localRotation    = Quaternion.identity;
            parentObj_Root.localScale       = new Vector3(1,1,1);

parentObj_Root.parent           = transform.parent;
        }

//  set parent obj data
        {
            //  parentObj.parent                    = transform;
            parentObj.parent                = parentObj_Root;
            parentObj.localPosition         = Vector3.zero;
            parentObj.localRotation         = Quaternion.identity;
            parentObj.localScale            = new Vector3(1,1,1);
        }

//  change panel parent
        transform.parent                    = parentObj;

//  get scale
        Vector3 parentScale                 = ParentAnchor.localScale;
        Vector3 objScale                    = parentObj.transform.localScale;

//  change clip range for current screen
        UIPanel panelObj                    = gameObject.GetComponent<UIPanel>();
        if( panelObj != null )
        {
            Vector4 oldClipRange            = panelObj.clipRange;
            panelObj.clipRange              = new Vector4( oldClipRange.x, oldClipRange.y
                                                         , oldClipRange.z * ( parentScale.x / objScale.x )
                                                         , oldClipRange.w * ( parentScale.y / objScale.y ) );
        }

//  make uniform
        objScale.x                          = 1.0f / parentScale.x;
        objScale.y                          = 1.0f / parentScale.y;
        objScale.z                          = 1.0f / parentScale.z;

parentObj.transform.localScale      = objScale;
    }
}

UNITY3D使用NGUI制作自适应UI的总结的更多相关文章

  1. Unity3d 用NGUI制作做新手引导的思路

    一.先看下效果 Prefab结构 二.实现思路: 1.prefab上的Panel层级设置成较高 2.背景由5个UISprite拼接起来的,4个(L,R,U,D)当作遮罩,1个镂空(Hollow)当作点 ...

  2. NGUI 屏幕自适应

    雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表  现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...

  3. NGUI之自适应屏幕

     转载: 雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 ,原文链接   现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他 ...

  4. [Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果

    ---------------------------------------------------------------------------------------------------- ...

  5. 关于NGUI制作图集在低内存设备上的注意事项

    正在写一个游戏.由于2D且比较简单.打算用NGUI全权搞定,对,游戏内容也用NGUI. 想的很好,做的很爽.PC上跑起来happy. 天杀的诺基亚出了个手机叫lumia520,可用内存512M.单个程 ...

  6. 制作精灵(UI Sprite)

    怎样判断是否应该使用精灵 在一套UI中,精灵是一种非常常见的元件.当制作UI时,如果需要显示一张图片,需要先判断这个图片是否应该制作到图集里去,然后用精灵的方式去使用它,一般来说,可以遵循以下规律. ...

  7. Unity3D-深入剖析NGUI的游戏UI架构

    Unity3D-NGUI分析,使用NGUI做UI须要注意的几个要点在此我想罗列一下,对我在U3D上做UI的一些总结,最后解剖一下NGUI的源码.它是假设架构和运作的. 在此前我介绍了自己项目的架构方式 ...

  8. NGUI制作可滚动的文本框(摘,如有侵权,联系删除)

    NGUI制作可滚动的文本框 1.首先创建一个UI Root 2.选择UI Root右键 Create 选择Scoll View创建. 3.Scroll view的大小是可以调节的,调节为你需要的适当大 ...

  9. PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...

随机推荐

  1. 设置 MyEclipse 默认打开文件方式

         在web开发时,我们在打开JSP页面时,MyEclipse默认使用 Vistual 的方式打开.这种方式打开JSP页面时,很慢.在实际的开发过程中我们不想使用这种默认的方式打开JSP.设置如 ...

  2. 关于remote访问中的flex端配置问题

    刚刚开始使用blazeds可能会有个疑问.tomcat服务器是必须配置的吗?如果前台后台分开,怎么开发. 其实服务器不是必须配置的,配置了那个服务器,就会在“附加编译参数”加入这样一句: -servi ...

  3. UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)

    题意:求最少的线可以覆盖一个由0.1两种数字组成的图中所有的1. eg: 只需要两条线即可. 分析: 1.先为上述例子的行列标号 2.若图中数字为1,则代表该数字所在的行与列有关联. 例如第r1行第c ...

  4. 暑假集训(4)第一弹 -----递推(Hdu2039)

    题意梗概:fff团团员小A想退团了,不过要退团,他必须绘制出贤者法阵,以证明他有资格不受大fff之灵的监督 并退团,小A他现在要开始收集材料了,但是,他不清楚应该买多少份材料. 虽然你并不想帮他退团, ...

  5. excl剔除不合格数据求平均值

    excl剔除不合格数据求平均值 trimmean函数 正态分布: CONFIDENCE.NORM 函数

  6. OpenJudge 2721 忽略大小写比较字符串大小

    1.Link: http://bailian.openjudge.cn/practice/2721/ 2.Content: 总时间限制: 1000ms 内存限制: 65536kB 描述 一般我们用st ...

  7. DCL_数据库控制语言

    DCL(Data Control Language)              -------是数据库控制语言.是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等) ...

  8. 第六章 Qt布局管理器Layout

    第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...

  9. ListView练习

    1. 在 .xml中创建一个ListView是不会显示出来的. 2. ListView的Item: 列表项, 3. 显示ListView的4个要素: 3.1 ListView控件:在layout布局中 ...

  10. phpcmsv9全站搜索,不限模型

    简单修改一下v9默认的搜索功能,可以不按模型搜索全站内容 下面是被修改后的search模块中的index.php文件 <?php defined('IN_PHPCMS') or exit('No ...