VRChat 特有 Unity 内容的介绍
本节所讨论的主题将涉及 Unity 中与 VRChat 相关的特定内容。
镜子按钮与 UI
让我们来谈谈大多数人都期待已久的话题,那就是添加镜子!
在项目选项卡中搜索 Mirror
。将 VRCMirror 拖入您的场景,将其重命名为 HQ Mirror,并根据需求移动位置、旋转和缩放。如果您已导入了 VRWorldToolkit(就像您应该在第1部分中做的那样),那么您会看到一个名为 Show Players/World 的按钮。单击该按钮,然后启用 Reflect Layers(反射层)下的 Pickup(拾取)和 Walkthrough(穿行)。接下来就先 禁用(Disable)镜子。
好的,我们现在已经有了一个镜子,但是我们如何打开和关闭它呢?这时候就是 UI 派上用处的时候了。我们想要一个可以点击的开关,因此可以在 Hierarchy(层级窗口)中单击右键,选择 UI>Toggle。这将在 Canvas(画布)上生成一个 UI 开关,这是显示 UI 元素所必需的组件;不过,我们需要先解决一些问题。
- 在 Hierarchy(层级窗口)中,单击 Canvas(画布),然后将渲染模式更改为 World Space(世界空间)。在 Rect Transform(矩形变换)下,将 XYZ 缩放更改为0.001。然后将 layer(图层)从 UI 更改为 Default。添加一个盒子碰撞器和一个VRC Ui Shape两个组件。现在将其放置在墙上;关闭网格,这样您可以将其稍微偏离墙壁放置,而不是放在墙壁内部。
- 在 Hierarchy(层级窗口)中,单击 Canvas(画布)下的 按钮(toggle)并将其宽度设置为700,高度设置为120,然后取消勾选
Is On
。 - 在 Hierarchy(层级窗口)中,单击 按钮(toggle)下的 label(标签)按钮。将文本更改为
HQ Mirror Toggle
,将颜色更改为白色并增加字体大小。您可以随意更改字体,甚至可以导入自定义字体,只需从C:/Windows/Fonts
中拖动ttf
字体文件即可。您还可以通过单击 Add Component(添加组件)并搜索shadow
来添加阴影。 - 在 Hierarchy(层级窗口)中,单击 Background(背景)并将宽度和高度设置为100。然后将偏移更改为 50 和 -50 以正确放置复选框。接下来,在层次结构中单击“勾选”并将其宽度和高度设置为100。最后,再次选择标签并将其左侧设置为至少 100(您可以使用gizmos像其他对象一样平移UI元素)。
现在,在“切换”下,将导航设置为“无”。单击组件底部的加号图标,然后从层次结构中拖动镜子。单击下拉菜单中的“无函数”并选择“GameObject”>“SetActive”。在“动态布尔”下。
复制您的 HQ 镜像,将其重命名为 LQ 镜像,单击“仅显示玩家”,然后复制我们刚刚创建的按钮。在“切换拖动”中,将LQ镜像替换为HQ镜像,并将标签更改为 LQ 镜子按钮。
为确保一次只能有一个镜像处于打开状态,请添加一个新槽,将HQ镜像切换拖动到其中,然后在下拉菜单中选择“切换>打开”下的静态布尔值,并取消选中框。对于HQ镜像切换,也是如此,只是将LQ镜像切换放在槽中。然而,如果您有一个打开的镜像,并想要选择另一个镜像,您必须单击按钮两次,一次关闭当前镜像,另一次打开所需的镜像。
按播放按钮,使用CyanEmu(您还应在第1部分中导入)测试此功能。
如果您想使用Udon制作此UI,可以查看Vowgan的视频!https://youtu.be/E0D9Z8-HVBI
将其中一个镜子稍微移到另一个前面,以避免z轴冲突。
如果您的世界更大,请注意,LQ 镜子将渲染其背后的虚拟形象(即使它们穿过墙壁)。出于性能和隐私原因,最好将镜子放置在不会发生这种情况的位置,或者甚至设计您的空间,以便在考虑到这一点的情况下放置镜子。
顺便说一句,您可能想要在此时组织层次结构。您基本上可以使用空的游戏对象作为文件夹,但请确保首先重置其变换,否则将弄乱子游戏对象的位置,从而弄乱progrids!如果您忘记并不清除变换,请拖动出所有子游戏对象,重置变换,然后将其拖回。
有一点额外的好处,我在评论中收到了一个关于如何制作霓虹灯的问题。首先,添加一个您想要添加霓虹灯的对象,进入 Probuilder 窗口,添加一个没有高度分段的细长圆柱。我将对其进行挤出,以形成我想要的样子。我可以创建挤出,然后使用中心枢轴旋转以在霓虹管中创建转弯。完成建模后,创建一个新材质并检查发光框,并将其设置为烘焙。将其应用于您的对象,并选择您想要它发出的颜色。烘焙后,您就完成了!
与此相关的几点提示:首先,您可以在 Probuilder 中通过 Edit>Preferences>Probuilder>Experimental Features Enabled 启用贝塞尔曲线(以及布尔值)!然而,实际上这两者在Probuilder中的效果并不是很理想,因此我建议您改用Blender。
其次,请确保照明适应您的场景。如果您想要达到温暖或自然的外观,您需要将颜色限制在开尔文光谱范围内。而如果您想要人为的外观,可以使用可见光光谱上的完整颜色。这一概念在我推荐的Blender Guru照明课程中有详细介绍,您可以在第4课开始时了解更多。
目前课程到此结束。下一节课将继续探讨这个主题,我将向您展示如何利用Udon的UI来在默认层和可行走层之间切换对象!
碰撞体按钮与 Udon
这节课延续了上节课的内容,我们将学习如何制作一个 World Space UI 按钮,用于决定玩家与某些物体是否发生碰撞,或者更具体地说,在导游和默认图层之间切换这些物体。
右键单击 Project(项目) 选项卡 的空白处,选择 Create > VRChat > Udon > Udon Graph Program Asset
。将新生成的文件重命名为 Collider Toggle。复制一个开关,并将对象和标签重命名为 Colliders。点击开关,添加 UdonBehavior 组件,然后将Udon脚本拖入其中。在切换器组件的底部,点击减号按钮删除旧插槽,然后点击加号图标并拖动 UdonBehavior。点击项目视图中的程序,然后点击“打开Udon图”。现在应该会弹出Udon选项卡!
首次打开 Udon 选项卡将会看到一个欢迎界面。如果您想要更改网格大小,请将其设置为20,但这只是我的个人偏好。现在点击“打开Collider Toggle”,这就是Udon图! Udon是一种可视化脚本,本质上是代码,但以节点形式展现,而不是纯文本行。我明白“编码”可能会吓到一些人,但实际上并不像想象中那么难。即使您在接下来不希望再涉足Udon,也无妨,我将会在整个教程中一直引导您。
最好首先考虑我们的代码在纯逻辑上的运行方式,即我们可以在之后转换为代码的纯文本步骤。
在运行代码之前,首要条件是所有对象位于相同的图层上,并且我们需要一个包含所有要切换对象的列表。
- 当代码开始执行时,我们需要检查第一个对象是否位于默认图层上。(因为它们都在同一个图层上,检查一个即可。)
- 如果它在默认图层上,那意味着其他所有对象也在默认图层上,我们希望将它们切换到导游图层。
- 如果它不在默认图层上,那意味着所有对象都在导游图层上,我们希望将它们切换到默认图层。
首先,我们需要创建一些变量。变量用于存储稍后可以引用或操作的信息。我们可以为许多类型的数据创建不同类型的变量,例如整数(本质上是整数)、布尔值(真或假)、游戏对象以及许多其他类型的组件。变量也可以是一个数组,这是一个由相同类型的多个变量组成的集合。数组使用方括号表示在变量类型旁边。我们可以通过单击左上角变量菜单中的加号来添加新变量到我们的脚本中。
我们首先需要的变量是一个游戏对象数组,用方括号标记。将其重命名为“Targets”。单击新变量旁边的箭头并选中“public”,这样我们的变量可以在脚本外部进行访问。如果您单击我们为您制作的collider toggle UI按钮,您应该在检查器中看到它。请确保拖动的是实际具有碰撞器的游戏对象!子对象不会受到影响!
最后,我们需要两个整数类型的变量来表示层。在Unity中,层按数值顺序进行存储,并且必须通过分配的编号进行引用。如果您单击任何组件上的层下拉菜单,您可以看到默认层是0,教程层是17。添加两个整数变量,将一个的默认值设为0,另一个设为17。将它们重命名为defaultLayer和walkthroughLayer。
现在我们可以开始添加节点了!关于节点,您应该了解的是,单个节点表示数据或操作。节点的左侧是输入,右侧是输出。我知道编程对于完全初学者来说可能有些令人生畏,但是经过本课程学习之后,您将开始了解一些基础知识。
按空格键在空白网格中进行快速搜索,这是我们可以添加新节点的方式。我们首先需要的是一个开始脚本其余部分的节点。这种节点类型称为事件,我们希望脚本在按下切换键时运行,因此搜索“事件自定义”。在节点框中输入“ColliderToggle”。然后,在检查器中的切换组件下,将“no function”更改为UdonBehavior.SendCustomEvent(String)。复制并粘贴“ColliderToggle”到框中。
接下来,我们需要检查数组中的第一个游戏对象是否在默认层中。首先,从左上角的菜单中单击并拖动Targets数组变量到网格中。这将创建一个节点,用来访问我们的游戏对象数组;然而,我们只需要第一个游戏对象,而不是所有对象。从节点中拖动出来,然后搜索并添加“get”。这个节点允许我们从游戏对象数组中获取一个游戏对象。因为0表示数组中的第一个元素,所以只需将0留在框中。在编程中,0通常是事物的起始数字,而不是1。
现在,我们需要获取游戏对象所在的层。从获取游戏对象中拖动出来,搜索"layer"并选择"get layer"。
现在,我们得到了第一个游戏对象的层级,它是一个整数。我们希望将其与表示默认图层的整数进行比较,以查看它们是否匹配。从获取图层中拖动并搜索"等于"。将默认图层的变量拖到网格中,并插入到整数槽中。"等于"函数比较这两个整数,看它们是否相同。如果它们相同,则输出为真;如果不同,则输出为假。
您可能已经注意到,在插入默认图层之前,该输入值已经是零。实际上,我们可以点击框并将其设置为我们想要的任何值。由于默认图层是一个常量(始终是相同的数字,即0),我们可以根本不创建默认图层整数变量。我告诉您这一点的原因是为了使代码更易于阅读,特别是当常量在代码中多次使用时。
在继续之前,最好将代码组织成小组,以便更易阅读。在刚创建的所有节点上,除了自定义事件节点外,右键单击并选择"创建组"。现在,所有这些节点都在一个大的框中。双击该组以重命名为"第一个游戏对象是否在默认图层上?"。您还可以右键单击创建注释。这通常被初学者忽略,但在其他人尝试解释您的代码时,或者在长时间后尝试解释自己的代码时,这确实是一个很好的帮助。
数组中的所有游戏对象应该在相同的图层上。如果第一个游戏对象在默认图层上,则意味着数组中的所有游戏对象都在默认图层上,我们希望将它们全部更改为教程图层。如果第一个游戏对象在教程图层上,则我们希望做相反的事情。
"如果"语句在我们的逻辑中通常表示我们希望在代码中有一个分支。从等于节点中拖动并搜索"分支"。将自定义事件箭头拖动到左分支箭头。
让我们从真分支开始。我们想要遍历数组中的所有对象,并将它们更改为教程图层。如果我们想要重复相同的代码,这通常意味着我们想要一个循环。有一种特殊的循环用于数组,称为for循环(如果您正在使用UdonSharp,则是foreach循环)。搜索"for"并添加它。将真分支从分支拖动到for循环的左箭头。
由于我们的数组从0开始,所以只需将那个输入保持为0。对于结束输入,我们希望得到数组中对象的数量。将目标数组从变量菜单拖动到网格中。从节点输出中拖动并搜索"长度"。选择第一个"getLength",小写字母"g"和两个分开的单词。现在将那个长度输出拖到for循环的"结束"输入。我们希望步骤为1,所以只需保持那个。
for循环本质上是执行代码主体以遍历数组中的每个游戏对象。代码运行多少次取决于3个输入。
既然我们已经设置了for循环,我们想要将游戏对象的图层从默认更改为walkthrough,从0更改为17。再将目标拖动到网格中,并从输出中拖出并搜索get。该节点将会输出数组中的一个游戏对象。将for循环中的整数索引拖至get gameobject节点的整数输入中。这样我们就可以获取特定游戏对象对应for循环所在的索引位置。因此,如果for循环位于第一个索引处,get gameobject节点将给出数组中第一个索引处的游戏对象。
从gameobject中拖出,搜索layer并选择set layer。将walkthroughLayer变量拖至网格中并连接至整数值输入。现在将for循环的主体箭头连接至set layer节点。
这就是真分支的全部操作!对于数组中的每个游戏对象,其图层都将被设置为walkthrough图层!概述所有代码并创建一个新组,并将其命名为“设置为walkthrough图层”。
假分支实际上非常相似。只需选择真分支中的所有节点,按ctrl+d进行复制,将它们向下拖动,然后用默认图层替换walkthrough图层。将假分支连接至for循环,创建一个名为“设置为默认图层”的新组,单击窗口右上角的compile,然后完成!
现在,只需使用CyanEmu(按播放)进行测试!
当您在运行脚本时,可以利用Debug Log向控制台发送消息,这对于问题的解决非常有帮助。
需要强调的是,我无法在YouTube评论部分为您提供帮助。对于一些初学者来说,可能会遇到问题,但YouTube评论部分并不是为提供实时帮助而设计的。最好的选择是检查控制台是否有错误,自行解决问题,并在需要时在VRChat官方Discord的udon频道(如果您使用udonsharp,请在udonsharp Discord)提问。请避免在YouTube评论部分发问,我无法在那里帮助您。
有一种更简单的方法可以为SDK3创建这些Udon系统,它可以模拟SDK2中Triggers的工作方式,被称为CyanTriggers。这是一个扩展,可以从GitHub免费下载,也可以从创建者Cyanlazer的Patreon获取最新版本。我对这两者都不太熟悉,出于避免导入太多可能发生更改的外部工具的考虑,我并未涉及。我会向那些不熟悉编程或不想学习编程的人推荐CyanTriggers,或向那些熟悉SDK2中的触发器并希望使用更相似工作流程的人推荐。鉴于SDK2已被弃用,我永远不会向新项目的人推荐它。
如果您希望使用更传统的逐行C#创建Udon程序,可以查看UdonSharp。
如果您希望了解更多关于编程,尤其是Unity和UdonSharp的C#使用,我建议您查看Brackey的初学者系列。他过去制作了许多非常出色的Unity教程,因此这些教程考虑到大多数观众想学习C#的基础知识,以便他们可以在Unity中进行编程。
如果您希望了解为VRChat使用Udon和UdonSharp进行编程,我建议您观看Vowgan的教程。这些将是与VRChat最相关的编程教程,但我建议您先掌握编程的基础知识。
在下一课中,我将讨论 pickupabbles 和物理!
可拾取属性与物理系统
那么,关于你想拿起或扔掉的东西呢?毫无疑问,这需要物理知识。别担心,你不需要做微积分,只需要简单地理解几个组件。 创建一个小立方体。在这个立方体上,点击添加组件,搜索拿起,然后点击VRCPickup。你现在应该看到添加了两个组件,一个刚体和一个VRCPickup。 在VRChat中,一个拿起需要4个组件:
- 刚体:用于计算物理
- 碰撞器:用于碰撞
- VRCPickup:这样你可以在VRChat中抓住/使用物体
- VRC对象同步(可选):这样对象可以在玩家之间同步。请注意,每个同步对象必须有一个所有者,这就是为什么拿起式物品在你的手里看起来很好,但如果它们被另一个玩家拿过,看起来就会很迟钝。
如果你启用“是动力学”,你的物体只能被与之交互的玩家移动。它不会与其他物体碰撞(尽管其他物体会与之碰撞),并且不会对其施加物理力。这是枕头的一个流行设置。 物理材质使物体具有更逼真的物理特性。你可以将它们添加到你的表面和拿起式物品的碰撞器中,使它们更可信。 你可以使用多个碰撞器进行更准确的碰撞;例如,对于我的玻璃瓶,我从一个立方体碰撞器开始,然后在X和Z轴上缩小它。然后我添加一个胶囊碰撞器,并在Y轴上缩小它,直到它与瓶子对齐。这样,瓶子既可以滚动,也可以站立在顶部或底部。请注意,你只能抓住检查器中出现的第一个碰撞器。
视频播放器,笔和其他预制体
我计划为 VRChat 的 特定预制件 设立一个单独的简短课程,我知道很多人希望在他们的世界中使用这些预制件。
在 VRCPrefabs 数据库中有许多 VRChat 预制件可供选择。需要注意的是,我们的 SDK3 世界中无法使用SDK2 预制件,只有 Udon 预制件可以正常运作。
许多预制件需要使用 UdonSharp 才能正常工作;这将会将 C# 代码编译为 Udon。您不必了解其工作原理,目前世界项目中默认配备有 UdonSharp 组件。
视频播放器
视频播放器是小世界中最受欢迎的功能之一。其中最有名的是 Merlin 的 UdonSharp 播放器(我们将使用它),但还有一些其他播放器,如 VRCUdon 和 ProTV,它们与 Quest 兼容。我们需要在 Github 页面的发布部分获取 UsharpVideo 的 unitypackage。在 UsharpVideo 文件夹中应该有一个 videoplayer 预制件,将其拖动到场景中,解压缩,完成!
您可以更改播放器的某些设置,例如是否将控制权限锁定到世界的主控器或是否允许任何人粘贴视频链接。要更改 UI 样式,可以通过转到预制件中的 ControlsUI 游戏对象,单击样式文件并在文件夹中选择不同的样式,或者自行制作。
带有 Udon 元素的预制件可能会产生冲突,所以最好在场景中解压缩您的预制件以确保它们正常工作。可以在层次结构中右键单击预制件并选择解压缩预制件;这将使您的对象不再是预制件。
Qvpen
另一个受欢迎的预制件是 Qvpen。您可以从 他们在 Booth 上的页面 获取这些内容。导入后,将预制件拖动到场景中即可。
镜子
如果您想要一个没有天空盒的 低质量(Low Quality)镜子,可以使用 VRCPlayersOnlyMirror ,本商品带有预设 UI。
着色器
Unity 标准着色器并不是非常出色,但幸运的是,有社区创造了一些更直观且功能丰富的替代品。其中一些包括 z3y 的着色器 或 Silent 的Filimented,但我们选择使用 Mochie Standard,因为它易于安装,并能告诉您是否要将灰度纹理设置为sRGB,并在需要时提供自动修复按钮。该着色器使用行业标准的粗糙度贴图代替平滑度贴图,并提供更大的控制力来调整高度贴图的视差贴图,包括其他许多功能。
许多世界创作者也有需求使用 水着色器,而 Mochie 的着色器包还附带了一个出色的水着色器。其他我推荐的针对 VR 的特定水着色器包括 Red_Sim 的水着色器、Silent 的 Clear Water 以及 Norbien 的水着色器等。需要注意的是,要使用折射效果,着色器必须使用 grabpass,这会在性能上产生较大的负担,并且在Quest上无法使用。许多水着色器还需要深度贴图,这需要场景中有实时光照和阴影。
VRWorldTooklit 中包含一个 DepthPass 预设,其性能影响最小。
就我个人而言,我认为 Red_Sim 的散射效果最好(Mochie的水散射看起来太像voronoi纹理),而 Norbien 的表现似乎更佳,也适用于Quest,并且无需实时光照即可生成深度贴图。
https://github.com/zulubo/SpecularProbes 可以生成出色的烘焙高光效果。它存在一些限制(例如,如果高光应该被遮挡,那么看起来不如实时高光效果好),但肯定会为一些场景和美学效果带来改善。
UdonSharp
对于那些有兴趣的人,如果您想将 Unity C# 脚本转换为 UdonSharp,通常并不是很困难。通常情况下,您只需要将命名空间从 MonoBehavior
更改为 UdonSharpBehavior
,将其插入 Udon 组件中(UdonSharp 会自动填充其余部分),然后应该就可以正常工作了。您可以通过转到 Window>UdonSharp>Class Exposure Tree 来检查 UdonSharp 类的暴露树。如果您遇到问题或有更多疑问,请访问UdonSharp的 GitHub 页面链接的 Discord 服务器。
如果您计划编写 UdonSharp 脚本,我还建议您使用 UdonToolkit,它允许您为您的脚本创建自定义检查器(就像我在我的 Nova_Max 的 日夜循环预制件上所做的那样!)。这有助于使脚本不仅对您自己易用,而且对计划将其提供给他人的任何人都更易于理解。一些预设并非以 .unitypackage 格式提供,而是以包含 package.json 文件的 zip 文件格式。要导入这些文件,请打开包管理器,单击加号图标,然后点击 package.json 文件并打开它。
上传至 VRChat 与 Quest 适配
随着 Quest 用户在 VRChat 上的知名度不断提高,Oculus Quest 的兼容性越来越受欢迎。幸运的是,尽管过程可能会有些繁琐,但使世界与 Quest 兼容并不是一件难事。
由于首次切换到 Quest 的构建速度较慢,因此最好先对 PC 版本进行编辑和更正。此外,PC 版本和 Quest 版本之间的不同层次结构顺序可能会导致同步对象混乱!因此,请确保两个版本的世界在层次结构中具有相同位置的同步对象,并且使用相同的命名!
在上传之前,您应该确保进行以下一些最终的优化:
- 确保您的光照烘焙是准确的(自上次光照烘焙以来未编辑任何静态对象,并且您的光探针没有错误)
- 检查 VRWorld Toolkit 的世界调试器以查找错误
- 进行烘焙遮挡剔除
- 使用 VRWorld Toolkit 的 Mass Texture Importer 功能,压缩您尚未压缩的任何纹理(单击从场景获取纹理,然后应用)
- 您还可以压缩网格!为此,请单击 .fbx 文件,然后在网格压缩下单击中等(单击带有问号的圆圈以获取更多信息)
- 如果使用视差贴图,请将步骤设置为较低,或者如果对材质不是特别重要,则完全禁用它们(视差贴图计算量较大,甚至 Oculus 都建议在 VR 环境中不使用)
- 确保所有可拾取的对象都是层次结构根中的一个 GameObject 的子对象(Rigidbody 组件每帧都在更新,因此所有父级 GameObject 也必须更新,只有一个父级 GameObject 可以优化我们的物理)
- 如果存在实时光源,请提供选项以在实时光源上切换可拾取对象和阴影。后者需要使用两个单独的按钮进行 Udon 设置,并使用以下脚本。如果您对如何设置任何一个感到困惑,请观看我的 UI 和 Udon 视频。
在上传之前,您应该首先在 CyanEmu 和 VRChat 中测试您的世界。在 VRChat SDK 中,转到控制面板并切换到构建选项卡,然后单击构建和测试;您可以增加客户端数量以模拟多个玩家。这样做不仅使您可以深入了解您的世界在 VRChat 中的运行方式,还使我们可以访问 VRWorldToolkit 中的构建报告,通过该报告找到未压缩的资源。
在本系列中,我还想向您介绍另一个插件,它相对是可选的,但可能会派上用场。这就是 VRBuildHelper,它的主要功能是允许您像版本控制一样管理世界的多个分支,同时还带来了一些有用的功能,我主要用它来实现这个目的,接下来我将介绍一些具体内容。
在准备上传之前,请检查 VRWorldToolkit>World Debugger,查看是否有内容需要修复。然后,将主摄像机放置在您希望预览世界的画面位置。
安装 VRChat ApiTools,并安装 VRBuildHelper。转到 Windows>VRBuildHelper,单击“在此场景中设置构建助手”,然后单击“创建新分支”。
打开 VRChat SDK>控制面板,并切换到构建选项卡,然后单击“构建和上传”。
在构建完成但尚未上传之前,Unity 将处于游戏视图模式,此时您需要输入关于世界的详细信息(稍后可以在 Vrchat.com 上编辑)。回到场景视图,单击主摄像机的变换,选择复制组件,然后在新的游戏对象VRCCAM的变换上单击,选择粘贴组件值。重复这一过程,从主摄像机复制后期处理层组件,然后在 VRCCAM 上单击,选择“粘贴组件作为新组件”。
如果您已安装 VRBuildHelper,您会在上传屏幕上看到两个选项:您可能想要勾选保存 VRCCAM 位置(另一个选项用于我之前提到的分支管理功能)。
在上传屏幕的底部提示您可以将这个世界发布到实验室;当您发布一个新世界时,需要等待7天才能再次发布。然而,您可以随时向现有世界推送更新。当您的世界在实验室中时,如果其他用户在设置中启用了“显示社区实验室”,他们可以访问您的世界。在加载实验室中的世界时,会有警告提示尚未批准,可能会表现不佳或包含令人反感的内容;此外,其他用户无法将其设置为主世界。为了加快您的世界被批准并离开实验室,邀请人们访问并标记他们的最爱。虽然实验室系统可能有些复杂,但如果您有任何疑问,请阅读常见问题解答或在 VRChat Discord 中提问。
转到 Windows>VRBuildHelper,它将打开相应的窗口,您可以在底部看到两个按钮,紧挨在自主构建器旁边:当前平台(PC或Quest,在窗口标题中可见)和所有平台。这将允许您通过一次点击上传您的世界,无需每次想要推送更新时都通过上传屏幕!但请注意,您必须先正常地上传它。
现在让我们关注我们世界的 Quest 版本。
从 PC 切换到 Android 版本通常需要很长时间,但为了加快速度,我们可以设置一个本地缓存服务器。转到 Edit>Preferences>Cache Server,将 Cache Server Mode 设置为Local。如果主驱动器上的空间较小,您可以使用更大驱动器上的自定义缓存位置。第一次从 PC 切换到 Android 及反之可能会较慢,但后续切换会更快。
还有一个工具可供导入,名为 EasyQuestSwitch。一旦打开并设置好,您可以添加游戏对象和资产,以自动完成两个平台之间的切换。由于 Quest 不支持后期处理,您可以添加一个新插槽,将您的后期处理卷拖至其中,然后在 Quest 上取消该卷的激活状态。此外,为所有使用标准着色器的材质创建插槽。然后在项目选项卡的搜索栏中输入“Standard Lite”,并将着色器文件拖至 Quest 着色器插槽中。
在 VRChat SDK 窗口中找到一个按钮,可用于切换到 Android(适用于 Quest),尽管据报道该按钮有缺陷,我们可以通过转到“文件”>“构建设置”(Ctrl+Shift+B)来切换平台。初次切换时可能需要一些时间,但后续切换将更快。
请确保不要使用完全不兼容于 Quest 的着色器(如带有抓取通道的水着色器)。
Quest 世界的大小限制为 100MB。如果大小超过限制,将无法上传。最快的解决方法是压缩/降低分辨率纹理/光照贴图/网格/音频文件,或者为纹理使用更大的 ATSC 块大小。所有这些都可以在 Unity 内部仅需点击几下即可完成。
打开 VRWorldToolkit 并检查以确保没有任何问题。
最后,使用 CyanEmu 测试世界以确保一切正常。如果一切正常,您现在可以上传到 Quest 了!
如果您有一台 Quest,请自行测试该世界;如果没有,邀请一位 Quest 测试者来发现可能存在的问题。如果一切正常,那么恭喜您!您已经完成了!现在您已经具备了制作自己的优化、与 Quest 兼容的 VRChat 世界所需的知识!