自訂角色

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

您可以導入自訂網格來創建從 NPC 到動畫帆船布的一切。我們使用了 導入器 的自訂設置來引入更具異國情調的自訂角色,例如神秘的黑洞生物和友好的、雖然不知情的服務機器人。

以下部分將介紹我們如何使用 綁定和皮膚PBR(表面外觀) 和 VFX 來構建我們更複雜的角色之一,我們稱之為「生物」。我們希望它能發光,發出一些光,擁有粒子煙霧的尾跡,並且有流暢的運動,這涉及到用足夠的關節來綁定一個骨架,以創造出令人信服的觸手波浪。

生物橫幅

綁定

當我們為生物進行綁定時,我們發現最好在中立姿勢下建模角色,因為該姿勢最適合向多個方向彎曲。如果我們將生物建模為觸手已經捲曲的樣子,那麼如果我們將觸手動畫設置為向相反方向彎曲,就會導致拉伸。以下截圖顯示了生物的自然狀態:

從中立姿勢開始,我們經濟地添加了關節,專注於需要最多運動的區域。關節越少越好,因為在為角色綁定時,您需要管理它們,並且在動畫時需要控制的內容也會更少。在之前的截圖中,生物看起來在中心有很多關節,但主要身體只有一個關節。

其他大多數關節位於觸手和下顎附近。對於觸手,我們希望有很多次要運動,或者說是分層運動,以創造出它們都在獨立運動的令人信服的效果。然而,觸手的中心質量如此接近,以至於為它們所有人製作關節感覺浪費,無論是在性能還是動畫的努力上。因此,我們將中心質量視為一個大型觸手,並在觸手的末端設置了較小的「尾巴」。

生物前面,Maya

我們發現以下指導方針很有用,以確保角色網格正確導入到 Studio 中:

  • 單獨的關節和骨骼必須具有唯一的名稱。
  • 網格不得與關節和骨骼同名。
  • 網格在綁定之前應該沒有變換;換句話說,變換應為 0,縮放應為 1。
  • 網格法線應面向外(模型不應該看起來是裡外顛倒的)。
  • 骨架不應有任何縮放因子;所有關節應為 [1, 1, 1]。

皮膚

當我們完成生物的骨架後,下一步是為網格進行綁定。綁定可能是一項艱鉅的任務,因此為了簡化問題,最好熟悉您 DCC 應用程序的不同初始綁定設置,以找到您喜歡的設置。 由於這是一個有機角色,我們在每個關節上使用了大量的衰減,並且它們之間有重疊。這樣,彎曲感覺平滑而不尖銳。以下截圖分別顯示了不良綁定和平滑綁定:

不良綁定
平滑綁定

我們發現以下指導方針能產生最佳的綁定結果:

  • 綁定影響(意味著它們在移動時影響模型的一部分)每個頂點最多應有 4 個影響。
  • 關節和網格名稱需要唯一,彼此之間也要唯一。
  • 任何您希望導入到 Studio 的關節必須對模型的綁定有一些影響,否則引擎不會導入它。 盡可能在模型的原始或「綁定」姿勢下進行綁定。

將網格導入到 Studio

將您的自訂角色導入到 Studio 是過程中更令人興奮的部分之一,因為您可以在您正在構建的遊戲中看到您的創作!

要將網格導入到 Studio:

  1. 從 DCC 應用程序導出角色,並確保以下內容:

    • 所有法線、縮放和名稱都是正確的。
    • 角色具有所有關節和骨骼層次結構以及所有網格。
    • 每個網格的三角形數量均低於 10,000。
    • 網格的總大小在任何軸上均不超過 2000 單位。
    • 請參見 網格要求 以獲取完整的模型規範列表。
    生物在 DCC 工具中
  2. 導入器 中,導入自訂的 .fbx.obj 文件。

    生物導入到 Studio

讓生物發光

一旦生物的模型穩定且不再需要立即導入到 Studio,我們開始組裝 SurfaceAppearance 對象、燈光和視覺效果。我們這樣做是為了確保模型的質量足夠好,然後再進行任何一個方面的放置和編輯。

發光生物示例

我們知道我們希望生物是黑暗的,焦點是眼睛和它的「抓握」觸手。高對比度的焦點往往會吸引注意力,因此擁有幾個強烈的焦點可以確保觀眾知道要關注什麼。Studio 支持自我發光的霓虹材料,因此我們早期將眼睛分開,以便它們可以與角色的其餘部分使用不同的材料。我們對觸手做了類似的處理,使它們僅在尖端發光。

生物眼睛在 Studio 中

霓虹材料不會發出實際的光,因此經過一些測試後,我們添加了單獨的部分來控制光的發射位置和方向。這確保了燈光以增強眼睛的發光效果並投射出自己的光源的方式進行定向。

Studio 中的點光源

請注意,SpotLights 在接近其他表面或玩家時為生物增添了視覺效果。

生物光源示例

此外,我們希望生物的觸手能發出一些粒子,以便在移動時留下煙霧尾跡。由於觸手非常長,將 ParticleEmitter 添加到整個觸手會使粒子從整個觸手發射,而不是從尖端。為了解決這個問題,我們在觸手的末端附近使用了一個小部件,以便我們可以控制粒子的發射大小、位置和方向。

粒子示例

讓 VFX 跟隨角色

當生物動畫時,綁定角色的網格位置不會更新,因此我們需要一種方法來確保 VFX、SFX 和燈光都能正確跟隨生物。為此,我們創建了一個 VFX 控制器腳本,並使用 CollectionService 來告知包含 VFX 的部件生物的骨骼位置並跟隨它們。

  1. 我們將以下 LocalScript 放置在 StarterPlayerStarterPlayerScripts 中。這基本上運行 VFX 更新函數。

    Local Script
    -- 將此片段添加到現有的本地腳本中,使其進行 PreSimulation
    -- 連接
    local RunService = game:GetService("RunService")
    local vfx = require(workspace.VfxUpdateModule)
    RunService.PreSimulation:Connect(vfx.updateVfx)
    Module Script
    -- 此模塊將部件附加到動畫上,以便在
    -- 動畫播放時更新。這是對當前限制的變通方法
    -- 與關節和骨骼,並不總是必要。
    --
    -- 前提條件:
    -- 要包含,模型需要有「AnimatedVfxModel」標籤,並且有一個文件夾
    -- 包含所有您希望與動畫同步的部件。每個部件需要
    -- 一個名為「AttachedBoneName」的屬性,指向您希望附加的
    -- 骨骼的名稱。部件也應該已經相對於所需的骨骼
    -- 在正確的位置。
    --
    -- 使用方法:
    -- 本地腳本應該要求此模塊,然後連接
    -- VfxUpdateModule.updateVfx 到 RunService.PreSimulation 事件。
    local VfxUpdateModule = {}
    local CollectionService = game:GetService("CollectionService")
    -- 設置 - 這應該在每個客戶端上運行一次。
    -- 收集所有帶有標籤的模型
    local vfxModels = CollectionService:GetTagged("AnimatedVfxModel")
    local vfxTable = {} -- 我們將在此存儲所有部件和偏移量
    -- 為每個模型分配一個表,該表將保存所有 vfx 部件和偏移量
    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 部件引用了無法找到的骨骼。")
    end
    end
    end
    print(vfxTable)
    -- 更新 - 這應該鏈接到每個客戶端的 RunService.PreSimulation
    -- 遍歷所有模型,然後更新模型上的所有部件以匹配骨骼的 CFrame。
    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. 我們使用其屬性的 標籤 部分將必要的模型組標記為 AnimatedVfxModel。使用標籤可以讓 VFXUpdateModule 知道要查找哪個對象作為第一個 VFX 子項並應用更新。

    Studio 中的 VFX 示例
  4. 最後,我們為希望進行動畫的部件添加了一個 AttachedBoneName 自定義屬性,並添加了我們希望它跟隨的關節的精確名稱。

為生物添加紋理

接下來,我們設置了 PBR(物理基渲染)紋理圖。這些強大的位圖為生物提供了多樣的光澤和表面變化,使其看起來有很多小凸起和瑕疵。這種視覺效果有助於在生物靠近玩家時增強其外觀。

生物紋理比較

以下是我們創建表面外觀紋理圖的方式:

  1. 此角色的紋理圖都在每個圖的「表」上。這使得生物更高效,並意味著我們需要處理的紋理圖或 SurfaceAppearance 對象更少。

  2. 對於需要發光或自我照明的區域,例如「抓握觸手」,我們還在 SurfaceAppearance 上使用了透明度來與這些部分混合。

    照明示例

    我們發現遵循以下指導方針在創建表面外觀紋理圖時很有幫助:

    • 確保您的圖不大於 1024×1024。
    • 根據您工作的應用程序,您的綠色通道可能需要翻轉。

為生物添加動畫

動畫是非常主觀的,並且有個人風格。選項包括動作捕捉、在您的 DCC 應用程序中手動「關鍵幀」動畫,或使用 Studio 強大的 動畫編輯器

正如我們之前提到的,我們希望確保有足夠的關節以實現流暢的運動,以及足夠的肢體,使生物動畫感覺自然且「分層」。分層,也稱為次要運動,是您在日常生活中看到的 — 當您伸出手臂時,每個關節都會對上臂的初始衝動作出反應,您身體中的每個關節不會同時移動或靜止。

我們使用這種技術來使生物的動畫感覺像是肢體在對其身體驅動的運動作出反應,如下所示:

生物動畫示例

如果使用外部 DCC 應用程序進行動畫,我們發現以下指導方針效果最佳:

  • 將幀速率設置為至少 30 FPS。
  • 使用與您應用於的角色相同的角色創建動畫。
  • 將動畫數據導出為單獨的 .fbx 文件。

由於我們在 Studio 外部為角色進行了動畫,我們需要使用 動畫編輯器 導入動畫 .fbx 文件。編輯器允許您選擇任何具有關節或馬達的角色,並通過時間軸中的點來驅動它們。

要導入動畫:

  1. 在工具欄的 角色 標籤中,單擊 片段編輯器

  2. 選擇您希望在 Roblox 中進行動畫的綁定角色。該角色應該是您在外部 DCC 應用程序中綁定的同一個。

  3. 單擊編輯器窗口左上角的 按鈕,選擇 從 FBX 動畫導入,然後找到您導出的 .fbx 動畫文件。

    動畫導入示例 2
  4. 當您對動畫感到滿意時,您可以將其導出以發現動畫 ID,然後您可以在 Roblox 腳本中使用該 ID 來運行它。例如,您可以將 Script 添加到導入角色的模型組中,並使用以下代碼運行動畫:

    動畫腳本示例
    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)

最終結果

在對顏色、光亮度和一些更多粒子效果進行幾次最終調整以在窗戶前給予更強的光環效果後,這是太空站中的最終結果!

最終生物渲染
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。