介绍 Unity

教授世界创建所需的 Unity 概念。这里大多数内容都与 Unity 开发密切相关,而不是特定于 VRChat。

建模

这里有个视频

在本节课中,我们将学习如何搭起房间的几何外形!

准备工作

首先,请确保您已经关闭了屏幕右下角的 auto generate lighting(自动生成照明)。单击它,然后在新窗口底部找到 auto-generate(自动生成) 选项,并取消选中该框,最后关闭窗口即完成操作。

在使用 Probuilder 之前,我们需要配置一些设置。首先,点击 Edit>Preferences(编辑>偏好)。然后点击 Probuilder 选项卡。

以下是本人建议您更改为的默认设置,以方便接下来的操作:

完成设置后,您就可以关闭 Preferences(首选项)窗口。接下来通过点击 Tools>Probuilder>Probuilder Window(工具>Probuilder>Probuilder窗口)打开 Probuilder 窗口,Progrids 现在应该显示在左上角。

如果找不到 Progrids,您可以通过点击 Tools>Progrids>Progrids Window(工具>Progrids>Progrids窗口)来调出它。您可以像其他选项卡一样停靠 Probuilder 窗口。如果您更喜欢图标视图,您可以通过右键单击窗口然后选择 Icon mode(图标模式) Text mode(文本模式)进行切换。

创建 Probuilder 对象

创建“火柴盒”

准备就绪后,让我们开始创建第一个 Probuilder 对象吧!点击 new shape(新建形状),选择 cube(立方体),点击确认。现在您就可以看到一个立方体出现在了场景中!

点击 Probuilder 图标,您将会看到立方体上出现的顶点、边和面,这些是构成所有 3D 模型几何体的基本要素。您可以自由地移动、旋转、缩放它们,甚至将它们与其他 Probuilder 对象进行组合,创建更复杂的几何形状。

我们要搭建一个房间,首先就得创建一个地板。点击 new shape(新建形状),选择 plane(平面),将轴设置为向上,依次将长度设置为 6 米,宽度设置为 5 米,然后点击 build(构建)。将 transform(变换)重置到原点上。

接着将网格大小减小至约 0.125 米。使用快捷键 Ctrl+K 添加一个 cube(立方体)。进入 face mode(面模式)(快捷键为 K),选择一侧面,并将其缩小致使水平厚度达到 0.125 米,然后将立方体拖至长度与地板相同。通过查看 inspector(检查窗口)中的 Probuilder script(Probuilder 脚本)组件,您可以查看 Probuilder 对象的维度尺寸。房间的平均高度约为 2.4 米至 2.5 米,因此我们可以将立方体的高度设置为 2.5 米以便轻松对齐 Progrids

Ctrl+D 复制墙壁,并将其拖到平面的另一侧。重复上述步骤以创建平面的其余两面墙壁。最后再添加天花板以结束操作。

添加窗户

现在,您已经创建了一个盒子,但它看起来不太像一个正经的房间。您可以为其添加窗户以使房间变得更加真实。

选中一个墙壁,进入 edge select mode(边选择模式),再选择其中一个边,然后按 Alt+U 以添加循环边(edge loop)。这个操作将沿着您选择的边添加新的垂直循环边。

创建循环边后,您应该能看到创建出的循环边处于被选中状态,将它们拉到一边,重复此步骤,直到创建出三个切口。

接下来选择两个面(也就是接下来窗户的位置),按 backspace 删除它们(不要按 delete,它会删除掉整个对象!),选择一个被掏空了的环形边。按住 Shift 并使用 Gizmo 箭头挤出新的面来连接两个洞。

注意,这时的面实际上没有连接到彼此。为了解决这个问题,进入 vertex select mode(顶点选择模式)并按 Ctrl+A 选择网格的所有顶点,然后在 Probuilder 选项卡中单击 weld vertices(焊接顶点)。这将合并空间中处在相同位置的顶点,也被称为 overlapping vertices(重叠顶点)

为了添加窗户,我们需要再添加一个立方体,只需添加 loop cuts(循环切割)并向内挤出即可制作窗户。

在 Probuilder 选项卡中选择 vertex colors(顶点颜色)即可将面颜色设置为顶点颜色。这有助于我们分辨模型,并且可以选择稍后将这些顶点颜色设置为实际材质。

我们现在已经完成了房间的基本建模。在下一课中,我们将学习如何利用材质和纹理使模型表面更加生动丰富。

贴图与材质

既然我们已经有了模型,那现在也是时候为模型表面添加一些细节了。此类操作需要通过 materials(材质)实现,materials(材质)可以应用于模型的表面,并且可以将一个着色器,一个或多个纹理结合在一起。

 

创建 materials(材质)

要创建一个 materials(材质),请在项目选项卡中右键单击,然后选择 Create > Material。默认着色器是 Standard Shader(标准着色器),它是一种基于物理的着色器,也被称为 PBR 着色器

 

Post Processing(后处理)

在深入了解 PBR 着色器 之前,我们应该先在场景中设置 post processing(后处理)。此操作可以通过 VRWorldToolkit 轻松实现。在顶部菜单栏中点击 VRWorld Toolkit > Post Processing > Setup Post Processing,然后单击 OK 即可。默认设置应该是足够理想的,但如果您想进行更多的调整,我建议您首先阅读 Silent 的这篇指南

 

获取材质

您可以前往 ambientCG 网站寻找您喜欢的木地板纹理,记下它的大小尺寸(我们稍后会用到)。

请确保纹理尺寸为正比,因为非正方形纹理可能会需要更多的处理步骤,优化程度更低,压缩效果也不理想。

找到并下载 1K PNG 格式的纹理文件,然后进行解压缩。

接下来在 project(项目窗口)中创建一个名为 _materials 的新文件夹,将解压缩后的文件拖入创建好的 Unity 文件夹内进行导入即可。

 

PBR 着色器

本章节会是最深度涉及理论的课程,因为理解 PBR 着色器的工作原理是制作正确、美观的材质的必要条件。只使用一个 PBR 着色器便可以确保所有材料都应用一致的光照,就像现实生活中一样。PBR 基于真实的物理原理,所以要理解 PBR,您必须了解光在现实世界中如何与物体表面相互作用。

取色器(color picker)

当光线照射到表面时,一部分被反射,一部分被材料吸收。反射的光线使物体可见,而被吸收的波长则决定了表面的颜色。您可以通过点击 albedo(有时也称为 diffuse 或 base color)的 取色器(color picker)来设置基本颜色。

在 取色器(color picker)窗口中,红色、绿色和蓝色通道位于底部。上方则是取色器 UI,其中上下方向控制色值,左右方向控制饱和度,周围的轮盘则用于控制色调。然而,这种设置存在误导性,因为当您增加饱和度时,色值会随之减少。更令人困惑的是,色值减少的程度取决于色调,其中黄色是最亮的,蓝色是最暗的。此处视频 更详细地介绍了这个问题,需要时常注意。

specularity(镜面反射)参数

下一个参数是 specularity(镜面反射),它决定了光线在表面上的反射方式。100% specular(反射)的表面会将所有击中它的光线以相同角度进行反射。而另一个极端就是 diffuse reflection(漫反射),光线将会在材质随机内部反弹,然后反射至随机方向。

在 shader 展开栏中,您会看到一个标准(standard)着色器和一个标准光滑度(standard specular)着色器。这两种着色器对PBR的应用方式不同,因为金属和非金属(即电介质)之间有着截然不同的属性。电介质通常没有镜面反射成分,而金属通常没有漫反射成分。镜面反射工作流程给了艺术家更多的控制,但也允许创造在物理上不可能的材质。因此,(metallic workflow)金属工作流程通常更简单、更直观;在使用具有 specularity(镜面反射)贴图的材质时,建议使用(metallic workflow)金属工作流程

Smoothness(平滑度)参数

标准(standard)着色器 上还有另一个参数:smoothness(平滑度),此滑块控制反射的清晰度。许多材料,如许多金属,可能都具有很强的反射性,但反射仍然可能是模糊的。这由于表面上许多微小的缺陷造成,虽然肉眼看不见,但仍然影响光线的反射角度。

fresnel(菲涅耳)参数

PBR 的另一个关键组成部分是(fresnel)菲涅耳,它会自动应用;一个表面与光线所处角度越大反射得更多。此外,对于透明表面来说(如水在湖面上),视线在垂直于表面时 透射性 最大,在平行于表面时 反射性 最大。您可以在 spherical material previews(球形材质预览)中轻松看到菲涅耳效果。

地板材质实践

现在让我们将 albedo(反射率)纹理映射到材料的正确位置上。您可以看到纹理是如何平铺在表面上的,但如果我们引入一个2米高的胶囊作为玩家参考,木板看起来会显得太小。因此,为了获得正确的平铺比例,我们需要根据从纹理源网站获取的尺寸(单位:米),使用计算器计算出1除以这些尺寸的值,将其填入材料中的 X 和 Y 平铺参数,从而得到正确的比例。

diffuse(漫反射)/ albedo(反射率)贴图

在寻找纹理时,您会看到 diffuse(漫反射)albedo(反射率)两种类型的纹理,它们都应该被放入 Matreial(材料)的基础颜色通道。两者的区别在于:漫反射纹理包含了无方向性的阴影信息(例如由于裂缝而难以照射到的区域),而反射率纹理则将所有阴影信息移到 AO(环境光遮蔽)贴图中。这样做的好处是材料可以根据光照变化做出响应,例如在照射手电筒时也能正确呈现。

让我们将 AO(环境光遮蔽)贴图添加到 Matreial(材料)中。为了确保其正确显示,请在 Project(项目窗口)中选择纹理,并在Inspector(检查窗口)中取消勾选"sRGB(颜色纹理)"选项,因为 AO 贴图是灰度纹理。

Normal Map(法线贴图)

大多数表面都展现出细节,这些细节在几何层面难以很好地再现。这就是法线贴图的作用所在。将其放入适当的插槽中,单击"修复现在"按钮,您应该能看到材料呈现出更好的立体感。法线贴图通过改变每个纹理像素中光线反射的角度(也称为法线矢量)来实现这一效果。

法线贴图中的每个像素都表示一个向量,其中红色表示水平,绿色表示垂直,蓝色表示深度。法线贴图中的"默认"蓝紫色表示50%红色,50%绿色和100%蓝色,这表示相应表面照明角度没有变化。

Height Map(高度贴图)

Height Map(高度贴图)用于在 Matreial(材料)中模拟深度。这也应该设置为非 sRGB,与 AO 贴图类似。当我们应用它时,我们应该能看到材料发生变化,但可能看起来有些不太自然。这是因为Unity中使用了一种称为"视差映射"的技术来近似展现它们,但当以锐角观看时它会出现断裂。通常我也不将强度设置得很高,无论是默认的 0.02 还是更低。

 

Reflection(反射)

我们讨论了很多关于反射的内容。您可能注意到,木地板的反射看起来并不十分准确,反而像是反射了天空。这是因为物体的反射设置采用了默认的天空盒。要更改此设置,请在层次结构中右键单击反射探测器,并进入"照明">"反射探测器"菜单。

反射探测器本质上是一个 360 度相机,可以捕捉其周围的球形视图。得到的图像称为立方体贴图,用于物体的反射效果。

将反射探测器放置在房间的中央位置。在检查器窗口中的反射探测器组件下,应该有两个按钮。首先单击左侧的"边界"按钮,这将设定反射探测器影响的范围。而右侧的"探测器原点"按钮则用于设置反射探测器的捕捉位置。

窗户材质实践

现在让我们为窗户制作材质!创建一种新材质,将其命名为玻璃,并将其拖到窗户上。将渲染模式更改为透明,选择阿尔贝多颜色窗口,并在RGBA通道下减小A通道到0。A通道代表透明度,它控制透明度。现在将平滑度增加到最大。现在我们有了一个可以透过的窗户!请注意,如果您增加金属性或高光,透明度会降低。请记住,增加高光不仅会减少基色,还会降低透明度。

要理解的下一个重要概念是材料槽。每个多边形都分配有一个材料,材料槽是网格的一部分。当您单击对象时,可以在检查器窗口的底部看到分配的材料。

 

material slots(压缩纹理)

为了确保每个访问者能够顺利下载纹理文件,我们应当始终选择对纹理进行压缩。为了实现这一点,您可以在检查器中单击纹理文件,然后选中 crunch compression 选项。这样一来,您的纹理文件将会变得更小,虽然会有一些压缩失真(但并不会引起任何人的注意或关注)。接着,您可以点击 Android 图标,并选中“覆盖 Android 设置”。在格式选项下,选择 RGBA 压缩 ASTC 6x6 块(这种压缩算法可以确保我们的纹理在 Quest 上显示效果不会太糟糕。或者,您也可以选择 4x4 块来获得更好的压缩效果,不过文件大小会稍大一些)。此外,我们还需将两个平台上的最大纹理大小进行调整,这将最大程度地影响世界的下载大小。

除了上述设置外,还有一些其他的调整是我们应该进行的。在“高级”选项下,勾选 流式传输Mip地图(这是 VRChat 所必需的),将过滤器改为 三线性 ,并将 Aniso 级别调整为 8。接着,点击右上角的滑块图标跳转到检查器(即在问号气泡和三个垂直点之间的位置),以创建一个预设。这样一来,从现在开始导入的每个纹理都将遵循此预设的设置(除了从 UnityPackage 导入的纹理)。

此外,您还可以使用 VRWorldToolkit>Quick Functions>Mass Texture Importer,在其中一次性调整场景中的所有纹理。在世界构建完成后,您可以通过进入 VRWorld Toolkit>World Debugger>Build Report,查看所有资产按文件大小从大到小排列的报告,以便更清晰地了解世界中的各种纹理。

可惜的是,Unity 的标准着色器不支持直接插入粗糙度贴图。粗糙度贴图可以在材质中提供不同的平滑度,增加现实感(例如,在潮湿的道路上会有水坑,水坑会显得很光滑,而道路则不会)。Unity 仅支持将平滑度贴图(即光泽贴图的反面)作为金属或透明度纹理的 Alpha 通道。实现粗糙度贴图的方法有很多种:

image.png

这个木纹纹理就是一个很好的例子,展示了平滑度贴图在不同材质之间的差异;需要注意的是,钉子具有较高的光泽度和光滑度,而木材具有较少的光泽度和变化的中间光滑度,这与纹理的颗粒相匹配。

 

UV

在 UV 窗口和 UV 缝合方面,单击 ProBuilder 选项卡中的UV编辑器。UV坐标告诉网格如何将纹理投影到面上。在 UV 编辑方面,ProBuilder 会为您完成大部分工作,但最重要的是了解如何进行UV缝合。要执行此操作,请在打开 UV 窗口的情况下,单击场景视图中的某个面,然后按住 Shift 并单击另一个相邻面。通过这样的操作,UV 将缝合在一起,使纹理在面之间连续无缝。

现在您可以探索其他纹理来装饰房间,然后进入下一个阶段:照明!

光照

这里有视频

欢迎来到本教程系列的第四课,本章节将为我们的房间创建合适的照明!

在之前的课程中,我谈到了寻找参考照片来影响纹理选择的重要性。作为初学者,您不应该尝试创造自己的风格,而应该尝试模仿已被证明有效的风格。例如,在我的"海上世界"房间中,我研究了海滩房子的照片,找到了我喜欢的元素,然后试图将它们融入到自己的场景中。这些元素包括色彩调性、大量使用白色和灰色、一些黑色的装饰以及浅蓝和米色的组合。

在创建自己的房间时,最好避免混合不同风格,在开始阶段至少要保持一致。例如,不要让纽约式的内部砖墙与佛罗里达西班牙风格的建筑相冲突。选择一种风格,并专注于其中的有效元素,以营造出所需的空间氛围。在这个教程系列中,我将采用极简主义的斯堪的纳维亚公寓风格,因为对于我们正在打造的小房间来说更为适合。同时,由于其简洁性,这种风格在3D模型中也相对容易实现。

总之,查看参考图像来指导您的建模工作、纹理选择,以及我们将在本节课末讨论的照明方面。

在寻找参考图片时,建议使用一些图片浏览网站,如 PinterestHouzz(国内推荐 花瓣网)。这些网站能够轻松搜索类似的室内设计,并保存您喜欢的图片。Houzz的一个优点是,通常会有每个住宅的多张图片可供查看。当您浏览斯堪的纳维亚公寓风格时,请留意一些使这种风格独特的特点:极简主义、内部结构和物体的几何形状,以及场景中几乎没有颜色。这种分析只是触及视觉组成的表面

如果想要了解更多相关知识,推荐观看 Blender Guru 关于颜色、构图和照明的视频。

额外的软件,比如 PureRefAllusion,可以用来查看和浏览保存在计算机中的参考图像。

另外,还有一些特殊技巧可以帮助你轻松调整材料,使其更符合你的喜好。比如,我在textures.com(需要账户)上找到了一种常见的石膏纹理,但觉得有点暗。针对这种材质,由于基础纹理缺乏细节,我可以将基础纹理与颜色分离开来,选择自己喜欢的油漆颜色,同时保留其他PBR地图的细节。如果不希望材料看起来太粗糙,可以减小法线贴图的强度。最后,为了获得正确的平铺,你实际上不需要打开单独的计算器,因为可以在框内进行自助计算。

照明

现在让我们谈谈照明。照明与我们的材质选择相结合,影响着场景的视觉效果。我们要做的是创建 baked lighting(预烘焙照明);这个操作会在你的计算机上预先计算照明效果,避免在玩家计算机上的实时光照计算,从而提高性能和照明质量。这是通过计算所有 static objects(静态对象)的照明,并将阴影烘焙到 lightmap(光照贴图)中来实现的。至于动态对象(比如角色),可以通过使用光探头来进行照明。

首先,确保场景中的所有 static objects(静态对象)都在 Inspector(检查窗口)中被标记为 Static(静态)(或者至少是要使用烘焙照明的静态对象,以便告知 Unity 我们希望这些对象使用预烘焙照明)。

将场景中所有光源设置为 Baked(烘焙)

然后,点击右下角的 auto-generate lighting(自动生成照明)或通过 Window>Rendering>Lighting(窗口>渲染>照明)打开 lighting(照明)窗口。可能会出现一个浮动选项卡,但你可以将其停靠在你喜欢的位置。个人建议将其放在右侧检查器的同一空间,这样可以轻松在这两个选项卡之间切换。

在“实时照明”下,关闭实时全局照明。不会在这里详细展开这一话题,因为这是一个初学者教程系列。然而,除非您明确知晓相关操作,最好禁用这一功能。

在“混合照明”下,启用“烘焙全局照明”,并将“照明模式”设置为“烘焙间接”。这意味着我们不会为动态对象提供实时照明,但这也是我们所需要的,因为实时照明会对性能造成一定压力。

现在让我们讨论光照贴图的设置。首先是光照贴图器选项,建议将其改为渐进式GPU。目前,GPU光照贴图器仍处于预览阶段,尚未完全准备投入实际应用。如果您在使用过程中遇到错误或故障,可以切换至渐进式CPU。然而,为了更快的迭代速度,GPU光照贴图器比CPU版本更快。

关于光照贴图分辨率,建议在您自己的场景中进行可视化,而不仅仅是简单解释。在场景视图中,点击右上角的下拉菜单,选择“烘培光照贴图”。您将看到光照贴图中纹理元素的可视化。光照贴图器的作用是为每个纹理元素计算光照并将其作为像素放入光照贴图中。完成烘焙后,您将看到结果,便于更好地进行可视化。

光照贴图分辨率以texels/单位表示。通过向左或向右拖动以减小或增加数值,您可以看到场景中纹理元素数量的变化。这个数值基本上代表我们希望为对象提供多少光照分辨率。较高的分辨率意味着更高的质量和更少的像素化,同时也意味着光照贴图将占用更多存储空间并需要更长的烘焙时间。建议将该数值设定为20,以便加快烘焙速度,最后再作出调整。

在对象的渲染组件中,可以调整其光照贴图比例。其他重要设置包括:

完成设置后,点击底部的 generate lighting(生成照明),然后等待。对于更大的场景可能需要一段时间,但由于我们的场景较小,使用GPU光照贴图器应该不会花费太多时间。现在您应该能够更好地理解烘焙光照的工作原理,可以在下一次烘焙前根据需要调整光照设置。

通过使用渐进式光照贴图器的 Prioritize view(优先查看)功能,可以在烘焙过程中预览结果外观及噪点的情况。

在场景中,合理添加灯光。右键单击层次结构中的对象,转到“照明”选项,您将看到Unity中四种不同类型的照明:

  1. Directional light(方向光):类似太阳,光线具有无限距离,阴影将始终保持平行。每个场景应最多只有一个。
  2. Point light(点光源):具有有限范围,在所有方向上都有光源。
  3. Spot light(聚光灯):有限范围锥形光源,角度在0-180度之间。
  4. Area light(区域光源):覆盖区域的平坦二维光源,仅用于烘焙,非实时。

对于我们的场景来说,点光源似乎是最合适的选择。添加一个新的点光源,并将其放置在靠近天花板的位置,但不要放在天花板内部,因为光源是从放置点模拟的。

点击 Bake(烘焙)。现在应该能够在木材上看到反射效果。但是,如果移动相机,反射效果不会随之移动。这是因为默认情况下,立方体贴图被投影为似乎来自无限远处的光线,对于室外场景是合适的,因为那里没有明显的视差。然而,对于室内场景,这样的投影方式会导致反射效果不正确。启用反射探测器的框投影可以解决这个问题,该方法将立方体贴图投影到反射探测器的边界,模拟视差,同时保持投影的清晰。这是室内空间的理想设置。

好的,现在我们已经为静态物体添加了灯光,那么动态物体呢?右键点击“Hierarchy”中的“Lighting”>“Light Probe Group”。它现在应该出现在你的场景中,像一个由8个球体组成的网状结构。每个球体都是一个探测器,对于每个探测器,Unity会计算它在该空间点上的阴影效果。当动态物体移动到光探测器之间时,它们会混合最近的光照数据。

如果你点击光探测器组,你应该在检查器中看到你可以按下一个按钮来切换探测器编辑模式。从这里,你可以点击并移动单个探测器,按住shift键点击它们以将它们添加到选择中,使用ctrl+d复制它们。现在我们的目标是使用光探测器填充房间。但是我们应该怎么填充呢?最简单的方法是在房间里填充探测器,就像一个3D网格,但是这样我们不会得到最准确的照明。放置光探测器的最佳方法是在照明发生变化的地方放置一个探测器!

让我们在明显的地方放置它们,比如阳光照在地板上的地方。就在地板上方,将光探测器放置在阳光的四个角上,然后在阳光外的四个角上放置光探测器。在窗户上也要这样做。现在将光探测器放置在场景中的其他光源周围,以及任何阴影的边缘。

在照明窗口的顶部,你会注意到环境照明,那里写着“Skybox”。这将决定用于场景回溯反射的立方体贴图,或者当物体超出反射探测器的范围时。现在,Unity会烘焙一个天空盒的立方体贴图,这不是我们想要的,因为如果所有物体都放在房间里,天空盒就不会是我们场景的适当反射。点击“Skybox”并将其设置为自定义。然后在项目选项卡中导航到反射探测器(它应该在“Scenes”>“Scene name”下),并将其拖入插槽中。

如果你再次查看斯堪的纳维亚风格的公寓,你会注意到很多公寓都没有人造光源。他们的照明来自外部,但不是直接光源,这会产生尖锐的阴影。

让我问你一个问题:当你在白天外面的时候,光是从哪里来的?显而易见的答案是太阳,它是地球上最强烈的光源,但事实是光来自四面八方。这就是为什么在晴朗的日子里,阴影中的表面会有蓝色的光晕,因为环境照明来自天空。

既然斯堪的纳维亚地区多云,我们可以肯定地说很多这些照片是在多云的日子里拍摄的,这就是为什么(以及可能的窗帘)照明是分散的。我们可以在Unity中复制这种多云天气的照明;这就是为什么照明选项卡中的环境照明变得非常重要。

默认情况下,环境照明的来源是天空盒。在下一课中,我将向你展示如何导入外部资产,包括一个多云的天空盒,但现在我们可以通过右键点击项目选项卡并选择“Create”>“Material”来创建自己的灰色天空盒。然后更改着色器为“Skybox”>“6-sided”并将颜色更改为稍微亮一点的灰色。现在禁用所有其他光源,点击“Bake”,你现在就拥有了美丽的漫射室内照明。如果你认为它有点暗,你可以增加间接强度,这将使天空盒变亮。这在物理上是不正确的,但我们是艺术家,不是科学家;我们不需要遵守物理定律,我们可以弯曲它们来满足我们的需求!

最后一个要提到的重要优化是遮挡剔除,它将通过不渲染不在玩家视野中的对象来提高世界的性能。转到“Window”>“Rendering”>“Occlusion Culling”并单击“Bake”。如果你点击“Visualization”选项卡顶部的“Visualization”,选择你的相机,移动它,你可以看到Unity现在如何绘制场景。

为了获得更好的遮挡剔除效果,右键点击“Hierarchy”>“Lighting”>“Occlusion Area”,然后调整这个体积以适应场景中玩家可能站立的地方。

最好在编辑场景中的静态物体时清除遮挡剔除数据,然后在上传之前进行烘焙。如果它没有正常工作(物体在应该仍然可见时消失),那么重新烘焙或者调整“Occlusion”选项卡中“Bake”下的设置。请注意,遮挡剔除仅影响物体的可视渲染,因此即使它们在视野之外,对它们的处理仍然会进行!

调整光源设置,以更高的设置再次烘焙,你的房间现在应该有美丽且性能良好的烘焙照明!下一课将讲解如何将外部模型添加到场景中。

额外资产与预制件(Prefab)

这里有个视频

再次,我不得不在课程的第一部分回头,因为事实证明,我选择不涵盖上一集的主题实际上很重要。这是因为我们的场景照明主要来自环境(间接地),而不是光源组件。如果你看看墙的一些部分,你可能会看到有些地方看起来有点斑驳。这是由间接和环境样本以及照明选项卡中的过滤引起的。

而不是简单地解释,我觉得更好向您展示如何真正理解这种技术的工作原理。请注意,我将禁用过滤,场景将会看起来很嘈杂很难看。对于大多数人来说,看到这样的场景可能会让人感到不愉快,但如果以任何方式打扰到您,请跳过前10秒。这就是过滤关闭后的照明效果。由于光线追踪的工作原理,它看起来如此嘈杂;本质上,样本数量越高,噪声就越少。然而,在过滤>高级选项卡下,您可以看到有降噪选项。这些选项通过使用AI降噪算法来减少噪声。通过增加样本数量,烘焙结果中的噪声会减少,烘焙中的斑驳也会减少,但渲染时间会消耗更多。根据我的测试,环境样本似乎受到间接样本的限制,所以我将两者都增加到大约2000。如果您只是为了预览照明而大量烘焙场景,您可能需要减少这个数量,直到最后的烘焙。

在主要光源来自光源组件的场景中,这通常不是需要担心的问题。这是因为我们的主要光源是环境,这才变得值得关注。直接照明总是比间接照明更准确,噪声更少,烘焙时间更短。

现在我们就来讨论本节课的主题。对于那些不知情的人来说,资产就是指进入3D场景的任何物体。有一些网站可以下载3D资产(请确保您有合法权利使用它们),但我通常首选检查Unity Asset Store。您可以在Unity内部浏览它(窗口>资源商店),但编辑器内的浏览器速度较慢,我建议使用专门的浏览器。请访问以下链接:https://assetstore.unity.com/

Asset Store的便利之处在于这些资产是专门为Unity制作的。我这样说的原因有两个:首先,许多资产只需拖放,无需太多额外的设置或配置(如果有的话)。其次,您在其他网站上找到的许多3D模型的面数对于VR游戏来说是非常夸张的(对于简单对象来说,超过20,000个多边形)。这是因为它们不是为游戏设计的,而是为电影或3D渲染设计的,这些技术限制并不相同。根据官方的VRChat文档,推荐的Quest世界多边形计数上限为50,000个三角形,即使您不打算上传到Quest,我仍然会考虑软多边形限制。在这里减少几十个小数点对性能来说是可以忽略不计的,但让一个物体有50,000个三角形是没有意义的。如果您仍然想使用该物体,而又没有低多边形版本,我建议您将其放入Blender中,或者使用降面修饰器(快速而粗糙)或者烘焙成低多边形。

我们应该首先搜索一个合适的天空盒资产。只需在搜索栏中输入“skybox”,选择免费资产,我将在本教程中使用“allsky free pack”,因为它是免费的、流行的且高质量的。导入到您的资产库后,点击“在Unity中打开”,这将带您进入包管理器。您还可以通过点击“窗口>包管理器”,确保左上角“+”旁边的下拉菜单设置为“我的资产”来打开它。现在点击“下载并导入”,它们将会出现在您的项目中。找到“多云”的天空盒材质,并将其拖到场景中的天空盒上。如果看起来有点暗,您可以将曝光增加到高光不会过度曝光的程度。

我们的房间看起来有点荒凉,为什么不搜索一些家具呢?选择您喜欢的。我将搜索沙发。在本教程中,我将使用这个沙发包,但即使您没有,您仍然可以选择自己喜欢的模型进行学习。由于这是您的房间,我鼓励您让其成为您自己的,这意味着使用建模、纹理、照明和适合您场景的资产。这意味着您不应该添加互相冲突的元素,每个部分都应该理想地补充其他部分。

首先,在页面上添加模型。下载然后通过包管理器导入。导入后,找到一个prefabs文件夹,选择您想要的模型,复制它,然后将其拖到场景中。

在我们深入了解之前,有必要了解预制件的含义。预制件指的是一个完整的游戏对象,其中包括所有组件。使用预制件的好处在于,如果您的项目中存在多个相同的游戏对象,且您希望一次性编辑它们,那么您就无需逐个编辑每个对象。

举例来说,假设我们想要确保所有的窗户都是相同的。如果我们不想逐一编辑它们,我们可以将父窗户对象从层次结构中拖动到项目选项卡中,以创建它们。这样做后,您应该可以看到层次结构中的对象图标从空心灰色变为实心蓝色!您可以通过双击项目选项卡中的预制件或右键单击层次结构中的预制件并单击“打开预制件资源”来编辑预制件,这样场景视图就只会专注于预制件。您在这里进行的编辑将会被应用到所有实例的预制件上。若想退出这个视图,则可以通过场景选项卡左上角的箭头来完成。如果您对预制件实例进行了更改,可以右键单击检查器中的该参数,然后选择“应用于预制件”。如果您想要取消一个预制件实例的预制件身份,可以右键单击层次结构中的该实例,然后选择“解包预制件”。除此之外,您还可以将预制件放置在另一个预制件中;解包预制件只会解除父预制件的包装,而完全解包会将任何嵌套的预制件都解除包装。

我收到的沙发预制件中并不包含碰撞器。因此,让我们通过双击项目选项卡中的预制件,转到带有网格渲染器组件的游戏对象(这样一来,当添加碰撞器时,它们就会沿着网格的边界进行)并添加盒式碰撞器以增加一些碰撞器。对于沙发的座垫,我将制作一个碰撞器,单击3点,复制组件,然后将其粘贴作为新组件。这样,两个碰撞器的高度将完全保持一致,这样玩家在从一个碰撞器走到另一个碰撞器时就不会感到不自然。

对于复杂的对象,您可以使用ProBuilder(或者Blender)来创建一个简化的碰撞网格,然后将其设置为模型游戏对象的子对象,禁用其网格渲染器,并添加网格碰撞器组件。基本的碰撞器组件更为优化和可靠,因此我们应尽可能多地使用这些复合组件。

我们的沙发也是静态的,因此请不要忘记勾选那个框。

让我们为沙发添加一些座位。搜索VRCChair,将VRCChair3复制一份,然后双击新创建的VRCChair4。删除带有椅子网格的游戏对象,并将碰撞器垂直缩小。打开沙发预制件,将新的VRCChair拖动到您想要添加座位的位置。确保它们面向正确的方向;同时确保工具手柄的设置为局部旋转,然后将蓝色箭头指向z轴向前。另外,请确保座位的碰撞器顶部高于沙发的碰撞器。座位和出口游戏对象只是空的,专门用于玩家坐下和离开时的位置转换;您可以根据需要对其进行调整。若要添加更多座位,请复制椅子预制件。

VRChat中有一个名为Walkthrough的层,它允许玩家穿越具有碰撞器的物体,但会对物理对象(如可拾取对象)做出反应。由于高度变化可能是VR中最容易让用户迷失方向的部分之一,特别是对于新用户来说,因此我倾向于将许多小型的静态对象默认设置为该层。在接下来的教程中,我将演示如何在Walkthrough层和Default层之间切换这些物体。

此外,在项目视图中找到对象的模型文件(您可以通过单击对象网格渲染器组件中的网格来找到它)。在检查器中的模型选项卡下,请确保选中“生成光照贴图UV”。对于每个导入并设置为光照贴图的对象,您都需要执行此操作(除非它已附带用于光照贴图的UV2)。

导入的纹理是未经压缩的!请不要忘记对其进行压缩!

最后,请记得移动您的光探针,确保它们不会被动态对象遮挡或位于无法到达的区域!

在处理其他网站的模型时,需要进行比Asset Store中的模型更多的设置。通常情况下,这些模型会包含一个模型文件和一个单独的纹理图像文件,因此您需要创建一个新的材质并手动插入纹理。导入Unity时,理想的3D模型格式是.fbx,但对于静态网格,.obj也是适用的。如果您从外部网站下载模型,请确保它是这些格式之一。不要将.blend文件直接导入到Unity并拖动到场景中,因为这可能会导致问题。在对象需要进行光照贴图时,请务必勾选“生成光照贴图UV”。

您可以使用360度图像或HDRI作为天空盒。一个名为Polyhaven的网站提供了一些在公共领域的HDRI。当您找到一个您喜欢的HDRI时,请下载2K EXR格式的文件(这两种格式都与Unity兼容,但EXR更受欢迎)。将其拖放到项目窗口中,它看起来像一个2D纹理。我们需要将这个纹理投影到一个类似球体的形状上,这听起来好像是反射探针的立方体贴图。要更改纹理的投影方式,请点击它并在检查器中将纹理类型从2D改为Cube。现在,您可以直接将纹理拖放到天空上,Unity将会为您创建天空盒材质。您甚至可以将高强度的天空盒与低强度的定向光结合使用,以达到更好的艺术效果。

需要注意的是,将360度图片作为天空盒看起来可能在投影和缩放上不正确,并且当玩家移动时可能不会有任何视差。这使得使用360度图像进行屋顶射击成为最佳选择,因为当通过窗户观看时,您自然不会看到太多的视差。

如果您希望在您的世界中添加背景音乐或声音效果,请将音频文件拖放到您的项目中,然后将其拖动到场景中,它会自动带有音频组件。在检查器中,点击“添加组件”并搜索VRCSpacialAudioSource(这将使声音在VRChat中正常工作)。如果您的声音是背景音乐,您可能不希望声音来自世界上的特定点,因此请转到“高级选项”并取消选中“启用空间化”。

为了更好的压缩效果,点击音频文件,将格式设置为Vorbis并拖动压缩滑块。如果压缩效果过于明显,您可以一直拖动滑块直到感觉不到压缩为止。对于空间化的声音,立体声音频文件并不重要,因此将其设置为单声道可以减小文件大小。

这就是本节内容的主要部分。这标志着本系列教程一半的进程;迄今为止,教程主要侧重于学习Unity软件的一般知识,特别是室内设计。从现在开始,教程将主要集中在学习Unity组件在VRChat中的具体应用。在下一节课中,我们将讨论如何添加一个镜子,并实现与之相关的切换功能,包括使用世界空间UI。