您可以导入自定义网格来创建从 NPC 到动画船布的一切。我们使用了 3D 导入器 的自定义设置来引入更多奇异的自定义角色,例如神秘的黑洞生物和友好但未意识到的服务机器人。
以下部分讨论了我们如何使用 扭曲和皮肤 , PBR (表面外观) , 以及 VFX 来构建我们命名为 "生物" 的更复杂角色。我们希望它发光,发出一些光,有粒子烟雾的踪迹,以及涉及皮肤扭曲足以产生说服力的触角的液体运动。

装备
当我们在装备生物时,我们发现最好将角色模型化为中立姿势,因为那个姿势最适合在多个方向弯曲。如果我们模型化了生物的触手已经弯曲,那么如果我们动画了触手弯曲反向,它将导致伸展。以下截图显示了生物在自然状态下:


从中立姿态,我们以经济的方式添加了关节,专注于需要移动最多的区域。越少的连接越好,因为当你皮肤你的角色时,你必须管理它们,当你动画它们时,你将拥有更少的控制权。在以前的截图中,生物看起来像中心有很多关节,但主体只有一个接头。
其他大多数关节都朝向触手和下颌。使用触手,我们想要大量的次要运动,或是分层的运动,来创建一个说服人的效果,即使它们都是独拥有移动。然而,触手的中心质量如此接近,以至于感觉浪费了为它们所有的人制作关节,既在性能上,又在动画上。因此,我们反而将中心质量视为单个较大的触角,其末端离开了中心质量。

我们发现以下指南很有用,因此角色网格导入到 Studio 时无误:
- 个人关节和骨骼必须有独特名称。
- 网格不能与关节和骨头拥有相同的名称。
- 网格在裁剪/绑定之前不应有变形;换言之,变形应为 0 且缩放应为 1。
- 网格正常应面向外部(模型不应从内向外看)。
- 骨架不应有任何缩放因子;所有关节应为 [1, 1, 1]。
皮肤
当我们完成生物的骨架时,下一步是要皮肤网格。皮肤可能是一项艰巨的任务,因此为了让事情更轻松,最好熟悉您 DCC 应用程序的不同初始皮肤设置,以便找到您喜欢的皮肤。由于这是一个有机角色,我们在每个节点和之间的重叠上都加了大量的衰减。这样,弯曲感觉平滑而不锋利。以下截图分别显示了粗略皮肤和光滑皮肤:


我们发现以下指南产生了最好的蒙皮效果:
- 皮肤影响(即它们在移动时影响模型的一部分)应为每个vertex最多 4 个影响。
- 共同和网格名称需要独一无二,既相互之间,又相互之间。
- 你想要导入工作室的任何关节必须对模型的蒙皮有一定影响,否则引擎不会导入它。每当可能的情况下,将你的模型置于原始或“绑定”姿势。
将网格导入到工作室
将自定义角色导入到工作室是过程中最令人兴奋的部分之一,因为你可以在建造的体验中看到你的创作!
要将网格导入到工作室:
从 DCC 应用程序中导出角色,并确保以关注中/正在关注内容:
- 所有正常、缩放和名称都正确。
- 角色拥有所有关节和骨骼层次以及所有网格。
- 网格的每个部分都小于 10,000 个三角形。
- 网格总体积不超过任何轴的 2000 单位。
- 请参阅网格要求获取完整的模型规格列表。
在 3D 导入器 中,导入自定义 .fbx 或 .obj 文件。
让生物发光
一旦生物的模型稳定且不需要进一步导入工作室,我们就开始组合表面外观对象、灯光和视觉效果。我们这样做是为了确保模型的质量足够好,以便进行放置和编辑任何一个方面之前。

我们知道我们希望生物是黑色的,焦点是眼睛和其“粗鲁”的触手。对比度高的点倾向于引起注意,因此拥有一些强的点可以确保观察者知道要关注什么。Studio 支持自发光的霓虹材料,因此我们在早期就将眼睛分开,以便它们可以与其他角色的其余部分形成自己的材料。我们为触手做了类似的事情,所以它们只会在它们的尖端发光。

霓虹材料不发出实际光,因此在进行一些测试后,我们添加了单独的部件来控制光的放置和发射方向。这保证了照明以一种方式被引导,以增强眼睛的发光并且也投射自己的光源。

注意到 SpotLights 将视觉效果添加到靠近其他表面或玩家的生物身上。

此外,我们还希望生物的触手能发射一些粒子,这样它移动时就会留下一道烟雾踪迹。因为触手很长,将 ParticleEmitter 添加到整个触手会使粒子从整个触手而不是尖端发出。为了应对这一问题,我们使用了位于触角末端附近的小部分,因此我们可以控制粒子的发射尺寸、位置和方向。

让 VFX 跟随角色
皮肤角色的网格位置在生物动画时不会更新,因此我们需要一种方法来确保 VFX、SFX 和灯光都正确地跟随生物。为了实现这一目标,我们创建了一个 VFX 控制器脚本并使用 CollectionService 通知包含 VFX 的部件骨头位置以及跟随它们的方式。
我们将以下 LocalScript 放置在 StarterPlayer → StarterPlayerScripts 中。这实际上运行了 VFX 更新函数。
本地脚本-- 将此片段添加到现有的本地脚本中,可以进行预模拟-- 连接local RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)模块脚本-- 该模块将零件附加到动画中,因此它们随着更新而更新-- 动画播放。它是当前限制的解决方案-- 与关节和骨头,并不总是必要的。---- 前提:-- 要被包含,模型需要“AnimatedVfxModel”标签和一个文件夹-- 与动画同步的所有部分。每个部分都需要-- 一个名为“附加骨名称”的属性,指向附加骨的名称-- 你想要附加到的骨。零件也应该已经在它们的-- 与所需骨相对的正确位置。---- 使用:-- 本地脚本应需要此模块,然后连接-- VfxUpdateModule.updateVfx 到 RunService.PreSimulation 事件。local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- 设置 - 这应该在每个客户端运行一次。-- 收集标签的所有模型local vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- 我们将存储所有零件和抵消-- 为每个模型分配一个表,以容纳所有的 vfx 部分和偏移值for _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- 找到 theVFX 文件夹-- 通过属性找到骨头,计算每个部分的偏移量。for _,part in vfxParts dolocal name = part:GetAttribute("AttachedBoneName")local bone = model:FindFirstChild(name, true)if bone thenlocal offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)vfxTable[model][part] = {bone, offset}elsewarn("Vfx part refers to bone that could not be found.")endendendprint(vfxTable)-- 更新 - 这应该链接到每个客户端的 RunService.PreSimulation-- 通过所有模型,然后更新模型上的所有部件匹配骨架。function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModule我们创建了一个 VFXUpdateModule ModuleScript 来告诉任何标记为适当的对象使用 AnimatedVfxModel 在游戏事件上更新。
我们使用 动画视觉效果模型 标记了必要的模型组,可从 视图 选项卡访问。使用标签可以让 VFXUpdateModule 知道哪个对象作为第一个 VFX 子对象寻找,并应用更新。
最后,我们添加了 附加骨名称 自定义属性到我们想要动画的部分,并添加了我们想要跟关注的关节的准确名称。
纹理生物
接下来,我们设置了 PBR(物理基础渲染)纹理地图。这些强大的比图给生物带来各种闪亮和表面变化,让它看起来像有很多小坑和缺陷。这个视觉效果可以帮助卖出生物在接近玩家时的外观。

这是我们如何创建表面外观纹理地图的方法:
对于需要发光或自发光的区域,例如“grabby tentacles”,我们也使用了透明在 SurfaceAppearance 与那些部分融合。
我们发现,在创建表面外观纹理地图时,遵循这些指导方针很有用:
- 确保您的地图不大于 1024×1024。
- 您的绿色通道可能需要根据您工作的应用程序进行翻转。
动画生物
动画非常主观,具有个人风格。选项包括运动捕文本捕捉、在您的 DCC 应用程序中手动“键框”动画或使用 Studio 的强大动画编辑器。
正如我们之前提到的,我们想确保我们有足够的关节为流体运动以及足够的肢体,因此生物的动画感觉自然且“分层”。层叠也被称为次要运动,它是你在日常生活中看到的一件事——当你把手臂扔出去时,每个关节都会反应于上臂的初始冲动,而你身体中的每个关节都不会同时移动或休息。
我们使用了这种技巧来动画生物,让它感觉像是它的身体驱动的运动反应了肢体:

如果使用外部 DCC 应用程序进行动画,我们发现以下指南最适合:
- 将框架率设置为至少 30 FPS。
- 使用与你要应用的角色相同的角色创建你的动画。
- 将您的动画数据导出为单独的 .fbx 文件。
因为我们在工作室之外动画了角色,所以我们需要使用动画编辑器导入动画文件.fbx。编辑器允许您选择具有关节或马达的任何虚拟形象,并通过时间线上的点驱动它们。
要导入动画:
在工具栏的 虚拟形象选项卡 中,打开 动画编辑器 。
选择您想在 Roblox 中动画的装配角色。角色应与您在外部 DCC 应用程序中装配的角色相同。
点击编辑器窗口的左上角的 ⋯ 按钮,选择 从FBX动画导入 ,然后找到你导出的 .fbx 动画文件。
当你对你的动画满意时,你可以将其导出以发现动画 ID,然后使用 Roblox 脚本运行它们。例如,你可以将 Script 添加到导入角色的模型组中,并使用以下代码运行动画:
local animationId = "YOUR_ANIMATION_ID"local char = script.Parentlocal animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")local animation = Instance.new("Animation")animation.AnimationId = "rbxassetid://" .. tostring(animationId)local animTrack = animController:LoadAnimation(animation)animTrack:Play(0, 1, 1)
最终结果
经过几次调整颜色、光亮度和一些更多粒子效果以提供给窗口前更强的光环效果后,这是空间站中的最终结果!
