您的位置:首页 > 移动开发 > Unity3D

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的上下顺序发生变化。
}


其实,我老感觉这个方式不妥。但是不知道还是否有其他方法。如果你有的话,希望交流学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: