使用NGUI,通过更改父物体的scale来适配屏幕时,如果子panel使用softclip,子panel会出现错误:clipped panels must have a uniform scale, 出错原因是子panel的scale的x,y,z不一致,因此解决方法就是把panel物体的transform的scale的xyz换算成(1,1,1),通过改变所有子物体的,但改变后为了裁剪会出问题,因此通过修改panel 的clipping下面的offset, center, size值。
先讲一下NGUI的适配:UIRoot的ScallingStyle设置为FixedSize,
ManualHeight 设置为480, 我按800*480制作UI资源

设置完成后,NGUI会按照 screenHeight/480.0f 对UI进行高度适配,由于大部分手机厂商制作的机型宽高比不一致, 因此待NGUI完成适配后,我们需要针对宽做二次适配,屏幕适配的代码如下

public class MyWidgetScale : MonoBehaviour {static bool g_bInit = true;public static float g_fAdaptedX;void Awake (){if (g_bInit){float ration1 = 800f / 480f;float ration2 = Screen.width * 1.0f / Screen.height;g_fAdaptedX = ration2 / ration1;g_bInit = false;}transform.localScale = new Vector3(g_fAdaptedX, 1, 1);}
}

由于上边的适配导致子panel的scale不一致了,因此调整子panel的scale和裁剪区域
基本讲清楚了,下边是代码部分:
子panel没有scrollview

public class AdjustSubPanel : MonoBehaviour {void Start () {float baseScale = 1;if(Screen.width > Screen.height){baseScale = transform.lossyScale.x;}else{baseScale = transform.lossyScale.y;}transform.localScale = new Vector3(baseScale / transform.lossyScale.x, baseScale / transform.lossyScale.y,baseScale / transform.lossyScale.z);UIPanel panel = transform.GetComponent<UIPanel>();panel.baseClipRegion = new Vector4(panel.baseClipRegion.x / transform.localScale.x, panel.baseClipRegion.y / transform.localScale.y, panel.baseClipRegion.z / transform.localScale.x, panel.baseClipRegion.w / transform.localScale.y);panel.clipOffset = new Vector2(panel.clipOffset.x / transform.localScale.x, panel.clipOffset.y / transform.localScale.y);for (int i = 0; i < transform.childCount; i++){transform.GetChild(i).localScale = new Vector3(1 / transform.localScale.x, 1 / transform.localScale.y, 1 / transform.localScale.z);}}
}

子panel上挂在scrollview时

关于localScale和lossyScale的注解:
当GameObject对象A为GameObject对象B的父物体时,父物体A的各个分量放缩值x、y、z的大小应该保持1:1:1的比例,否则当子物体B的Rotation值比例不为1:1:1时,B物体将会发生变形。
设GameObject对象A为B的父物体,当A物体各个分量的放缩值保持1:1:1的比例时,子物体B的lossyScale返回值即为B物体相对世界坐标系的放缩值,关系为B.localScale = B.lossyScale/A.localScale。


public class AdjustSubPanelWithScrollView : MonoBehaviour {  void Start(){UIScrollView scrollView = transform.GetComponent<UIScrollView>();float baseScale = 1;if (scrollView.movement == UIScrollView.Movement.Vertical){baseScale = transform.lossyScale.y;}else if (scrollView.movement == UIScrollView.Movement.Horizontal){baseScale = transform.lossyScale.x;}else{Debug.LogError("Unsupported UIScrollView Movement");return;}Debug.Log(baseScale);transform.localScale = new Vector3(baseScale / transform.lossyScale.x, baseScale / transform.lossyScale.y, baseScale / transform.lossyScale.z);UIPanel panel = transform.GetComponent<UIPanel>();panel.baseClipRegion = new Vector4(panel.baseClipRegion.x / transform.localScale.x, panel.baseClipRegion.y / transform.localScale.y, panel.baseClipRegion.z / transform.localScale.x, panel.baseClipRegion.w / transform.localScale.y);panel.clipOffset = new Vector2(panel.clipOffset.x / transform.localScale.x, panel.clipOffset.y / transform.localScale.y);for (int i = 0; i < transform.childCount; i++){transform.GetChild(i).localScale = new Vector3(1 / transform.localScale.x, 1 / transform.localScale.y, 1 / transform.localScale.z);}}
}

NGUI_Panel(clipped panels must have a uniform scale)相关推荐

  1. Unity使用UIStretch做屏幕自适应遇到clipped panels must have a uniform scale

    clipped panels must have a uniform scale,or clipping won't work properly! Unity如果还在使用UIStretch做屏幕自适应 ...

  2. css动画(transition,translate,rotate,scale)

    序言 为什么会用css动画呢 通过CSS3过渡,我们可以在不使用 Flash 动画或 JavaScript 的情况下, 使元素从一种样式变换为另一种样式时为元素添加效果. css动画可以做很多特效,特 ...

  3. C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)

    1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...

  4. C++11 统一初始化(Uniform Initialization)

    1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...

  5. 机器学习中的数学——常用概率分布(四):均匀分布(Uniform分布)

    分类目录:<机器学习中的数学>总目录 相关文章: · 常用概率分布(一):伯努利分布(Bernoulli分布) · 常用概率分布(二):范畴分布(Multinoulli分布) · 常用概率 ...

  6. R语言使用runif函数生成符合均匀分布的随机数、使用plot函数可视化符合均匀分布的随机数(Uniform Distribution)

    R语言使用runif函数生成符合均匀分布的随机数.使用plot函数可视化符合均匀分布的随机数(Uniform Distribution) 目录

  7. R语言使用punif函数生成均匀分布累积分布函数数据、使用plot函数可视化均匀分布累积分布函数数据(Uniform Distribution)

    R语言使用punif函数生成均匀分布累积分布函数数据.使用plot函数可视化均匀分布累积分布函数数据(Uniform Distribution) 目录

  8. Avoiding 16 Common OpenGL Pitfalls(避免 16 个常见的 OpenGL 陷阱)

    前言 避免 16 个常见的 OpenGL 陷阱原文 Avoiding 16 Common OpenGL Pitfalls Copyright 1998, 1999 by Mark J. Kilgard ...

  9. 机器学习数据预处理之缺失值:预测填充(回归模型填充、分类模型填充)

    机器学习数据预处理之缺失值:预测填充(回归模型填充.分类模型填充) garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题 ...

最新文章

  1. 发文平台对文章发布的基本要求
  2. HTML前端常见攻击方式案例讲解
  3. java 利用JAX-RS快速开发RESTful 服务
  4. 使用Boxfuse轻松在云中运行Spring Boot应用程序
  5. leetcode 75
  6. BZOJ 1041 数学
  7. FLEX与JAVA不通讯错误与解决方法(转)
  8. 在Mac系统中如何使用App Cleaner Uninstaller Pro清理应用卸载残留?
  9. 模板题——图论相关(1)
  10. 传智播客 C/C++学习笔记 指针3 理解指针必须与内存四区相结合
  11. 《深入浅出WPF》c#WPF入门,快速上手
  12. php 模拟提交金数据,小程序提交表单到金数据实例
  13. 辣妈直升机视频号值得学习吗
  14. 华为(huawei)园区网的常规部署配置示例
  15. 前辈不是我,借他人事迹助暖通新人!
  16. 解决window聚焦图片不自动更新,没有“喜欢么”信息提示框问题
  17. 四则运算算法实现(java)
  18. 奶爸日记 - 祝你生日快乐
  19. 诺禾- tcp 网络效劳框架
  20. php读取mht,php解析mht文件转换成html的实例

热门文章

  1. MyBatis 配置 resultType
  2. odoo tree视图默认分组
  3. mapreduce单词统计
  4. Benihana 料理
  5. 基于YOLOv5+C3CBAM+CBAM注意力的海底生物[海参、海胆、扇贝、海星]检测识别分析系统
  6. 常见P2P协议之BitTorrent 分析
  7. 原生js实现常用的HTTP请求(GET、POST)
  8. plt.boxplot()函数绘制箱图、常用方法及含义详解
  9. 决策树分析例题经典案例_决策树原理及一个简单的小例子
  10. 整体二分求区间第k大模板(POJ 2104)