Skip to main content

额外资产与预制件(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。