Unity的UGUI调节层次而不影响位置
2017-12-06 11:06
381 查看
Hello,我是 KitStar。
早在之前就写了这个文章,但是之前样式太难看了。而且现在有了扩充。所以,从新整理,再使用MarkDown 来写。
哦,对了,在这里推销一下自己QQ讨论组 ( ̄o ̄) . z Z:559666429。大家有问题什么的可以一起交流。
一:只调节UI层次,不影响它所在Hierarchy视图中的位置关系。
最近在使用UNITY的UGUI的时候碰见一个尴尬的问题。我有几组图片,他们有同一个父级。父级有
Vertical Layout Group组件 用来统一整理子集所以图片的位置和大小状态。但是还想在不改变顺序的同时,想让指定的图可以覆盖在其他所以的图片上。
本来使用着RectTransform.SetSilblingIndex。倒是可以调节他在Hierarchy视图中的层次关系,这样渲染级别就不一样了,可是也同时调节了他的位置,位置就会更新,然后错乱。这不是想要的结果。
public void SetSiblingIndex(intindex);这是RectTransform.SetSilblingIndex的使用。
最后通过查找。发现可以通过Canvas来调节他们之间的深度。代码如下::
using UnityEngine; using System.Collections; using UnityEngine.UI; public class UGUIOrder : MonoBehaviour { public int order; public bool isUI = true; public void SetOrder( int order) { if (isUI) { Canvas canvas = GetComponent<Canvas>(); if (canvas == null) { canvas = gameObject.AddComponent<Canvas>(); } canvas.overrideSorting = true; // 重载排序 canvas.sortingOrder = order; //整理顺序 } else { Renderer[] renders = GetComponentsInChildren<Renderer>(); foreach (Renderer render in renders) { render.sortingOrder = order; } } } }
把这个脚本 拖在你要操作的所有图片上。脚本会给每个组件添加
Canvas组件。用来调节自身在UI中的显示等级,以达到层级不同显示的效果!
二:那么想改变UI的在界面中的顺序,做类似 用户实时排行的话怎么解决呢?
里面代码是我自己项目代码中的一部分。观者不必在意像UserInfoMode是什么的问题。这样知道逻辑就行。
比如每个玩家通过击杀人数来排行,击杀越大,排位越在前,最多的,你的头像还有名字,和其他信息,就会在排行榜的最顶端。
现在,玩家击杀人数改变。需要更新排行。那么,得到所以用户的击杀信息以及对应的UI排行何中的引用。
先重新定义一个用户数组,然后把所以用户信息拷贝到里面。
对这个数据 以 用户的 击杀人数来 排序。
然后根据排序的顺序,从新设置每个UI的
SetSiblingIndex。Ok
代码吧:
void UpdateUseRanking() { UserInfoMode[] userObj = new UserInfoMode[m_playMode.Keys.Count]; m_playMode.Values.CopyTo(userObj = new UserInfoMode[m_playMode.Keys.Count], 0); //对用户进行由小到大的从新排序, for (int i = 0; i < m_playMode.Keys.Count; i++) { for(int j = i + 1; j < m_playMode.Keys.Count; j++) { if(userObj[i].GetKillNumber > userObj[j].GetKillNumber) //这里是更具用户击杀的人数来排序 { UserInfoMode mode; mode = userObj[i]; userObj[i] = userObj[j]; userObj[j] = mode; } } } //然后在遍历一边,根据他在数组中的顺序,进行 对相应的 SetSiblingIndex(k) 设置。 for (int k = 0; k < m_playMode.Keys.Count; k++) { userObj[ (m_playMode.Keys.Count - 1) - k].m_PlayPrototype.transform.SetSiblingIndex(k); if (k < icos.Length) { userObj[(m_playMode.Keys.Count - 1) - k].SetUserIcon(icos[k]); } else { userObj[(m_playMode.Keys.Count - 1) - k].SetUserIcon(icos[icos.Length - 1]); } } // 这样 就可以看到 Hierarchy视图中图片的位置发生改变。 而且 Game界面中 UI的上下顺序发生变化。 }
其实,我老感觉这个方式不妥。但是不知道还是否有其他方法。如果你有的话,希望交流学习。
相关文章推荐
- Unity的UGUI调节深度而不影响位置
- 【Unity】【Canvas】UGUI层次显示的问题
- unity UGUI text font size对性能影响较大
- Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标
- unity获取ugui上鼠标位置
- KING_Unity学习之UGUI_Canvas渲染顺序以及层次关系总结
- Unity UGUI鼠标点击UI不受影响方法IsPointerOverGameObject
- unity UGUI scrollview 置顶拖拽位置
- Unity 线性空间对ugui的影响
- KING_Unity学习之UGUI_Canvas渲染顺序以及层次关系总结
- unity中UGUI图片箭头指向鼠标位置
- 【Unity3D ugui】UI特效的位置自适应及调整层次关系的一种解决方案
- Win8.1关闭屏幕亮度自动调节不让其受光线影响
- UGUI实现UI精灵由小到大渐变效果——配合unity动画曲线
- Unity事件系统实现uGUI Button长按
- Unity中实现弹性滚动列表基于UGUI
- Unity物品栏拖拽物品移动交换物品所在物品栏位置
- unity 移动物体到指定位置的四种方法
- Unity ugui button自适应text大小
- Unity UGUI——提供可视功能的UI组件(Text)