组装资产库 是导入和配置体验中中央位置的资产集以便轻松访问和重复使用的过程。这个过程可以节省您在准备构建环境时的大量时间,尤其是如果您配置每个素材的值以提高性能并优化低端设备上的内存使用,那么这个过程将为您节省更多时间。
使用 环境艺术-装配.rbxl,本节环境艺术课程的这一部分向您展示如何从精炼资产中装配资产图书馆,包括步骤说明:
- 从你的可地砖化纹理中创建自定义材料,用于你的地形。
- 为你的修边单创建表面外观对象,并将它们应用到你资产图库中开放的网格上。
- 设置为您的资产渲染参数,以确保在所有设备上的最佳性能。
- 将您的资产转换为包以便您可以在所有项目中更新和重用它们。
完成本节后,您将学习如何以创造性的方式利用资产图书馆来替换或转换灰箱环境,并添加最后的触摸来增强整个 3D 空间。

创建自定义材料
工作室将自定义材料视为 MaterialVariant 对象,位于 MaterialService 内。这些 MaterialVariant 对象具有四个属性,可将四个可切割的 纹理地图 结合,创建具有物理特性的高质量自定义材料:
- MaterialVariant.ColorMap – 代表反射率纹理地图。
- MaterialVariant.MetalnessMap – 代表金属纹理地图。
- MaterialVariant.NormalMap – 代表普通纹理地图。
- MaterialVariant.RoughnessMap – 代表粗糙度纹理地图。
在向这些属性提供纹理地图后,您可以将新的自定义材料应用到两个部分、网格和地形上。你可以使用或修改样本纹理地图 .png 文件来创建最终样品激光标签环境中的粗糙苔、盛放粗糙苔、带石头的粗糙苔以及石头自定义材料,或者你可以使用教程上一节中设计的自己的材料。
要创建MaterialVariant对象为你的可拖动纹理:
在工具栏的 首页 或 模型 选项卡中,单击 材料管理器 按钮。打开 材料管理器 窗口。
在 材料 列表中,选择最接近你可选瓷砖纹理的基础材料。例如,如果你正在创建一个 MaterialVariant 对粗糙苔地砖纹理的物体,选择默认地面材料,以便材料继承其物理属性。
在 工具栏 中,单击 ⊕ 标志。一个新的 MaterialVariant 显示在调色板上,右下角的图标表示它是自定义材料。
在 检查器 中,导航到 一般 部分,然后将材料重命名为与您的可拖动纹理名称一致。
在 纹理地图 部分,在 颜色 右侧,单击 导入 按钮。显示一个文件浏览器。
在文件浏览器中,选择 反射 纹理地图.png,然后选择 打开 按钮。文件浏览器关闭,新颜色地图显示其资产ID。
重复此过程对于 金属性 、 普通 和 粗糙度 纹理地图。自定义材料更新以反映纹理地图。
在 替换 部分中,启用 设为替换 切换以确保当你将地面应用到你的地形时,Studio 使用此自定义材料。
(可选) 如果你正在创建一个代表有机物质的自定义材料,
- 在 地砖 部分,单击 模式 下拉菜单。
- 选择 有机 以随机化输出并减少可见的瓷砖。
重复此过程以包含您想要包含在体验中的每个可复制的纹理。
创建表面外观包
工作室在 SurfaceAppearance 对象内使用修边表,您可以将其传给 MeshParts 包含 UV 数据的对象。与自定义材料类似,SurfaceAppearance 对象具有四个属性,可将四个修边纸板纹理地图结合,创建高质量的 3D 视觉表面处理:
SurfaceAppearance.ColorMap – 代表反射率纹理地图。SurfaceAppearance.MetalnessMap – 代表金属纹理地图。SurfaceAppearance.NormalMap – 代表普通的纹理地图。SurfaceAppearance.RoughnessMap – 代表粗糙度纹理地图。
在向这些属性提供纹理地图之后,您可以使 SurfaceAppearance 对象成为与您的修边单元相关的 MeshPart 对象的子对象,uv数据自动应用到父网格。正因如此,它有用于使 SurfaceAppearance 对象成为 包 以便您可以在所有模块资产和属性中重复使用相同的 SurfaceAppearance 对象。例如,以下所有网格都有与单个 SurfaceAppearance 对象包中代表的同一修边单元布局相关的 UV 数据。

您可以使用或修改示例纹理地图 .png 文件来创建一个 SurfaceAppearance 对样品模块资产和物件的uv数据具有尊重性的对象,或者您可以使用自己在教程的前一节设计的自己的模块资产和物件。
要创建SurfaceAppearance包,这些包可以作为你的模块化套件和道具的子套件:
将 表面外观 对象插入 Workspace .
选择 表面外观 对象,然后在 属性 窗口中选择 颜色地图 属性。弹出窗口显示。
点击 添加图像… 按钮。显示文件浏览器。
选择相应的可瓷砖纹理的 反射率 纹理地图,然后选择 打开 按钮。文件浏览器关闭, 颜色地图 属性更新以新的资产ID。
重复此过程对于 金属地图 、 普通地图 和 粗糙地图 属性,从文件浏览器选择其各自的纹理地图。
在 资源管理器 窗口中,右击 表面外观 对象,然后从上下文菜单中选择 转换为包装 e。显示 转换为包装 对话框。
填写 标题 和 描述 字段,将所有权设置为自己或群组,然后单击 提交 按钮。完成后,一个链接符号会显示在 SurfaceAppearance 对象的图标上,以识别它为包。
(可选) 选择 外观 对象的子 包裹链接 对象,然后在 属性 窗口中启用 自动更新 以自动更新包裹,如果您对 外观 对象进行任何修改。
导入模块化资产和道具
工作室代表您导入的模块资产和道具,作为Model对象的子MeshParts对每个素材件的资产。例如,如果你导入带顶部边缘、底部边缘和墙部件的墙部分,Studio 将 或 文件表示为 墙部分 ,其中包含单独的子文件 顶部边缘 , 底部边缘 , 以及 墙部件 。

使用 3D 导入器,您可以将样品模块化套件和道具导入工作室,用于资产图书馆中使用,或者导入您在上一节教程中设计的任何资产。了解有关此工具功能的更多信息,请参阅3D导入器。
要将模块化资产和道具导入体验:
在工具栏的 首页 或 虚拟形象 选项卡中,单击 导入 3D 按钮。显示文件浏览器。
选择一个.fbx,用于模块资产或属性。
验证对象预览,并检查导入设置是否正确对于您的对象。
验证任何警告或错误消息。
单击 导入 。资产在 Explorer 窗口和视图中显示。
重复这个过程以每个模块资产和属道具。
将所有资产移至你的灰箱几何附近的体验区。这个区域是你的资产库。
应用表面外观数据
当您在第三方建模软件中解开网格上的 UV 过程时,软件将 UV 数据存储在网格的 .fbx 或 .obj 文件中。当你将该网格导入到 Studio 时,结果的 MeshPart 对象保留该数据,但你仍然需要从修剪单中应用带有纹理地图属性的 SurfaceAppearance 对象来显示你的修剪纹理在素材上。
要将SurfaceAppearance纹理地图数据应用到你资产图库中展开的网格:
- 在 浏览器 窗口中,单击您的 表面外观 包,然后按 Ctrl D ( ⌘ D ) 进行复制。
- 将重复的 表面外观 包裹转换为模块资产或属性。资产将其 UV 数据应用到纹理地图并显示其视觉处理。
- 重复这个过程以每个模块资产和属道具。
设置物理和渲染参数
现在您已经将资产放置在 Studio 中,设置物理和渲染参数以允许资产在具有内存和 GPU 限制的设备上保持最高可视质量是很重要的。一般来说,你越遵守本节中的指导方针,你的体验就越高效。然而,重要的是要仔细考虑你计划在整个环境中放置每个资产的上下文,以确保你维持你的审美目标和游戏需求。
已锚定
BasePart.Anchored 属性决定Roblox引擎的物理系统是否会影响对象的位置。当您启用此属性为 Part 或 MeshPart 时,它将物品从经体验中始终运行的动态模拟的物理计算中移除,这意味着物品永远不会因重力或其他物体碰撞而改变位置。
不模拟物理响应的对象更便宜渲染,因为它们不需要那些物理计算所需的 GPU。当你释放 GPU 时,你会提高体验的性能,特别是对于需要保存 GPU 以进行快速游戏的低端设备。正是出于这个原因,每个 资产除了门以外 在最终样品激光标签环境中都被锚定。
可碰撞
BasePart.CanCollide 属性决定对象是否能物理地与其他对象互动。当你为 Part 或 MeshPart 启用此属性时,对象是不可穿透的,Roblox 引擎在物理计算中为它计算。这些计算可能会影响引擎在其物理计算中必须考虑的许多对象时,您的体验性能。
为了缓解性能影响,禁用用户永远不会与之交互的对象的此属性。例如,最终样品激光标签环境禁用此属性对所有叶子。

可触摸
BasePart.CanTouch 属性决定是否发生 Touched 和 TouchEnded 事件在对象上。当您启用此属性为 Part 或 MeshPart 时,Roblox 引擎检查对象的触摸事件状态,以确定是否需要触发或停止事件。
这个过程发生在每个单独的帧上,如果引擎需要一次检查多个对象的触摸事件状态,就可能需要大量的内存。为了缓解这对内存的影响,只有启用此属性才能触发事件的对象。
可查询
BasePart.CanQuery 属性决定 Roblox 引擎是否在空间查询操作中考虑对象,例如射线投射。工作室默认启用此属性,每次 Part 或 MeshPart 即检查是否需要调用空间查询操作,因此意味着引擎检查是否需要调用每个对象的空间查询操作。这个过程发生在每个单独的帧,当引擎需要一次对许多对象进行这些检查时,可能需要大量的内存。
因此,建议禁用此属性对于 Roblox 引擎不需要考虑的空间查询操作的对象。当决定禁用此属性的位置时,请考虑每个资产如何影响游戏玩法。例如,最终样品激光标签环境保留这个属性启用每个建筑中的墙壁,因为引擎需要考虑这些表面,因为用户从激光标签枪发射激光时。如果引擎没有考虑这些资产,那么激光就像没有存在一样直接射穿建筑物。
投射阴影
BasePart.CastShadow 属性决定对象是否投射阴影。当您启用此属性为 Part 或 MeshPart 时,Roblox 引擎在执行时间时计算对象的每个vertex位置,然后从太阳绘制射线到其邻近对象,直到与另一个对象碰撞以创建阴影。
这些计算可能会带来性能成本,尤其是当你有许多几何复杂度的对象时。这是因为具有几何复杂度的对象比具有几何简单度的对象有更多的多边形,这意味着它们有更多的边点需要计算对象的阴影。物体中的多边形越少,操作速度越快,阴影价格越低。

阴影可以为具有 3D 几何深度的对象提供很强的现实感,因此当你决定禁用此属性时,考虑到对象在环境中提供了显著的视觉改进,以及用户会注意到缺少的阴影。例如,叶子的复杂阴影可以提供在用户可能看到它们的户外空间很大的沉浸感,但同样的沉浸感对用户永远不会互动的叶子来说并不是必要的。


双面
MeshPart.DoubleSided 属性决定是否在网格中渲染两个面或多边形。当你为平面 MeshPart 启用此属性时,例如叶子、头发或织物卡片,Roblox 引擎在网格中渲染两个面或多边形,以便用户无论从哪个角度查看对象的完整性。例如,以下树叶是单向平面网格,启用此属性时,任何面向相机的叶子都会对用户可见。


该属性有助于为您的环境添加现实主义,但由于引擎需要渲染对象的边缘两次:一次是面向用户的相镜头的方向,再次是面向用户的相镜头远离的任何网格。因此,它带来了性能成本。为了缓解性能影响的一部分,最终样本激光标签环境仅为叶子启用此属性,因为它具有强大的视觉影响,可以在 3D 空间中实现真实主义。
碰撞忠实度
MeshPart.CollisionFidelity 属性决定了网格或联盟的物理命中箱与其视觉表示之间的匹配程度。默认情况下,这个设置渲染一个与网格几何形状大致相同的命中箱,这意味着用户与对象碰撞的地方与网格的实际几何形状相似。例如,以下图像中的城堡网格有一个默认的命中箱子几乎匹配其几何形状。


您可以将此属性设置为不同值来降低网格命中箱的精度。例如,当你将此属性设置为 船体 时,Roblox 引擎会显著减少网格命中箱的顶点,当你将此属性设置为 箱子 时,引擎将网格命中箱减少到环绕网格的立方体。此外,如果你想提高网格命中箱的精度,你可以将此属性设置为 精确凸起分解 来增加命中箱中的边点数量。



与 BasePart.CastShadow 类似,Roblox 引擎需要渲染的边度越多,性能成本越高。因此,为了确保用户可以与每个网格进行互动以查看是否可以减少引擎需要渲染的网格边盆数量,很重要考虑您希望用户与每个网格进行互动以查看是否可以减少网格需要渲染的边盆数量。在不需要精确的命中箱时,将此属性设置为 箱 或 船体 。
为了展示这一概念,请参考以下显示每个墙模型的命中箱的图像,该图像显示了终极样品激光标签环境的第一层和第二层之间的高度提升。主墙的默认命中箱有很多不必要的几何图形,当仅需要提供一个表面以防止用户在那个方向移动时。如果您将属性设置为 盒子 对于此网格,您可以保留命中箱的目的,同时删除此重复的几何图形。



当你做出这些决定时,考虑如何更改默认值可能会对用户产生负面影响,因为他们正在导航你的环境。例如,如果您将属性设置为 箱 对墙模型的边缘网格,用户如果尝试在墙壁附近跳跃,将与命中箱发生碰撞。相反,将这些网格设置为 船体 ,因此您可以减少其顶点数量,同时保持命中箱更接近网格几何形状。


请注意,精确匹配您网格形状的命中箱可能很重要,尤其是当您需要控制用户是否正确碰撞其形状时。例如,在最终样本激光标签环境中,用户仅与门口边缘碰撞很重要,而不是门口本身,否则他们永远无法进入或离开战斗口袋。

渲染精度
MeshPart.RenderFidelity 属性决定网格显示给用户的细节程度。当您将此属性设置为 Enum.RenderFidelity.Automatic 时,Roblox 引擎会减少网格的精度,用户离网格越远,网格上的每个vertex都会以您所意图的方式渲染,无论距离有多远。当您将此属性设置为 Enum.RenderFidelity.Precise 时,每个vertex的网格都会以您所意图的方式渲染,无论距离有多远。
随着更多对象必须精确地向用户从任何距离渲染,尤其是如果它们有高vertex计数,性能成本会更高。为了缓解性能影响的一部分,将此属性设置为 Enum.RenderFidelity.Performance 对具有几何复杂性的对象,例如样本资产图书馆中的叶子,因为它们不需要从远处显示整个游戏需求。这会降低体验的多边形数量,而不会降低整体视觉质量。
将资产转换为包装
现在您所有的模块资产都在工作室中拥有渲染参数,用于保留其对所有用户的高视觉质量,现在是时候将它们转换为包裹了。将资产转换为包是很重要的,因为它允许你在当前体验和其他项目中反复使用它们。此外,您可以轻松对即时填充到所有实例的包进行编辑,节省了在迭代过程中大量时间。
因为你的 SurfaceAppearance 对象已经包装,当你将你的 Model 对象转换为包装时,它们变成叠加包。嵌套包允许您维护与 Model 对象包独立的复杂子对象层次结构,可以随时修改。这可以让你更好地控制你资产的各个组件。

要将模块化资产和道具转换为包裹:
在 资源管理器 窗口中,右击模块资产或物体,然后从上下文菜单中选择 转换为包装 。显示 转换为包装 对话框。
填写 标题 和 描述 字段,将所有权设置为自己或群组,然后单击 提交 按钮。一旦完成,链接符号会显示在模型的图标上,以识别它为包。
重复这个过程以每个模块资产和属道具。
当你对资产图书馆的整体布局满意后,你可以移至装饰你刚刚抛光的资产环境,并配置 3D 空间的额外元素来将你的世界带入生活。