Unity的UGUI调节层次而不影响位置

Hello,我是 KitStar。

早在之前就写了这个文章,但是之前样式太难看了。而且现在有了扩充。所以,从新整理,再使用MarkDown 来写。

哦,对了,在这里推销一下自己QQ讨论组 ( ̄o ̄) . z Z559666429。大家有问题什么的可以一起交流。


一:只调节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 是什么的问题。这样知道逻辑就行。

  1. 比如每个玩家通过击杀人数来排行,击杀越大,排位越在前,最多的,你的头像还有名字,和其他信息,就会在排行榜的最顶端。
  2. 现在,玩家击杀人数改变。需要更新排行。那么,得到所以用户的击杀信息以及对应的UI排行何中的引用。
  3. 先重新定义一个用户数组,然后把所以用户信息拷贝到里面。
  4. 对这个数据 以 用户的 击杀人数来 排序。
  5. 然后根据排序的顺序,从新设置每个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的上下顺序发生变化。
    }

其实,我老感觉这个方式不妥。但是不知道还是否有其他方法。如果你有的话,希望交流学习。

猜你喜欢

转载自blog.csdn.net/kitok/article/details/78728205