精华内容
下载资源
问答
  • Unity层级关系

    2021-07-02 21:03:23
    所有的渲染 遵循 Camera 、SortingLayer、OrderInLayer 3个优先级由高到低的渲染顺序。相同数值大的会后渲染。(类似刷油漆) UGUI中 ...层级由 Camera的Depth,SortingLayer,OrderInLayer决定 ...

    所有的渲染

    Camera 、SortingLayer、OrderInLayer 、RenderQueue 、ZDepth(距离摄像机的距离)决定渲染顺序。

    Camera depth:

    优先级永远最高,值小的最先进入渲染队列。

    SortingLayer和OrderInLayer

    SortingLayer和OrderInLayer优先级其次。SortingLayer值相同时会比较OrderInLayer。

    RenderQueue
    ZDepth

    总结

    如果物体的RenderQueue在2500的同一侧:
    Camera Depth > SortingLayer > OrderInLayer > RenderQueue > 距离相机z值
    如果物体的RenderQueueu在2500的不同侧:
    Camera Depth > RenderQueue > SortingLayer > OrderInLayer > 距离相机z值

    UGUI中

    一、相机渲染模式为Camera
    层级由 Camera的Depth,SortingLayer,OrderInLayer决定。此时UI的层级可以当做2D层级来处理。
    二、Canvas相机渲染模式为Override
    层级由Canvas的sortOrder决定。
    三、相机渲染模式为World时则按照3d物体处理。层级排序规则按照上述总结处理。

    展开全文
  • Unity层级

    2020-10-30 09:18:12
    层级还能用于设置物理碰撞关系层级顺序:Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的...

    层级: 层级是Unity中场景物体的一种属性。摄像机可以指明渲染层级以渲染场景中的部分物体。灯光可以指明照射层级以照亮部分物体(可以指定照亮某些层级的物体以显示阴影)。层级还能用于设置物理碰撞关系。

    层级顺序:Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会覆盖depth低的相机。比sorting layer再低一层的是sorting order。
    渲染关系的层级顺序:
    1 Camera
    在这里插入图片描述
    在这里插入图片描述
    2 sorting layer
    在这里插入图片描述
    3 sorting order
    在这里插入图片描述
    在这里插入图片描述
    如图 两个物体在同一层级 就通过Order in Layer确定层级高低 数字越大层级越高

    添加设置层级都在Inspector面板中操作

    展开全文
  • Unity层级面板

    千次阅读 2019-02-27 22:45:21
    Unity层级面板 入坑程序员也差不多一年有余了,但是一直没有养成写博客的良好习惯,这是不好滴,正好心血来潮,记录自己的一次学习心得,也供大家参考学习,大神请绕道走。 主要实现Unity中的Hierarchy层级面板...

    Unity层级面板

    入坑程序员也差不多一年有余了,但是一直没有养成写博客的良好习惯,这是不好滴,正好心血来潮,记录自己的一次学习心得,也供大家参考学习,大神请绕道走。

    完整功能请参考Demo案例。 下载地址


    ## 主要实现Unity中的Hierarchy层级面板功能

    在之前的一次开发中需要实现如上的功能,参考Unity的Hierarchy层级,也参考了网上一些道友的实现思路,已完成了功能模块的开发,现将功能模块提取出来记录,主要实现如下的一些功能:

    1. 给定对象自动生成层级对象(包含子物体)
    2. 自动刷新层级排序
    3. Ctrl多选,Shift多选
    4. 双击重命名选中对象
    5. 按下不放拖动改变层级关系
    6. 多选同时改变多个对象层级
      层级面板

    **生成层级对象** 按照给定对象的父子物体层级生成,根据子物体顺序对应生成子对象,并记录子物体深度作为在层级面板中的层级,再根据层级对应刷新显示,刷新时根据层级对应排序。
        private void GenerateHierarchy()
        {
            // 记录当前在所有层级中的起点
            currentCreatIndex = allHierarchyItems.Count;
            // 生成层级面板UI初始化
            for (int i = 0; i < currentGenerateDatas.Count; i++)
            {
                GameObject treeObj = Instantiate(hierarchyItem, ItemParent) as GameObject;
                treeObj.transform.name = currentGenerateDatas[i].nameID;
                treeObj.transform.localPosition = Vector3.zero;
                treeObj.transform.localScale = Vector3.one;
                treeObj.transform.localRotation = Quaternion.Euler(Vector3.zero);
    
                HierarchyItem tvi = treeObj.GetComponent<HierarchyItem>();
                tvi.GameObjID = currentGenerateDatas[i].gameObjID;
                tvi.NameID = currentGenerateDatas[i].nameID;
                tvi.ChildDeep = currentGenerateDatas[i].childDeep;
                tvi.hierarchyText.text = tvi.NameID;
                allHierarchyItems.Add(tvi);
    
                // 添加监听事件
                UIEventListener.Get(tvi.hierarchyButton).onPress += delegate (GameObject go, bool isPressed)
                {
                    OnClickSelect(treeObj, isPressed);
                };
                UIEventListener.Get(tvi.checkIdentical).onPress += delegate (GameObject go, bool isPressed)
                {
                    OnClickSelect(treeObj, isPressed);
                };
                UIEventListener.Get(tvi.unfoladButton).onClick += delegate (GameObject go)
                {
                    UnfoldButtonClick(tvi);
                };
            }
            // 设置层级
            for (int i = currentCreatIndex; i < allHierarchyItems.Count; i++)
            {
                HierarchyItem item = allHierarchyItems[i];
                // 根据TreeID设置树初始层级
                if (allHierarchyItems[i].ChildDeep == -1) 
                {
                    item.Hierarchy = 0;
                    item.HierarchyParent = null;
                }
                else
                {
                    HierarchyItem itemParent = allHierarchyItems[currentCreatIndex];
                    for (int j = currentCreatIndex; j < allHierarchyItems.Count; j++)
                    {
                        if (allHierarchyItems[i].GameObjID.transform.parent == allHierarchyItems[j].GameObjID.transform)
                        {
                            itemParent = allHierarchyItems[j];
                            break;
                        }
                    }
                    item.Hierarchy = itemParent.Hierarchy + 1;
                    item.HierarchyParent = itemParent;
                    itemParent.AddChildren(item);
                }
            }
            // 刷新资源树
            RefreshHierarchy();
        }
    

    **选择层级对象**

    点击选择对象,所有操作都在此处触发;
    按下鼠标时只为预选择状态,此时并没有真正选中对象,如果按下没有松开鼠标,则可以继续拖动选择要改变的层级,方可鼠标则改变对象层级;按下鼠标如果没有拖动,抬起鼠标则选中当前对象,多选的话就添加选择;如果两次点击选择对象相同,则可以重命名该对象。

    public void OnClickSelect(GameObject gameObj, bool isPressed)
        {
            if (isPressed)
            {
                isCanDragChangeUI = false;
                isCanCheckDrag = false;
    
                // 选择预处理
                HierarchyItem selectItem = gameObj.GetComponent<HierarchyItem>();
                // 如果是Shift多选 获取多选指针位置
                if (IsAnyShiftKeyPressed())
                {
                    ShiftPreSelection(selectItem);
                }
                else if (!IsAnyCtrlKeyPressed())
                {
                    // 此处是判断是否是多选拖动改变层级
                    if (!currentSelectItems.Contains(selectItem))
                    {
                        preSelectItems.Clear();
                        foreach (HierarchyItem tvi in currentSelectItems)
                        {
                            OnSelectionMarker(tvi, false);
                        }
                    }
                }
                // 设置标记信息
                OnSelectionMarker(selectItem, true);
                // 预选择对象
                if (!preSelectItems.Contains(selectItem))
                    preSelectItems.Add(selectItem);
    
                // 赋值操作对象
                _currentTargetItem = selectItem;
    
                isCanCheckDrag = true;
            }
            else
            {
                isCanCheckDrag = false;
    
                // 如果可以拖动改变层级
                if (isCanDragChangeUI)
                {
                    // 改变层级
                    ChangeHierarchy(TreeRankSort(preSelectItems), _rayTargetObj);
                    currentSelectItems = new List<HierarchyItem>(preSelectItems);
                    markerFrame.SetActive(false);
                    markerLine.SetActive(false);
                }
                else
                {
                    HierarchyItem tvi = _currentTargetItem;
                    // Ctrl多选
                    if (IsAnyCtrlKeyPressed())
                    {
                        if (currentSelectItems.Contains(tvi))
                        {
                            OnSelectionMarker(tvi, false);
                            currentSelectItems.Remove(tvi);
                        }
                        else
                            currentSelectItems.Add(tvi);
                    }
                    else // Shift多选
                    if (IsAnyShiftKeyPressed())
                    {
                        currentSelectItems.Clear();
                        if (startIndex != -1 && endIndex != -1)
                        {
                            for (int i = startIndex; i <= endIndex; i++)
                            {
                                currentSelectItems.Add(allHierarchyItems[i]);
                            }
                        }
                    }
                    else
                    {
                        currentSelectItems.Clear();
                        currentSelectItems.Add(tvi);
                    }
    
                    preSelectItems = new List<HierarchyItem>(currentSelectItems);
    
                    // 重命名
                    if (!IsAnyCtrlKeyPressed() && !IsAnyShiftKeyPressed())
                        ReNameItem(_currentTargetItem);
                }
            }
        }
    

    **改变对象层级关系**

    改变对象层级时先进行拖动范围检测,超过对象本身的范围才可以拖动改变,改变层级有两种方式,一是与目标对象同级,二是拖动到目标对象下一级。
    这里使用的时List插入排序,如果同时操作多个对象的话比较吃性能,项目已经搁置了,也懒得做优化了,不过如果哪位道友有更优解的话,欢迎评论。

    public void ChangeHierarchy(List<HierarchyItem> dragItems, GameObject targetObj)
        {
            if (dragItems.Count > 0 && targetObj)
            {
                // 获取组件
                HierarchyItem targetItem = targetObj.transform.parent.GetComponent<HierarchyItem>();
    
                if (targetItem)
                {
                    for (int i = 0; i < dragItems.Count; i++)
                    {
                        // 拖动对象不是目标对象本身或目标对象的子物体
                        if (dragItems[i] == targetItem || dragItems[i].GetAllDethChildItem(true).Contains(targetItem)) continue;
    
                        // 如果在资源树中有父物体 先从父物体中移除
                        if (dragItems[i].HierarchyParent)
                            dragItems[i].HierarchyParent.RemoveChildren(dragItems[i]);
    
                        // 将所有子物体先从链表中移除(否则会影响重新插入时的位置)
                        foreach (var tvi in dragItems[i].GetAllDethChildItem(true))
                            allHierarchyItems.Remove(tvi);
    
                        // 从所有资源树元素链表中移除当前元素 
                        allHierarchyItems.Remove(dragItems[i]);
    
                        // 拖动到同一层级
                        if (targetObj.tag == "CheckIdentical")
                        {
                            // 重新插入到拖动到的位置
                            allHierarchyItems.Insert(allHierarchyItems.IndexOf(targetItem), dragItems[i]);
    
                            // 设置资源树层级与拖动到的层级相同
                            dragItems[i].Hierarchy = targetItem.Hierarchy;
                            // 设置资源树父物体与拖动到的父物体相同
                            dragItems[i].HierarchyParent = targetItem.HierarchyParent;
    
                            // 从拖动到的位置添加到拖动到的对象的子物体
                            if (targetItem.HierarchyParent)
                                targetItem.HierarchyParent.InsertChildren(targetItem, dragItems[i]);
    
                            // 改变子物体
                            if (dragItems[i].GetChildrenCount() > 0)
                                ChangeChildHierarchy(dragItems[i]);
    
                            // 改变父物体
                            ChangeParent(dragItems[i], targetItem.HierarchyParent);
    
                        }
                        // 拖动到下一层级
                        else
                        {
                            // 重新插入到拖动到的位置
                            allHierarchyItems.Insert(GetInsertIndex(targetItem) + 1, dragItems[i]);
    
                            // 设置资源树层级到拖动到的对象的下一层级
                            dragItems[i].Hierarchy = targetItem.Hierarchy + 1;
                            // 设置资源树父物体为拖动到的对象
                            dragItems[i].HierarchyParent = targetItem;
    
                            // 将当前添加到拖动到的对象的子物体
                            targetItem.AddChildren(dragItems[i]);
    
                            // 改变子物体
                            if (dragItems[i].GetChildrenCount() > 0)
                                ChangeChildHierarchy(dragItems[i]);
    
                            // 改变物体父物体
                            dragItems[i].GameObjID.transform.parent = targetItem.GameObjID.transform;
                        }
                        // 设置选中标记信息
                        OnSelectionMarker(dragItems[i], true);
                    }
    
                    // 刷新资源树
                    RefreshHierarchy();
                }
            }
        }
    

    完整功能请参考Demo案例。 下载地址

    展开全文
  • unity-渲染层级关系Camera层级在同一Camera下,Sorting LayerOrder in Layer层级Layer层级小结 渲染主要是针对Game窗口下显示的内容,类似于画板,先画一层后画一层,后画的可以把之前的一层给覆盖掉。于是unity有...


    在这里插入图片描述
    渲染主要是针对Game窗口下显示的内容,类似于画板,先画一层后画一层,后画的可以把之前的一层给覆盖掉。于是unity有了渲染关系层级关系。

    Camera层级

    因为Game窗口是摄像机Camera的映射画面,所以Camera是高层的渲染结果。
    Camera的Depth

    比如:我只添加了两个摄像机,一个是场景自带的Main Camera和我又添加的Camera,我先把Camera禁用
    在这里插入图片描述
    这是Main Camera映射出来的Game场景,能够把我设置的场景完美的显示出来,此时的Main Camera的Depth是-1。
    在这里插入图片描述
    把添加的Camera启用后,Game窗口中没有任何物体,而camera的Depth层数是0,比Main Camera高,所以把原来的Main Camera的画面给覆盖掉了,导致没有画面。

    在同一Camera下,Sorting Layer

    前面的Camera适用于3D,2D场景,前面用的是3D项目做得实验,2D也一样,后面的几个适用于2D场景。因为这是关于图片的渲染,在3D中也有关于图片的运用,但主要学习2D中的渲染。(自认为的,可根据自己实际情况了解
    在这里插入图片描述
    这是新建的2D场景,所有物体都在Main Camera下面(同一摄像机的情况)
    此时所有的物体在Sorting Layer相同的情况下(全部都是Default),渲染层级关系是根据你的Hierarchy面板里面物体的顺序来比较的,比如:house是最后添加的,所以它的渲染层级最高,当它在其他物体 之前,都会把它覆盖掉,只显示house自己
    在这里插入图片描述
    这里就把后面的crate给覆盖掉了
    渲染层级改变就要改变两者的Sorting Layer了
    在这里插入图片描述
    house的没有发生改变,改变了crate的Sorting Layer,这个Sorting Layer可以自己进行添加层级命名
    在这里插入图片描述
    此时的渲染关系就按照Sorting Layer的顺序面板进行渲染,先渲染Default层,再渲染backGround层,也就是说backGround层把前面的Default覆盖掉了
    在这里插入图片描述
    于是这次不是house覆盖crate,而是变成crate覆盖house

    Order in Layer层级

    该层级主要是针对不想改变Sorting Layer层级同时达到自己想渲染先后的问题
    在这里插入图片描述
    再次把crate的Sorting Layer层级改成和house层级一样,house覆盖掉crate
    但是这次改变一下crate的Order in Layer层级
    在这里插入图片描述
    让crate的Order in Layer层级变成1,使得crate的渲染层级高于house
    所以就变成:
    在这里插入图片描述
    crate覆盖住house

    Layer层级

    在这里插入图片描述
    这里也是层级改变渲染关系,但是主要类似于场景物体的分类顺序
    在这里插入图片描述

    此时我让crate的Sorting Layer和Order in Layer跟house的一样,只改变crate的Layer变成Ground(Layer中也是原来只有5个,我的Ground是自己添加的,和上面的那个Sorting Layer添加方式一样)
    在这里插入图片描述
    但是并没有像自己预期的那样以为Ground的渲染层级大于Default使得覆盖house。所以Layer通常用来分类的,脚本中用到的Layer层级需要添加进行检测碰撞等等。

    小结

    搭建2D场景通常改变Sorting Layer和Order in Layer即可,在自己写脚本的或者一些情况下给物体分类加一些特有的Layer层级。

    展开全文
  • 决定Unity渲染关系层级顺序是: Camera.depth Sorting layer Order in layer Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth...
  • Unity渲染层级关系

    千次阅读 2018-01-24 11:35:33
    简单总结一下,决定Unity渲染关系层级顺序是: Camera //在不同的Camera中,渲染顺序由Depth决定,depth值越低,越先渲染,值越高, 越后渲染。 sorting layer //在相同的Camera...
  • Unity通过层级关系获取子物体

    千次阅读 2014-12-23 17:10:30
    获取模型相对于跟节点的层级目录,比如一个角色模型的手相对于角色根节点的层级关系,该方法返回的 为一个路径 // 一般做捡起武器,或者生成特效时,为了获取精准位置, //需要找到角色模型的子物体(手),通过...
  • Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会...
  • 如何实现粒子显示在UI上 1.将Canvas中的Render属性设置为Screen Space或者World Space 2.调整粒子位置 ...如果要调整粒子与Canvas下子物体的层级关系,为该子物体添加Canvas组件,勾选Override ...
  • Unity 之 UGUI Image 和 粒子特效显示层级关系调整
  • Unity中的几种层级关系优先级总结

    万次阅读 2018-03-07 23:30:45
    在项目中,我们经常需要处理显示对象的层级关系或规划层级结构,那么Unity中主要有哪些主要的层级关系及他们的优先级是怎么样的呢? Camera 首先是Camera,Camera的depth值越大的在上面,越小的在下面,比如场景...
  • 最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来。   Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在...
  • 最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来。 Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera...
  • Unity3d渲染层级关系小结

    千次阅读 2015-10-09 21:14:53
    最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来。 Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera...
  • Unity GUI(简称UGUI)中经常会用到粒子特效,但是默认粒子特效的层级在UI之下,通过设置粒子的渲染深度来达到UI层级和粒子层级嵌套

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,869
精华内容 1,147
关键字:

unity层级关系