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


一:只调节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的上下顺序发生变化。
    }

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



这里写图片描述

我是李本心明


首先谢谢大家的支持,其次如果你碰到什么其他问题的话,欢迎来 我自己的一个 讨论群559666429来(扫扫下面二维码或者点击群链接 Unity3D[ 交流] ),大家一起找答案,共同进步

由于工作生活太忙了,对于大家的帮助时间已经没有之前那么充裕了。如果有志同道合的朋友,可以接受无偿的帮助别人,可以加我QQ单独联系我,一块经营一下。

在这里插入图片描述


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值