怎样处理ngui Panel多层次事件响应异常的问题,我也不是很熟,就给大家分享一下别人的文章。
在使用NGUI的panel时,当两次Panel重叠时,当点击前面面板,后面版面按钮可能会被响应。这是因为NGUI将UI控件都当做3D世界中的物体来做碰撞体,当做射线碰撞时,才通过UICamera响应响应的事件,但是由于Panel没有碰撞体,则射线直接穿过,碰撞到后面的Button(自带box collider)上,因此,出现这种响应异常。刚刚学习NGUI,发现有此问题,不知道NGUI是否已经提供解决方法,有了解的大大请帮忙指点,这里暂时自己弄了个临时方法来避免这种情况发生。
1.在NGUITools中添加如下方法:
- //add for reCalculate collider bounds referenece AddWidgetCollider
- static public void RecalculateColliderBounds(GameObject go)
- {
- if (go != null)
- {
- BoxCollider box = go.GetComponent<Collider>() as BoxCollider;
- if(box==null)
- return;
- int depth = NGUITools.CalculateNextDepth(go);
- Bounds b = NGUIMath.CalculateRelativeWidgetBounds(go.transform);
- box.isTrigger = true;
- box.center = b.center + Vector3.back * (depth * 0.25f);
- box.size = new Vector3(b.size.x, b.size.y, 0f);
- }
- }
- //remove collider from widget
- static public void RemoveColliderFromWidget(GameObject go)
- {
- if(go!=null)
- {
- BoxCollider box = go.GetComponent<Collider>() as BoxCollider;
- if(box==null)
- return ;
- if (Application.isPlaying)
- GameObject.Destroy(box);
- else
- GameObject.DestroyImmediate(box);
- }
- }
这个方法主要参照AddWidgetCollide方法,RecalculateColliderBounds方法主要完成对添加box collider的panel,重新计算其下子控件所组成的一个外围区域。RemoveColliderFromWidget方法提供给编辑器器一个手动设置Panel是否是collider的机会。
2.在UIPanel中添加如下代码:- //whether this panel is collider panel
- public bool isColliderPanel=false;
- public bool IsColliderPanel{
- get{ return isColliderPanel;}
- set{
- this.isColliderPanel=value;
- if(this.isColliderPanel)
- {
- NGUITools.AddWidgetCollider(this.gameObject);
- }else
- {
- NGUITools.RemoveColliderFromWidget(this.gameObject);
- }
- }
- }
在void LateUpdate ()函数最后添加NGUITools.RecalculateColliderBounds(this.gameObject);随时更新collider外围方块区域。
3.在UIPanelInspector中OnInspectorGUI ()函数最后添加编辑器选项:- GUILayout.BeginHorizontal();
- bool isColliderPanel = EditorGUILayout.Toggle("Is Collider", panel.IsColliderPanel, GUILayout.Width(100f));
- GUILayout.Label("whether the panel need collider");
- GUILayout.EndHorizontal();
- if (panel.IsColliderPanel != isColliderPanel)
- {
- panel.IsColliderPanel = isColliderPanel;
- EditorUtility.SetDirty(panel);
- }
NGUI-解决Panel多层次事件响应异常。