世界
基本上传和建模 - 世界
学习世界创建的最简单、最全面的方法是观看本指南顶部链接的系列教程:[https://youtube.com/playlist?list=PLPdWkxUSZ65Fp6ICr\](https://youtu.be/uLi52YrrDmY)
我推荐使用 VRWorldToolkit:一个用于制作 VRChat 世界的 Unity 编辑器扩展[github.com]。它将帮助你优化你的世界。
EasyQuestSwitch[github.com] 可以帮助将世界(或头像)从 PC 切换到 Oculus Quest:允许将所有指定资产的属性(如材质的着色器)切换到指定的 PC 或 Quest 版本,只需一个按钮。
Probuilder
制作/试制关卡和关卡几何图形的好帮手。它实际上是 Unity 中的一个简单 3D 建模器。
</span
提示:
创建空的 Gameobjects(GameObject>Create Empty 或 Ctrl+Shift+N 或右键单击 Hierarchy>Create Empty)并将其用作文件夹来组织对象!在将任何东西作为 gameobject 的子对象之前,请重置变换!!!不要移动空的 gameobject!不要移动空游戏对象本身,而要移动其中的所有对象(如果不这样做,会破坏程序!!)。
当多个二维平面处于完全相同的位置时(例如墙上的一幅画),就会出现 Z-Fighting,也称为拼接。避免这种情况的方法是将应该重叠的物体向前移动微小的距离。
Polybrush
用于在 Unity 中进行简单的雕刻。非常适合制作自然景观。
UNOFFICIAL VRChat Creator Glossary[docs.google.com]
资产猎取
提示:只下载您认为会用到的免费资产;您可以随时回来获取它们。您可以在 Unity 资产商店找到大量免费和付费资产。下面我将列出一些其他的免费资产网站:
纹理
如果有的话,请检查您下载的材质的尺寸度量。这将告知您需要更改多少贴图设置才能使其正确缩放。它们通常以一米为单位(如 1m x 1m)。
在寻找纹理时,请选择无损 .PNG 而不是有损 .JPG。如上所述,Unity 会压缩纹理;在 Unity 中使用无损图像将获得更高质量的纹理和更小的纹理尺寸。
[(完全可选)如果想在电脑上无损压缩 .PNG,可以使用 PNGGauntlet 这样的程序。Unity 不会以 PNG 或 JPEG 等常见图像格式存储纹理,因为它们的解压缩时间相对较慢。]
纹理搜索引擎(textures.one/] 免费 PBR 纹理网站:
- https://ambientcg.com/
- https://texturehaven.com/
- https://freepbr.com/
- https://3dtextures.me/
- https://www.poliigon.com/search?type=all&refine_by=assets-free
- http://textures.com/
- http://gametextures.com/freebies
如果非彩色纹理在 Unity 中显示为彩色(如轻微的绿色),请将其导入 GIMP 等照片编辑程序,并导出为灰度图像(GIMP 中为 8bpc GRAY,如果有 alpha/transparency 通道则为 GRAYA)。
[Substance播放器](https://substance3d.adobe.com/documentation/sp31/substance-player-2294742.html)是一款免费程序,您可以使用.sabar文件轻松创建自定义的高质量纹理。您可以在 [AmbientCG.com](https://ambientcg.com/list?type=SBSAR) 免费获取这些文件。
模型
寻找模型要比寻找纹理困难得多。请确保
文件格式为 .obj 或 .fbx,最好是后者 多边形数量较少(否则您将不得不自己对其进行分解)
我建议先查看 Unity 资产商店。如果找不到,那就谷歌一下"(*对象名称/*3D 模型"。
免费 3D 模型网站& 资源/[devga.me/]
细化(降低网格的多边形数)可以通过删除/合并顶点/面手动完成,也可以自动完成。
要在 Blender 中自动完成,可以在 CATS 中选择快速去边或在网格上使用去边修改器。
\如果你想更进一步,十进制修改器也是创建 LOD 的好帮手。
还有一些专门用于去角质和重拓扑的程序,比如免费的 Instant Meshes。
切勿将 .blend 文件直接导入 Unity!先导出为 .fbx,然后再导入!
您还需要一个天空盒。你可以从 Unity Asset Store 获取一些,或者我也喜欢 TowelCloud's skyboxes[gitlab.com]。
物理
Pickupabble 对象需要 3 个组件:
- 刚体:允许对象与物理进行交互([称为刚体是因为没有变形]
- 碰撞器:允许碰撞器与其他碰撞器碰撞(因此物体不会简单地穿过所有物体)
- VRCPickup:允许在 VRChat 中抓取对象
要使 VRChat 对象可被抓取,请在 GameObject 中添加 VRCPickup 组件。
这将自动添加一个刚体(如果还没有的话)。
对撞机类型[按性能成本从低到高排列]:
- 球体 ([1 个矢量]
- Capsule (2 个矢量和它们之间的距离]
- Box (一个体积)
网格对撞器会根据网格形成对撞器。如果应用到具有刚体的物体上,网格碰撞器应该设置为凸形,这样它就可以与其他具有刚体的物体碰撞,这些刚体也具有凸形网格碰撞器。
凸形碰撞器还会将碰撞网格限制为 256 个三角形。
此外,"凸 "与 "凹 "有关;碰撞器不是凹形的;例如,任何开口(如碗或杯子上的开口)都会被凸形碰撞器覆盖。
在为具有刚体的物体创建对撞器时,最好使用基元或基元组合,以获得性能和可信度兼具的效果。
正交视图模式(所有物体与摄像机的距离相等)对编辑碰撞器非常有帮助。要启用该模式,请单击场景视图右上角的方框。
例如,在一个啤酒瓶上,我会在可以滚动的部分周围使用一个胶囊对撞器,在胶囊内使用一个方框对撞器,方框对撞器延伸到瓶子的顶部和底部,这样瓶子就可以竖立起来。
要优化拾取器,请确保所有拾取器都位于层次结构根部的单个游戏对象之下。每个具有刚体的对象不仅需要在每一帧更新其变换,还需要更新其所有父游戏对象的变换。确保所有拾取器都在一个父对象下,这样既能使层次结构井然有序,又不会浪费性能。
例如,如果您有一个地毯地板,您可以为其应用高摩擦力物理材料,为冰层应用低摩擦力物理材料。有几种物理材料带有 Unity Standard Assets[assetstore.unity.com]。
对于复杂的网格,请勿使用网格粘贴器!(这非常耗费精力!)。
最好在对象上添加一个或多个基元(盒状、球状或囊状)对撞器,使对撞器与网格相匹配。
在三维建模程序(如 Blender)中,您可以在同一模型中创建一组更简单的网格,关闭它们的网格渲染器,并为更简单的网格添加网格对撞器。这将节省性能,而且大多数玩家不会注意到其中的差别。
Unity 还使用不同类型的连接。这些对于创建物理门之类的功能非常有用。
</span
预制件
预置可将对象及其所有组件保存为单个资产。 这些对于灯具或拾音器等特别有用!将光源和 3D 模型组合到预制件中!将拾取器、其 vrc_pickup 脚本和碰撞器组合到一个预制件中!
查看 Udon prefabs section[docs.google.com] of VRCPrefabs.我还推荐 Vowgan's Collision Sounds[vowgan.booth.pm], they are incredibly satisfying.。
世界教程系列
您是否曾想过创建自己的世界,但却不知从何下手?
照明
照明类型:
- 实时--每帧计算光照
- 烘焙- 在编辑器的电脑上预先计算光照并生成光照贴图(包含光照和阴影的纹理),然后覆盖在这些对象上
- 混合--静态物体使用烘焙光照,动态物体使用实时光照
灯光类型:
- 定向--本质上就是太阳。每个场景不应超过 1 个。\它的光线是无限的,因此它的位置并不重要,但它的旋转却很重要。
- 点状 - 从中心向各个方向投射光线。模拟灯泡。
- 点 - 从中心向外投射锥形光线。模拟聚光灯。
- 区域 - 从二维矩形或圆形向外投射光线。模拟天花板上的办公室照明。
理想情况下,所有灯光都应烘烤,不应使用实时灯光
VRChat中的实时灯光要么看起来很糟糕,要么会降低帧速率,或者通常两者兼而有之。
那么如何为动态对象打光呢?灯光探测器。这些探针会预先计算对象在该探针位置的照明效果。许多探针被放置在一个组中,当动态对象穿过该组时,它们会与探针混合并相应地点亮。
反射探测器
用于反射。它们就像照相机一样,从所放置的位置(6 个方向)拍摄 6 张照片,然后将这些数据组合成立方体地图(球形图像)。重叠的反射探头可进行混合。
切勿在 VR 中使用屏幕空间反射。
反射探针指南([gitlab.com/])</span
Reflection Probe Box Projection([docs.unity3d.com/])</span
灯光设置
转到 Window>Rendering>Lighting Settings(窗口>渲染>灯光设置),弹出该窗口。
如果场景完全在室内,没有窗户,请关闭天空盒照明。
如果是室外场景,则打开天空盒照明,并在照明设置中设置定向光源。
单位像素
Texels 就像放置在物体上的像素,用于计算烘焙光照。对于许多 PC 世界来说,我认为每单位约 30 个像素足以兼顾质量和大小。
将灯光设置为柔和的阴影。
要实际查看灯光贴图的像素如何投射到几何体上,可以单击 "场景 "窗口顶部的下拉菜单(通常设置为 "阴影"),将其设置为 "烘焙灯光贴图"。
要更改网格的光贴图 UV,可以在模型设置中进行(点击 "项目 "窗口中的模型,更改 "模型 "选项卡底部的 "生成光贴图 UV "设置)。
虽然某些阴影较短的物体使用硬阴影可能更准确,但在较长的距离上,软阴影更准确,而且在较低的像素分辨率下看起来更好。Unity 并不包含 PCSS(百分比接近软阴影)等开箱即用的自适应阴影。 下次在阳光下,看看你的阴影。看看靠近原点(你的脚)的边缘是如何清晰的,而越往上越模糊!这就是 PCSS 等技术所模拟的效果。
不要过度使用像素!像素越多,光贴图的文件大小就越大!
https://unity3d.com/how-to/progressive-lightmapper-optimization-tips
在某些情况下,由于光映射 UV 重叠(常见于 probuilder 对象),您会希望使用更高的 texel 数。UV重叠([docs.unity3d.com/])</span
在您的关卡设计中,如果您的灯光是烘焙的,请避免在地板上或墙壁低处放置细节阴影;在这些阴影上行走的非静态模型将不会投射到这些细节阴影上。
灯光贴图分辨率
控制灯光贴图的最大分辨率。将其设置为只有一个光贴图,以获得最佳性能。
反弹
控制光线的反弹次数。[这些需要很长时间来烘烤] Most scenes shouldn't need more than 2.\例外情况是完全间接照明的场景。
Occlusion Culling/[docs.unity3d.com/]。
将您的静态 GameObjects 设置为 static [这将把子参数、occlusion 和 occludee static 设置为 true] 。然后转到 Windows>Rendering>Occlusion Culling,并在上传您的世界之前点击 bake。
Unity 将不会呈现玩家看不到的头像;由于呈现头像对性能的影响最大,因此良好的 VRChat 关卡设计应下意识地引导玩家只关注与之交互的其他玩家,而不会在后台呈现一堆他们并不关心的性能不佳的头像。
关卡设计
你是否拉过门把手,只是在你应该推的时候?关卡设计就像门的设计一样,最好的状态是你根本不会注意到它。 通过关卡设计,你可以让人们在潜移默化中执行操作。这听起来可能很明显,但人们不会做他们做不到的事情。 作为一名关卡设计师,你的工作就是以这样一种方式来设计你的关卡,让人们在不知不觉中做你想让他们做的事情。 例如,不想让人们聚集在某个区域(如楼梯)?通过设计,您可以使人们聚集在那里的可能性大大降低(例如,将该区域设计得比周围区域更小、更不吸引人)。 通过设计,您可以极大地影响玩家的行为。
推荐视频: .
</span
在 VR 关卡设计中,有一个非常重要但又经常被忽视的方面,那就是海拔高度的变化。在游戏空间中行走时,高度不应不断变化。即使是在游戏空间中平移,但在游戏中上下移动一个斜坡,也会造成极大的迷失。 在虚拟现实中,海拔高度的变化应该是
- 有意
- 一致
- 短时间
- 完全使用人工运动(拇指摇杆或跳跃,最好只使用其中一种运动,而不是同时使用两种运动,以获得最大的舒适度)
VRChat 有一个名为 "Walkthrough "的图层;如果将对象设置为该图层,物理对象仍会与之发生碰撞,但玩家将穿过该图层。我建议将大部分家具设置为该图层。
{如果您对关卡设计超级感兴趣,您可以阅读这篇由业内专家撰写的关于该主题的 123 页文档[docs.google.com]。
粒子
Particles([docs.unity3d.com/])</span
关于粒子的一个重要注意事项,您可能已经看到,如果您在游戏中滚动耳机,粒子会随着您的头部动作旋转。如果渲染器选项卡下有 "允许滚动 "选项,请取消勾选。这将解决该问题。
后期处理
使用 VRWorldToolkit 的快速功能,您可以轻松地对场景进行后期处理。
更多信息请阅读 Silent 的帖子。
***如果您想在材质上使用屏幕空间反射效果,可以使用 Moochie 的着色器,但 SSR 经常会损坏,尤其是在 VR 中,而且它的性能成本很高,所以如果您使用它(几乎总是不应该使用),请谨慎使用!!!!!!!!!!
**屏幕失真/翘曲效果绝对不能在 VR 中使用。
就像真实的相机或你的眼睛一样,它可以根据虚拟相机的光线强弱自动调整曝光。进入后期处理卷,在自动曝光下,最重要的设置是最小和最大 EV 值。如果您将鼠标悬停在这些设置上,系统会给出简要说明,如果您需要更多信息,可以点击所有 Unity 组件上带有问号的圆圈。</span
我(基于经验,没有实证或研究,所以不要引用我的观点)建议将最小 EV 设置为 -0.7(至少对于室内),最大 EV 设置为 0.7,曝光补偿设置为 0.7。如果您发现曝光波动太大或太快,可以将最小值和最大值设置为相同的值。
音频
如果是世界音乐,请取消选中启用专业化。
要压缩音频,请将压缩格式设置为 Vorbis,并将滑块调低以获得更多压缩。 如果音频是空间化的,请选中 "强制为单声道"。
Audio-basics-crash-course[ask.vrchat.com]
Udon
Udon 是如何在 VRChat 世界中编写代码的。它是一种可视化脚本语言,这意味着它使用的是块和节点,而不是传统的代码行。 如果您已经了解 C#,并希望使用它来编写您的Udon脚本,您可以使用 UdonSharp[github.com] 这样做。 Udon入门([ask.vrchat.com/])</span VRChat Udon 教程
许多人认为编码是一个令人生畏的黑盒子。作为一名程序员,我可以向你保证,对编码原理的基本了解并不像某些人描述的那样复杂。我能给你的最好建议是
- 慢慢来,不要试图一次学会所有东西
- 在了解一段代码的作用之前,不要涉猎或试图修改它
- 带着逻辑思维去学习
最后一条是最重要的。想一想计算机为达到预期效果而必须完成的确切逻辑步骤。然后将其组合在一起,这主要是一个将逻辑转化为计算机代码的过程。 哦,还有 2 个最重要的提示: *阅读控制台!和 写评论!!!!!!!!!!!!!!!!!!!!!!!!!!。 Unity 基于 C# 运行,因此如果您想开始学习编程语言,C# 将是一个很好的开始。截至发稿时,Brackeys 正在制作一个有关 Unity 编程的系列教程。如何用 C# 编程 YT 播放列表
基础知识
数据类型:
- 布尔 - 真或假
- Int - 整数
- 浮点数--小数
- 字符串--字符集合
注意,C# 中的 ints 是 32 位的,这意味着它们有 ~21 亿的限制,无论正负。超过此限制将导致溢出,从而引发错误。
另外,您还可以使用社区开发的 UdonSharp。它可以将 C# 脚本翻译成 Udon 行为。它更加可靠,如果您有基本的编码经验,我建议您使用它,而不是 Udon 的可视化脚本。
最后的工作(版本控制、优化)
版本控制
如果你在一个世界上投入了大量的时间和精力,那么版本控制是必须的(以免你像我一样最终丢失了你的工作)。版本控制可以跟踪您对项目所做的更改,并允许您将项目还原到之前的状态(如果出了问题,这是不可或缺的)。
<span style="color: 在一个世界中工作,你很可能是一个人在一台电脑上,所以我建议使用 Sourcetree([www.sourcetreeapp.com]。
优化(回顾)
世界创建、优化和社区实验室技巧([docs.vrchat.com/]) 任务内容优化([docs.vrchat.com/])
- 将所有静态设置为静态([将允许光照和遮挡剔除被烘焙])
- 将所有灯光设置为烘焙效果。
- 烤灯
- Bake occlusion culling(烘烤闭塞剔除)。
请记住,遮挡剔除只会影响物体的视觉渲染!视图之外的对象仍会被处理并影响性能!
确保在性能较高的游戏对象上加入切换按钮,例如:
- 物理对象的切换按钮。
- 用于关闭实时灯光阴影的切换按钮(如果您的场景中启用了实时灯光阴影)
- MMIRRORS!!.!这应该是显而易见的,但它们应该具有切换功能,并在默认情况下关闭!
使用 Unity 剖析器!它将帮助您找到世界中导致性能下降最严重的地方!这对于确定如何优化脚本尤其有用!
用 Blender 制作世界(进阶用户)
Blender 中的关卡设计
您可以使用 Probuilder 在 Unity 中对基本关卡设计和形状进行灰盒化,并使用 Probuilder 的导出功能或 FBX 导出器(可在软件包管理器中下载)导出资产,以便在比例不变的情况下进一步修改和细化。
您还可以使用 ArchViz 加载项(如 Archimesh)在 Blender 中完全制作内饰!
定制斜面型材对细节处理(从椅子到楼梯、底板和柱子等)非常有用。
您可以在 Blender 中使用 SHIFT+` 在飞行/行走模式下移动视口,这与 Unity 中的场景导航类似。
如果你想在 Blender 中创建一个与照片相匹配的场景(参考照片非常重要!!),使用免费的 fSpy 来完成第一件事(即排好 3D 摄像头)是非常棒的!
Blender 现在支持 VR 场景查看,支持 Oculus 和 Windows MR。您可以通过选择加入 SteamVR 测试版,使用 Vive 或 Index 进行查看。(Blender 使用 OpenXR,SteamVR 测试版才刚刚开始支持该标准)。
在 Blender 中编辑资产
拓扑结构非常重要;如果您的网格上的拓扑结构不好,将给工作带来不必要的困难。
您在网上找到的大量网格都具有可怕的、不可行的拓扑结构。
There are programs/addons to remesh, including (surprisingly good) free ones:
</span
在 Blender 中为自己的资产建模
与头像不同,您要为世界建模的资产使用不同的工作流程,即硬表面建模。
(超级重要)学习破坏性建模和非破坏性建模之间的区别:</span
--只要看这个就可以了,不用跟读。它使用了名为 HardOps 和 BoxCutter 的付费附加组件,但要理解视频中教授的概念和技术,并不需要这些附加组件。
Hard Surface Modeling in Blender - YT 播放列表,需要熟悉 Blender
在 Blender 中为高多边形网格绘制法线贴图,然后降低多边形数量(高级) </p
世界材质
要想获得理想的介绍,我建议您观看我的 "创建您的第一个 VRChat 世界 "系列中有关材料主题的视频,或阅读其相关脚本。
使用原始页面上列出的 4 种 PBR 着色器之一可以提高视觉质量,还能提供许多附加功能,包括烘焙镜面光照!这将使镜面高光与烘焙光一起出现,而使用标准着色器时则无法实现这一点。
高度(又称位移)贴图
此纹理可嵌入或挤出材质的不同部分。
在 Unity 中,通常应将其设置得很低,否则从某个角度观察材质会破坏效果,这在 VR 中尤为明显。
与其他贴图相比,这些贴图的计算成本更高(因此 Oculus 的文档建议完全不要使用这些贴图)。在某些情况下,这些贴图看起来会很不错,但如果没有必要,则应避免使用。
Originally posted by **docs.unity3d.com**:[](https://steamuserimages-a.akamaihd.net/ugc/1482200421113069055/B12A595A448FB3935AB8004959E86BD66BECEBD8/) "上图中从左到右: 1.已分配反照率的岩壁材质,但没有法线贴图或高度贴图。 2.已指定法线。表面修改了照明,但岩石之间没有相互遮挡。 3.指定了法线贴图和高度贴图的最终效果。岩石似乎从表面突出,较近的岩石似乎遮挡了后面的岩石"。
位移贴图是使用 Unity 中的视差贴图计算的。这是一种性能相对较低的实时近似方法,但也不是非常精确,而且在角度较大时会产生错觉。使用类似 Mochie 标准的着色器,您可以控制视差贴图的 "步数"。
[辅助贴图(细节贴图)& 细节遮罩](https://steamcommunity.com/linkfilter/?url=https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterDetail.html) 用于显示额外的细节或瑕疵,例如表面的裂缝、划痕或皮肤的细小毛孔。Originally posted by **docs.unity3d.com**:[](https://steamuserimages-a.akamaihd.net/ugc/1495711913292348208/F6100F4EA2AC54417FBC244D060FB08092A8D6B9/) 这个角色有皮肤纹理贴图,但还没有细节纹理。我们将添加皮肤毛孔作为细节纹理。
最终结果是,该角色现在的皮肤上有细微的皮肤毛孔细节,分辨率远远高于基础反照率或法线贴图层所允许的分辨率。
细节纹理可以对光线照射表面的方式产生微妙而显著的影响。这是在不同光照环境下的同一个角色。您可以找到许多单独的表面瑕疵贴图。
厚度贴图
用于次表面散射 (SSS),模拟光线穿过材料的情况。皮肤、树叶或布料就是一个很好的例子。
您可以在 Blender 中通过反转法线并烘焙环境光遮蔽生成此贴图。
您需要一个自定义着色器来应用它,比如 Silent 的 photorealistic SSS 着色器。