您可以导入自定义网格来从 NPC 创建所有东西,从船只的动态服装到船员的服装。我们使用 Avatar Importer 的自定义设置导入更多异国情调的自定义角色,例如神秘的黑洞生物和友好的, 如果无知, 服务机器人。
下面的部分涵盖了我们使用 装备和皮肤、 PBR (表面外观) 和 VFX 来构建我们命名为“Creature”的一个最复杂的角色。我们想要让它发光、发出一些光、有泛光阴影的粒子烟雾,并且涉及面部和装备的粘度来创建它令人满意的波浪。
机械设备
当我们正在装备生物时,我们发现最好将角色模型为中立姿势,因为那种姿势最适合弯曲在多个方向。 如果我们模型生物的角色已经弯曲,那么我们的动画将会伸长,如果我们动画角色的角度与生物的角度相反,那么我们会产生伸长。 以下屏幕截图显示了生物在其自然状态:
从中立的姿势,我们从经济的角度添加了关节,并且专注于需要最多移动的区域。 少于关节的数量越多,因为你将需要管理它们在角色皮肤时,你将需要更少的进行控制。 在以前的屏幕截图中,创造物看起来有很多关节在中心,但主体只有一个关接头。
其他大多数关节都指向 tentacles 和 mandibles。 使用 tentacles,我们想要大量的副本动作或交叉动作,以创建一个说服人的效果,他们都在自拥有的位置上移动。 但中心 mass 的 tentacles 感觉很废话,因为它们都在性能和努力上动画。 所以,我们为它们都设计了一个大的 tentacle
我们发现以下指导方针有助于确保角色网格在 Studio 中正确导入:
- 个人共同体和骨骼必须有独特的名称。
- 网格不能与关节和骨头有同一个名称。
- 网格在捆绑前不应有变形;另一种说法是,变形应为0,而捆绑应为1。
- 网格正常应该面向外部(模型不应该看起来像里面)。
- 骨头不应该有任何比例因素;所有关节都应该是[1, 1, 1]。
皮肤
当我们完成了Creature的骨头时,下一步就是皮肤网格。皮肤可以是一项艰巨的任务,因此为了让事情变得更轻松,最好熟悉DCC应用程序的不同初始皮肤设置来找到你喜欢的皮肤。由于这是一个有机角色,所以我们用了很多的褶皱
我们发现以下指南产生了最佳的皮肤蒙皮效果:
- 肤色影响(意味着它们会影响模型中的某个部分)应该是最多 4 个影响 per 垂直面。
- 共同和网格名称需要独特,在每个人和每个人之间。
- 您想要导入到 Studio 的任何关节必须对模型的蒙皮有一些影响,否则引擎不会导入它。 尽可能的话,请在您的模型的原始或“绑定”位置进行皮肤。
导入网格到工作室
将您的自定义角色导入 Studio 是过程中最令人兴奋的部分之一,因为您可以在您正在构建造的体验中看到您的创作!
要将网格导入 Studio:
从 DCC 应用程序导出角色,并确保:
- 所有正常、比例和名称都是正确的。
- 角色有所有共同和骨头层次和所有网格。
- 网格都在每个网格零件下的 10,000 个三角形。
- 网格总大小不超过 2000 个单位在任意轴上。
- 请参阅网格要求以获得完整列出模型规格。
在3D导入器中,导入自定义 .fbx 或 .obj 文件。
使该生物发光
一旦 Creature 的模型稳定且不再需要任何进入 Studio 的即时导入,我们就开始把表面特性对象、灯光和视觉效果组合起来。 我们这么做是为了确保模型的质量足够高,然后才能进行任何对它进行放置和编辑的一部分。
我们知道我们想让生物黑暗,而且焦点是眼睛和其“抓手” tentacles。高对比度会吸引注意力,因此有几个强力的确保视角知道要点。 Studio 支持 neon 材料,因此在早期阶段我们将眼睛从剩余的角色中分离,以便让其自己成为视角。我们对 tentacles 做了一些相似的事情,因
霓虹灯材料不会发出实际光,因此在一些测试后,我们添加了单独的部分来控制灯光的放置和方向。这确保了照明以一种方式发光,以便增强眼睛的辉光,并且也为自己的光源提供了光。
注意,SpotLights 会将视觉效果灯添加到靠近其他表面或玩家的生物附近。
此外,我们希望 Creature 的 tentacles 发出一些粒子,因此它将在移动时留下烟雾踪迹。 因为 tentacles 很长,添加 ParticleEmitter 到整个 tentacle 将使粒子从整个 tentacle 而不是从尖端发射。 为了战斗这种情况,我们使用了一个小部位位于 tentacle
让 VFX 跟随角色
当生成物体时,创建物体的网格位置不会更新,因此我们需要一个方法来确保创建的 VFX、特效和灯光都跟随生物。 为此,我们创建了一个 VFX 控制器脚本,并使用 CollectionService 向零件发送信息,以确保 VFX、特效和灯光跟随生物。 为此,我们还创建了一个 VFX 控制器脚本,并使用 CollectionService 向零件发送信息,以确保 VFX、特效和灯光跟随生物。
我们将以下 LocalScript 放置在 StarterPlayer → StarterPlayerScripts 。这在本质上运行 VFX 更新功能。
本地脚本-- 将此脚本添加到 PreSimulation 的现有本地脚本-- 连接local RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)模块脚本-- 此模块将零件附加到动画,因此它们是更新为-- 动画播放。 它是当前限制的工作方式-- 用关节和骨头,并不总是需要。---- 前提:-- 要被包含,模型需要“AnimatedVfxModel”标签,以及一个文件夹-- 您想要与动画同步的所有部分。每个部分都需要-- 一个名为“AttachedBoneName”的属性,该名称指-- 骨头您想要附加到。零件应该已经在其-- 正确的位置相对于所需的骨。---- 使用:-- LocalScript 应该需要这个模块,然后连接-- 将 VfxUpdateModule.updateVfx 更新到 RunService.PreSimulation 事件。local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- 设置 - 这应该在每个客户端上运行一次。-- 收集所有标签下的模型local vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- 我们将储存所有零件和偏移-- 为每个模型分配一个表,可以容纳所有的特效零件和零件的偏移for _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- 找到VFX文件夹-- 通过属性查找骨头,并为每个部分计算偏移。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 的对象更新在游戏事件上。
我们使用 标签编辑器 标记了必要的模型群组,使用 视图 选项卡访问。使用标签允许 1>VFXUpdateModule1> 知道哪个对象是第一个 VFX 子对象,并应用更新。
最后,我们添加了一个 附加骨头名称 个自定义属性到我们想要动画的部分,并添加了我们想要跟关注的关节的精确名称。
创建怪物的材质
接下来,我们设置了 PBR (物理基础渲染) 材质地图。这些强大的 bitmap 为创造物提供了多种不同的闪光和表面变化,让它看起来像有很多小擦伤和瑕疵。这种视觉效果帮助卖出创造物在玩家靠近时的外观。
我们创建了表面外观地图:
对于需要发光或自我发光的区域,例如“grabby tentacles”,我们还在 SurfaceAppearance 上使用了透明度,以与这些部分进行混合。
我们发现有助于遵循这些指导方针,创建表面外观地图:
- 请确保您的地图不超过 1024×1024。
- 您的绿色通道可能需要翻转,这取决于您工作的应用程序。
动画创造物
动画是很主观的,具有个人风格。选项包括移动捕文本捕捉、手“键框”动画在您的DCC应用中,或使用Studio的强大动画编辑器。
正如我们提到早些时候,我们想确保我们有足够的关节为流体动作,以及足够的手臂,因此创建动画的创建动画感觉自然和“层次感”。 层次,也称为次要动作,是您在日常生活中看到的一件事 – 当您从手臂上扔出时,每个关节都在反应初始 impulse 从上臂,并且您身体的每个关节都不会移动或
我们使用这种技术来动画生物感觉像它的身体反应其身体的运动,如在这里所示:
如果使用外部的 DCC 应用程序为动画,我们发现以下指南最有效:
- 将画面率设置为至少 30 FPS。
- 创建您的动画与您应用它的角色相同。
- 导出您的动画数据为一个单独的 .fbx 文件。
因为我们在 Studio 外面动画角色,所以我们需要使用动画编辑器导入动画 .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)
最终结果
经过几个调整颜色、照明亮度和一些粒子效果后,这就是宇宙空间站在前方窗口前的最终效果!