草庐IT

【Unity】UI、3D物体、粒子间的复杂渲染层级关系

半夏水玉 2024-05-14 原文

在实际项目中,往往会遇到这样的需求:比如一个UI背景,背景上有粒子,粒子上可能又有个图片,然后在上面有个3D模型,然后模型上又有一个UI,UI上又有粒子,然后再上面又有一个粒子,比如鼠标点击产生的一个粒子之类的。。。
是不是感觉有点晕?如果用图来表示的话可能清晰一点,就是下面这样:

渲染的顺序就是:背景-》粒子1-》UI1-》3D物体-》UI2-》粒子2-》粒子3

在这里其实可以以3D物体作为一个分界线,把背景-》粒子1-》UI1分为一组,3D物体为一组,UI2-》粒子2-》粒子3为一组,因为粒子和UI可以都属于UI层,而3D物体如果不用RenderTexture的方法是很难融入到UI中的。
在这里,我们要明确Unity中渲染的优先级,大致为Camera的depth(值越大越靠后渲染)-》Sorting Layer(值越大越靠后渲染)-》Order In Layer(值越大越靠后渲染)-》RenderQueue(值越大越靠后渲染)

所以总的来说,一个大组比如UI和3D物体分别用Depth不同的Camera来渲染,Canvas之间用Sorting Layer区分,每个Canvas下的子物体由Order In Layer区分,如果不指定,则默认为Hierarchy面板中从上到下依次渲染(当然粒子和UI之间不行,因为这两个本质上来说不是一个渲染体系,只能说粒子能放到UI层而已)。

所以我们这里用3个Camera,第一个Camera渲染背景-》粒子1-》UI1这一层,第二个Camera渲染3DModel,第三个渲染UI2-》粒子2-》粒子3这一层(其实如果粒子3是最上层的话可以单独拿出来,这里为了简便就都放进去了)

这里注意,所有的Camera都要设置为Depth Only,这样才能看到UI,而且所有用来渲染UI的Camera都要设置Projection为Orthographic,这样UI就不会近大远小了。

首先我们需要添加两个层Model和UI2来放3D物体和第二层UI,这样才能分开渲染。(第一层UI偷懒就用原始UI层了)

然后首先新建一个ModelCamera专门来渲染3D物体,所以它的CullingMask只需要Model层就行了,这个Model层是我们新建的一个层,3D物体也必须属于这个层。如下所示:

然后我们再新建两个Camera来分别渲染两层UI,各司其职,所以它们的CullingMask中需要剔除Model层和另一个UI层


最后,3个Camera的渲染层级由Depth控制,从小到大,数值越小的越先渲染,数值越大的越靠后渲染,因此按照UI1Camera-》ModelCamera-》UI2Camera的顺序依次设置depth为0、1、2,当然其他递增的顺序也是可以的。



之后为每层UI都创建一个Canvas,每个Canvas都要设置为Screen Space-Camera,然后指定各自的相机。


这样一来三个组就能按照顺序渲染了。当然每个组下面还要细分,这时候就要用到Sorting Layer还有Order In Layer了。
首先是第一层,第一层大概就是要一个粒子夹在两个UI中间(这个也是Unity面试的常考问题),很简单,只要把它们放到一个Canvs(这个Canvas必须要用Camera渲染的才行)里面然后控制它们之间的Order In Layer就行了,越大的越往后渲染,也就是说背景-》粒子1-》UI1的Order In Layer按照从小到大的顺序填即可,这里要注意的是有些UI比如Image没有Sorting Order以及Order In Layer属性,那么就需要自己加个Canvas组件并勾选Override Soring然后就能填Order In Layer了,当然这种方法因为要加Canvas所以势必会增加Batches所以还是需要控制数量。粒子是不需要加Canvas的,只要在Render的Order In Layer这里改就行了。



Model层不用说了,毕竟完全是靠Camera的dpeth来控制渲染的,只需要把需要在这层渲染的3D物体都设置为Model层就行了。

最后是第二层UI,和第一层一样如法炮制,只需要控制UI和粒子的Order In Layer就行,唯一不用的要增加一层Sorting Layer,也就是级别要比Model和UI都要高(不过其实这个不加也无所谓,因为已经通过相机控制好渲染层级了,不过为了更清晰还是加了)



当然,如果说最上层的粒子是要覆盖在所有UI之上比如鼠标点击粒子或者花瓣粒子之类的可以单独拿出来,只要保证它的Sorting Layer和Order In Layer比其他的都要高就行了。

最后是整个系统的层级图以及最终的效果,可以看见白色粒子夹在灰色背景和红色图片之间,黄色的为3D物体,夹在红色图片和蓝色图片之间,在蓝色图片之上又是两个粒子,黑色粒子在最上面。

有关【Unity】UI、3D物体、粒子间的复杂渲染层级关系的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  10. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

随机推荐