游戏项目必须要与多个分辨率适配,使用NGUI的UIStretch在多个界面都是正常的,但在用下拉列表的遮罩效果的时候,发现出现了显示不正常的问题,然后在网上找了很多种方法都不太解决这个问题,还是自己弄了一天来解决了这个问题。
首先,这个问题的出现是因为Clip需要父类的缩放倍数为(1,1,1),但使用UIStretch适配分辨率会使得这倍数改变,所以就会出现显示不正常。
然后,我们就可以把列表另外拿出来,不放在有UIStretch这个组件的物体下面,但这个时候下拉列表就会不适配已经缩放过的界面,所以我们就要用代码控制他自己的遮罩区域,以及DragPanel的子物体的缩放了。
下面是我的代码,用来控制下拉panel自身的遮罩区域以及改变自身子物体的大小:
using UnityEngine;
using System.Collections;
public class NGUI_ClippingAdjustor : MonoBehaviour {
public GameObject stretch_obj; //拥有UIStretch组件的物体
public GameObject grid;//下拉panel的子物体grid
Vector3 stretch_scale = Vector3.zero;
UIPanel self_panel;
void Update(){
if(stretch_obj == null || stretch_scale == stretch_obj.transform.localScale)
return;
//设置项目的宽度
stretch_scale = stretch_obj.transform.localScale;
grid.transform.localScale = stretch_scale;
//设置显示区域的大小
self_panel = gameObject.GetComponent<UIPanel>();
Vector4 old_range = self_panel.clipRange;
self_panel.clipRange = new Vector4(old_range.x,old_range.y,
old_range.z * stretch_scale.x,old_range.w * stretch_scale.y);
}
}
然后,我的界面结构是这样的:
AchievePanel就是我的下拉Panel,而NotListPanel就是我的界面,他的属性为:
我自己的原适配的比例是480*800,所以那些参数就这样了,当然不同的分辨率就要改变了。
这样就可以适配啦~~~