Unity UGUI 代码改变遮挡层级

UGUI在Screen Space - Overlay渲染模式下,由于不依赖摄像机渲染,使得其无法通过修改Z轴的方式修改物体间的层级关系,以下是解决方案:


我创建了一个空的工程,然后创建了一个Image,然后复制成了一样大小的四份 为了便于分辨,设置为不同的颜色,改变他们的位置,使之相互交叉遮挡

根据运行结果看,每当点击一个图片,它在Hierarchy视图中的顺序会被改变,而且在场景中会被放置到最顶层

代码很简单,只有几行,如下,每个图片上都挂上去,就出现上图的效果。


using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;

public class ChangeHierarchyOnCode : MonoBehaviour, IPointerClickHandler
{
    void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
    {
        transform.SetAsLastSibling();
        // transform.SetAsFirstSibling();
        // transform.SetSiblingIndex(2);
    }
}


然后代码改成这样:


using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;

public class ChangeHierarchyOnCode : MonoBehaviour, IPointerClickHandler
{
    void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
    {
        // transform.SetAsLastSibling();
        transform.SetAsFirstSibling();
        // transform.SetSiblingIndex(2);
    }
}


运行结果:


运行结果显示,每当点击了一张图片,该图片会被放置到最底层,以至于被其他物体遮挡,


代码中注释掉的transform.SetSiblingIndex(2);已经能够猜出其功能,它会使被点击的物体放置在指定的层级中,

该层级从0开始

越接近0的层级,被更多的物体遮挡,当层级为0时,其效果与transform.SetAsFirstSibling();相同

但是当层级小于0时,其效果与SetAsLastSibling一致

越大的层级,被更少物体遮挡,当层级为大于等于transform.parent.childCount - 1时,其效果与SetAsLastSibling一致


由此我们可以进行这样的猜测(注意:只是猜测):

每个Transform组件,内部保存了一个子物体列表,每当渲染时,从该列表最开始到最末尾依次渲染,于是,如果有遮挡,则后面渲染的物体遮挡住先前渲染的物体。


所以,transform.SetAsLastSibling/transform.SetAsFirstSibling/transform.SetSiblingIndex三个函数灵活使用,就可以在代码中动态的修改图片之间的遮挡关系


  • 22
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用Unity UGUI创建可滚动列表的示例代码: ```csharp using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; public class MyList : MonoBehaviour { public GameObject listItemPrefab; public Transform contentPanel; public ScrollRect scrollRect; private List<GameObject> listItems = new List<GameObject>(); void Start() { // 创建列表项 for (int i = 0; i < 20; i++) { GameObject listItem = Instantiate(listItemPrefab) as GameObject; listItem.transform.SetParent(contentPanel, false); listItem.GetComponent<Text>().text = "Item " + i; listItems.Add(listItem); } // 计算内容面大小并设置ScrollRect GridLayoutGroup gridLayout = contentPanel.GetComponent<GridLayoutGroup>(); float cellSize = gridLayout.cellSize.y + gridLayout.spacing.y; float spacing = gridLayout.padding.top + gridLayout.padding.bottom + gridLayout.spacing.y; int rowCount = Mathf.CeilToInt(listItems.Count / (float)gridLayout.constraintCount); float height = rowCount * cellSize + spacing; contentPanel.GetComponent<RectTransform>().sizeDelta = new Vector2(0, height); } } ``` 这里使用了一个名为`listItemPrefab`的预制体作为列表项,`contentPanel`指向Scroll View的内容面,`scrollRect`则指向Scroll View本身。在`Start()`函数中,首先创建20个列表项并加入到`listItems`列表中,然后根据GridLayoutGroup的设置计算内容面的大小,并将其设置为`contentPanel`的大小,最后将`contentPanel`的高度设置为计算出的高度。这样,在运行时,就可以在Scroll View中看到可滚动的列表了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值