自定义角色

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

您可以导入自定义网格来从 NPC 创建所有东西,从船只的动态服装到船员的服装。我们使用 Avatar Importer 的自定义设置导入更多异国情调的自定义角色,例如神秘的黑洞生物和友好的, 如果无知, 服务机器人。

下面的部分涵盖了我们使用 装备和皮肤、 PBR (表面外观) 和 VFX 来构建我们命名为“Creature”的一个最复杂的角色。我们想要让它发光、发出一些光、有泛光阴影的粒子烟雾,并且涉及面部和装备的粘度来创建它令人满意的波浪。

Creature Banner

机械设备

当我们正在装备生物时,我们发现最好将角色模型为中立姿势,因为那种姿势最适合弯曲在多个方向。 如果我们模型生物的角色已经弯曲,那么我们的动画将会伸长,如果我们动画角色的角度与生物的角度相反,那么我们会产生伸长。 以下屏幕截图显示了生物在其自然状态:

从中立的姿势,我们从经济的角度添加了关节,并且专注于需要最多移动的区域。 少于关节的数量越多,因为你将需要管理它们在角色皮肤时,你将需要更少的进行控制。 在以前的屏幕截图中,创造物看起来有很多关节在中心,但主体只有一个关接头。

其他大多数关节都指向 tentacles 和 mandibles。 使用 tentacles,我们想要大量的副本动作或交叉动作,以创建一个说服人的效果,他们都在自拥有的位置上移动。 但中心 mass 的 tentacles 感觉很废话,因为它们都在性能和努力上动画。 所以,我们为它们都设计了一个大的 tentacle

Creature Front, Maya

我们发现以下指导方针有助于确保角色网格在 Studio 中正确导入:

  • 个人共同体和骨骼必须有独特的名称。
  • 网格不能与关节和骨头有同一个名称。
  • 网格在捆绑前不应有变形;另一种说法是,变形应为0,而捆绑应为1。
  • 网格正常应该面向外部(模型不应该看起来像里面)。
  • 骨头不应该有任何比例因素;所有关节都应该是[1, 1, 1]。

皮肤

当我们完成了Creature的骨头时,下一步就是皮肤网格。皮肤可以是一项艰巨的任务,因此为了让事情变得更轻松,最好熟悉DCC应用程序的不同初始皮肤设置来找到你喜欢的皮肤。由于这是一个有机角色,所以我们用了很多的褶皱

错误的皮肤处理
光滑皮肤处理器

我们发现以下指南产生了最佳的皮肤蒙皮效果:

  • 肤色影响(意味着它们会影响模型中的某个部分)应该是最多 4 个影响 per 垂直面。
  • 共同和网格名称需要独特,在每个人和每个人之间。
  • 您想要导入到 Studio 的任何关节必须对模型的蒙皮有一些影响,否则引擎不会导入它。 尽可能的话,请在您的模型的原始或“绑定”位置进行皮肤。

导入网格到工作室

将您的自定义角色导入 Studio 是过程中最令人兴奋的部分之一,因为您可以在您正在构建造的体验中看到您的创作!

要将网格导入 Studio:

  1. 从 DCC 应用程序导出角色,并确保:

    • 所有正常、比例和名称都是正确的。
    • 角色有所有共同和骨头层次和所有网格。
    • 网格都在每个网格零件下的 10,000 个三角形。
    • 网格总大小不超过 2000 个单位在任意轴上。
    • 请参阅网格要求以获得完整列出模型规格。
    Creature in DCC Tool
  2. 在3D导入器中,导入自定义 .fbx.obj 文件。

    Creature Imported Into Studio

使该生物发光

一旦 Creature 的模型稳定且不再需要任何进入 Studio 的即时导入,我们就开始把表面特性对象、灯光和视觉效果组合起来。 我们这么做是为了确保模型的质量足够高,然后才能进行任何对它进行放置和编辑的一部分。

Glowing Creature Example

我们知道我们想让生物黑暗,而且焦点是眼睛和其“抓手” tentacles。高对比度会吸引注意力,因此有几个强力的确保视角知道要点。 Studio 支持 neon 材料,因此在早期阶段我们将眼睛从剩余的角色中分离,以便让其自己成为视角。我们对 tentacles 做了一些相似的事情,因

Creature Eyes in Studio

霓虹灯材料不会发出实际光,因此在一些测试后,我们添加了单独的部分来控制灯光的放置和方向。这确保了照明以一种方式发光,以便增强眼睛的辉光,并且也为自己的光源提供了光。

Point Light in Studio

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

Creature Light Example

此外,我们希望 Creature 的 tentacles 发出一些粒子,因此它将在移动时留下烟雾踪迹。 因为 tentacles 很长,添加 ParticleEmitter 到整个 tentacle 将使粒子从整个 tentacle 而不是从尖端发射。 为了战斗这种情况,我们使用了一个小部位位于 tentacle

Particle Example

让 VFX 跟随角色

当生成物体时,创建物体的网格位置不会更新,因此我们需要一个方法来确保创建的 VFX、特效和灯光都跟随生物。 为此,我们创建了一个 VFX 控制器脚本,并使用 CollectionService 向零件发送信息,以确保 VFX、特效和灯光跟随生物。 为此,我们还创建了一个 VFX 控制器脚本,并使用 CollectionService 向零件发送信息,以确保 VFX、特效和灯光跟随生物。

  1. 我们将以下 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 do
    vfxTable[model] = {}
    local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- 找到VFX文件夹
    -- 通过属性查找骨头,并为每个部分计算偏移。
    for _,part in vfxParts do
    local name = part:GetAttribute("AttachedBoneName")
    local bone = model:FindFirstChild(name, true)
    if bone then
    local offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)
    vfxTable[model][part] = {bone, offset}
    else
    warn("Vfx part refers to bone that could not be found.")
    end
    end
    end
    print(vfxTable)
    -- 更新 - 这应该被链接到每个客户端的 RunService.PreSimulation
    -- 通过所有模型,然后更新所有部分在模型上,以匹配骨头框架。
    function VfxUpdateModule.updateVfx()
    for model, vfxParts in vfxTable do
    for part, bone in vfxParts do
    part.CFrame = bone[1].TransformedWorldCFrame * bone[2]
    end
    end
    end
    return VfxUpdateModule
  2. 我们创建了一个 VFXUpdateModule ModuleScript 来告诉任何带有 AnimatedVfxModel 的对象更新在游戏事件上。

  3. 我们使用 标签编辑器 标记了必要的模型群组,使用 视图 选项卡访问。使用标签允许 1>VFXUpdateModule1> 知道哪个对象是第一个 VFX 子对象,并应用更新。

    VFX In Studio Example
  4. 最后,我们添加了一个 附加骨头名称 个自定义属性到我们想要动画的部分,并添加了我们想要跟关注的关节的精确名称。

创建怪物的材质

接下来,我们设置了 PBR (物理基础渲染) 材质地图。这些强大的 bitmap 为创造物提供了多种不同的闪光和表面变化,让它看起来像有很多小擦伤和瑕疵。这种视觉效果帮助卖出创造物在玩家靠近时的外观。

Creature Texturing Comparison

我们创建了表面外观地图:

  1. 这个角色的所有材质都在一个“单一纸张”上。这使得生物更有效率,并且我们需要处理更少的材质地图或 SurfaceAppearance 对象。

  2. 对于需要发光或自我发光的区域,例如“grabby tentacles”,我们还在 SurfaceAppearance 上使用了透明度,以与这些部分进行混合。

    Illumination Example

    我们发现有助于遵循这些指导方针,创建表面外观地图:

    • 请确保您的地图不超过 1024×1024。
    • 您的绿色通道可能需要翻转,这取决于您工作的应用程序。

动画创造物

动画是很主观的,具有个人风格。选项包括移动捕文本捕捉、手“键框”动画在您的DCC应用中,或使用Studio的强大动画编辑器。

正如我们提到早些时候,我们想确保我们有足够的关节为流体动作,以及足够的手臂,因此创建动画的创建动画感觉自然和“层次感”。 层次,也称为次要动作,是您在日常生活中看到的一件事 – 当您从手臂上扔出时,每个关节都在反应初始 impulse 从上臂,并且您身体的每个关节都不会移动或

我们使用这种技术来动画生物感觉像它的身体反应其身体的运动,如在这里所示:

Creature Animation Example

如果使用外部的 DCC 应用程序为动画,我们发现以下指南最有效:

  • 将画面率设置为至少 30 FPS。
  • 创建您的动画与您应用它的角色相同。
  • 导出您的动画数据为一个单独的 .fbx 文件。

因为我们在 Studio 外面动画角色,所以我们需要使用动画编辑器导入动画 .fbx 文件。 编辑器允许您选择任何带有关节或电机的角色,并通过时间轴上的点驱动它们。

要导入动画:

  1. 在插件选项卡中,选择动画编辑器。

    Animation Editor In Studio
  2. 选择您想要在 Roblox 中动画的装备角色。该角色应该与您在外部 DCC 应用中装备的角色相同。

  3. 点击编辑器窗口的左上角的按钮,选择从 FBX 动画导入,然后找到您导出的 .fbx 动画文件。

    Animation Import Example 1 Animation Import Example 2
  4. 当您对您的动画满意时,您可以将其导出到发现动画 ID,然后您可以在 Roblox 脚本中使用它们。例如,您可以将 Script 添加到导入角色的模型组中,使用以下代码运行动画:

    Animation Script Example

    local animationId = "YOUR_ANIMATION_ID"
    local char = script.Parent
    local 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)

最终结果

经过几个调整颜色、照明亮度和一些粒子效果后,这就是宇宙空间站在前方窗口前的最终效果!

Final Creature Rendering