UNITY3D使用NGUI制作自适应UI的总结
原地址: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的总结的更多相关文章
- Unity3d 用NGUI制作做新手引导的思路
一.先看下效果 Prefab结构 二.实现思路: 1.prefab上的Panel层级设置成较高 2.背景由5个UISprite拼接起来的,4个(L,R,U,D)当作遮罩,1个镂空(Hollow)当作点 ...
- NGUI 屏幕自适应
雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...
- NGUI之自适应屏幕
转载: 雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 ,原文链接 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他 ...
- [Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果
---------------------------------------------------------------------------------------------------- ...
- 关于NGUI制作图集在低内存设备上的注意事项
正在写一个游戏.由于2D且比较简单.打算用NGUI全权搞定,对,游戏内容也用NGUI. 想的很好,做的很爽.PC上跑起来happy. 天杀的诺基亚出了个手机叫lumia520,可用内存512M.单个程 ...
- 制作精灵(UI Sprite)
怎样判断是否应该使用精灵 在一套UI中,精灵是一种非常常见的元件.当制作UI时,如果需要显示一张图片,需要先判断这个图片是否应该制作到图集里去,然后用精灵的方式去使用它,一般来说,可以遵循以下规律. ...
- Unity3D-深入剖析NGUI的游戏UI架构
Unity3D-NGUI分析,使用NGUI做UI须要注意的几个要点在此我想罗列一下,对我在U3D上做UI的一些总结,最后解剖一下NGUI的源码.它是假设架构和运作的. 在此前我介绍了自己项目的架构方式 ...
- NGUI制作可滚动的文本框(摘,如有侵权,联系删除)
NGUI制作可滚动的文本框 1.首先创建一个UI Root 2.选择UI Root右键 Create 选择Scoll View创建. 3.Scroll view的大小是可以调节的,调节为你需要的适当大 ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
随机推荐
- javaweb 乱码总结
可能的错误地方: 1.jsp页面编码 2.表单编码 3.servlet可接受编码 4.tomcat中server.xml文件中的指定编码 所有的编码要统一,一般使用“UTF-8”比较好 我最近一次出错 ...
- php对UTF8字体串进行单字分割返回数组
在网上查了很多字符串分割方法,都无法正确对UTF8字符串进行正确分割返回单个字符的数组.经过对FTU8编码的分析写出了下面的方法对UTF8进行分割.本人测试可用.本方法只支持UTF8编码的,其它编码转 ...
- UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明
一.UIPickerView 1.UIPickerView的常见属性 // 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id< ...
- Objective-C 【动态类型检测&响应方法】
------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...
- C#中子类调用父类的实现方法
这篇文章主要介绍了C#中子类调用父类的实现方法,通过实例逐步分析了类中初始化构造函数的执行顺序问题,有助于加深对C#面向对象程序设计的理解,需要的朋友可以参考下 本文实例讲述了C#中实现子类调 ...
- NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与 ...
- 关于delete
上面三图在debug下,delete的时候会以fe ee覆盖指针所指向要回收内存前后较大一块区域的值. 下图对于release下delete的时候会先用fe ee覆盖指针所指位置起6*4=24字节, ...
- JDK中工具类的使用
JDK中内置了很多常用的工具类,且多以“s”结尾,如:集合工具类Collections,数组工具类Arrays,对象工具类Objects,文件工具类Files,路径工具类Paths,数学工具类Math ...
- IE6下window.location.href不跳转到相应url
前天一同事遇到个看似很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url ...
- Swift - 手势识别
override func viewDidLoad() { super.viewDidLoad() var swipeRight = UISwipeGestureRecognizer(target: ...