NGUI在Unity中因更改窗口区域而出现Bug的处理

最近,在Unity5.0.1中遇到了NGUI中的一些BUG问题,比如,你用NGUI开发进行拖拽Sprite

的功能,或者在一些Lable上使用了dynamic font, 然后把它编译成可在PC上运行的exe可执行

文件 (记得 Player Settings的Resolution中勾上Resizealbe Window),  当它运行时,这时你就

会发现问题来了,比如打开时是720*480大小的窗口区域,然后你通过拖拽窗口边界,或者直接

进行窗口最大化放大,这时你会发现UI Root中的Sprite仍然只能在720*480的大小区域中拖动,

而dynamic font也会因为放大而失真,如图:

(这里图片缩小了,dynamic font失真的效果可能看不大出来,原来的字体比这里的更清晰,

另外,那张拖拽的Sprite角色图片已经到达边界了,处在720*480右下角位置)

我试了一下,这个问题在4.6.4中也存在,但这绝不是我个人的问题!!为什么这么说呢?因为这个问题即便是

在NGUI的example11示例中也存在!!后来我去Unity官方重新下了个4.5.5的版本,突然奇迹的发现,NGUI这个

问题消失了,所以我推测,自从UGUI出现后,Unity对NGUI的支持就不好了,所以除非你对NGUI了解到了能随意

修改源代码的地步,否则最好不要在4.6.x以上的版本中使用NGUI 。(其实我从使用NGUI到现在只有3天)

(PS: 我用的NGUI是最新的3.8.2版本,3.6.8也试过,情况没有改变)

好了,现在知道BUG出现的原因了,但是我的项目使用的是Unity5.0.1, 而且我已经使用了NGUI才发现了这个BUG

的存在,那么是否有办法在Unity中友好的解决这个问题呢?答案是肯定的。

但我本身对NGUI还不是很了解,而且我看过部分的源代码,发现要去彻底的熟悉并去修改它的底层代码还需要一些

时间,且有一定难度,所以我选择了第二条路,直接从高层修改,将变化响应到NGUI,那么具体该怎么做呢?很简单,

只要把我写的这个C#脚本挂到UI Root 上就行了,下面是脚本的内容:

using UnityEngine;
using System.Collections;

public class Screen_Adapt : MonoBehaviour {
    UIPanel panel;
    Vector2 screen;
    float alphaDelta = 0.001f;

	// Use this for initialization
	void Start () {
        panel = GetComponent<UIPanel>();
        screen = new Vector2(Screen.width, Screen.height);
	}

	// Update is called once per frame
	void Update () {
        bool scrSizeChanged = screen.x != Screen.width || screen.y != Screen.height;
        if (scrSizeChanged)
        {
            //设置分辨率来通知NGUI更新拖拽区域
            Screen.SetResolution(Screen.width, Screen.height, false);
            screen = new Vector2(Screen.width, Screen.height);

            /*
             * 如果设置为同样的值,NGUI会考虑到效率,所以不会重新设置,
             * 所以用delta来设置看不见的微小改变
             */
            alphaDelta = -alphaDelta;
            panel.alpha += alphaDelta;
        }

	}
}

我们只要在屏幕区域大小改变时,显示调用一次同样窗口区域大小的setResolution()函数就能将

更新的窗口拖拽区域同步到NGUI了,同理,我们更改一次微小变化的panel.alpah值,就能让NGUI

来帮助你更新出失真的dynamic font了,如此一来,便能很好的解决这个问题了,而且性能开销也

很小,所以遇到这个问题的朋友可以借鉴一下。

时间: 2024-10-05 07:20:38

NGUI在Unity中因更改窗口区域而出现Bug的处理的相关文章

关于Unity中的NGUI和UGUI

用Unity开发2D游戏,有三套关系 1.GUI:Unity本身的对象 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后,Unity找到NGUI的作者,开发了UGUI,变成内置于Unity中的包,官方主推 所有的元素都在Unity的UI工具栏 3D做2D游戏的方法: 1: 使用正交摄像机;2: 使用透视摄像机,将2D元素移动到合适的距离. 例如设计分辨率为 960x640, 得到在3D世界里面一个图片的大小w*h米,将这个图片移动到一定的距

将Unity中的世界坐标转换成NGUI中的坐标

将Unity中的世界坐标转换成NGUI中的坐标,比如可用于自制血条等.代码如下: 1 using UnityEngine; 2 using System.Collections; 3 public class Healthbar : MonoBehaviour { 4 public GameObject TargetObject; //目标物体.这里是指Cube 5 public Camera worldcamera; //世界相机. 6 public Camera guiCamera; //U

Unity Game窗口中还原Scene窗口摄像机操作 强化版

之前写的那个版本看来真的是不行啊.最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说.借鉴了一下,写出来了一个新的比较完美的控制. 之前我们的操作是通过鼠标输入的开始坐标和转动坐标.其实官方有一个函数~ 1 float yRot = Input.GetAxis("Mouse X"); 2 float xRot = Input.GetAxis("Mouse Y"); 这就分别能获取到鼠标的X轴操作和Y轴操作了. 那为什么用yRot获取X轴,xRot获取Y轴呢?

NGUI研究院之在Unity中使用贝塞尔曲线(六)[转]

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到的被塞尔曲线是在平面中完成的,其实贝塞尔曲线是完全支持3D

NGUI研究之在Unity中使用贝塞尔曲线

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么我迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点.上一章分享了开发项目的一些使用心得比较细节对新手很有用可以看下. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到

Unity中对SQL数据库的操作

在Unity中,我们有时候需要连接数据库来达到数据的读取与储存.而在.NET平台下,ADO.NET为我们提供了公开数据访问服务的类.客户端应用程序可以使用ADO.NET来连接到数据源,并查询,添加,删除和更新所包含的数据. 对于ADO.NET,需要了解到Connection,Command,DataReader,DataAdapter,DataSet这几个对象,他们是操作数据库的重要对象.下面简要得介绍下这几个对象的作用以及功能(以SQL为例). 1.Connection:它是建立应用程序与数据

Unity中2D和UGUI图集的理解与使用

图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢?准确的说法图集是一张包含了多个小图的大图和一份记录了每个小图id.位置.尺寸等数据的数据文件,一个图集应该对应两个文件,当然也有人把数据集成到图片中,导致看起来只有一张图片(参考自DragonBones的做法). 为什么要用图集? 在GPU已经成为PC.手机等设备的必备组件的现在,把所有显示的绘制操

Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交:一些光线被物体吸收了,而另一些光线被散射到其他方向. 最后,摄像机吸收了一些光,产生了一张图像. 在光学中,我们使用辐照度来量化光.对于平行光来说,它的辐照度可通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到.在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和l不垂直的,我们可以

第五章 Unity中的基础光照(2)

目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发光 在标准光照模型中,环境光和自发光的计算是最简单的. 在Unity中,场景中的环境光可以在Window->Lighting->Ambient Source/Ambient Intensity中控制,如下图所示.在Shader中,我们只需要通过Unity的内置变量UNITY_LIGHTMODEL_