您可以導入自訂的網格來創建從 NPC 到帆船動畫布的一切。我們使用了 導入器 的自訂設置來引入更異國情調的自訂角色,例如神秘的黑洞生物和友好的、雖然無知的服務機器人。
以下部分介紹了我們如何使用 綁定和皮膚化、PBR(表面外觀) 和 VFX 來構建我們稱之為“生物”的其中一個更複雜的角色。我們希望它會發光,發出一些光,有煙霧粒子拖尾,並且有流暢的運動,這涉及到為一個有足夠關節的綁架進行皮膚化,以創造出其觸手的逼真的波動。

綁定
當我們對生物進行綁定時,我們發現最好在中性姿勢下建模角色,因為該姿勢最適合向多個方向彎曲。如果我們讓生物的觸手已經卷曲,那麼如果我們動畫化觸手向相反方向彎曲時就會出現拉伸。以下截圖展示了生物的自然狀態:


從中性姿勢出發,我們經濟地添加了關節,專注於需要最多運動的區域。關節越少越好,因為在為角色進行皮膚化時您需要管理它們,而且在動畫化時您需要控制的東西會更少。在之前的截圖中,生物的中心看起來有很多關節,但主要的身體只有一個關節。
其他大多數關節都位於觸手和下顎上。對於觸手,我們希望有很多二次運動,或者是會層疊的運動,以創造出一種令人信服的效果,讓它們看起來像是在自主運動。然而,觸手的中央質量如此接近,讓它覺得為所有觸手都製作關節是浪費的,無論是性能還是動畫化的努力。因此,我們將中央質量視為一條大觸手,並在末端處設置了小的“尾部”。

我們發現以下指南很有用,以確保角色網格正確導入到 Studio 中:
- 單獨的關節和骨骼必須有唯一的名稱。
- 網格不得與關節和骨骼同名。
- 網格在進行皮膚化/綁定之前應無變換;換句話說,變換應為 0,縮放應為 1。
- 網格法線應面向外側(模型不應該是裡外顛倒的)。
- 骨架不應有任何比例因子;所有關節應為 [1, 1, 1]。
皮膚化
當我們完成生物的骨架後,下一步是為網格進行皮膚化。皮膚化可能是一項繁瑣的任務,因此為了簡化過程,最好熟悉您 DCC 應用程式的不同初始皮膚化設置,以找到您喜歡的設置。由於這是一個有機角色,我們在每個關節上都進行了大量的減少,並在它們之間進行了重疊。這樣一來,彎曲感覺就會平滑,而不是尖銳。以下截圖顯示了糟糕的皮膚化與平滑的皮膚化:


我們發現以下指南可產生最佳的皮膚化效果:
- 皮膚化影響(意味著它們在移動時影響模型的一部分)每個頂點最多應有 4 個影響。
- 關節和網格名稱需要是唯一的,彼此之間也應唯一。
- 任何您希望導入到 Studio 的關節必須對模型的皮膚化有一些影響,否則引擎不會導入它。 盡可能在模型的原始或“綁定”姿勢下進行皮膚化。
將網格導入到 Studio
將您的自訂角色導入到 Studio 中是這個過程中更令人興奮的部分之一,因為您可以在您正在構建的體驗中看到您的創作!
要將網格導入到 Studio 中:
從 DCC 應用程式中導出角色,並確保以下事項:
- 所有法線、縮放和名稱均正確。
- 該角色擁有所有關節和骨骼層級以及所有網格。
- 每個網格的三角形數量均低於 10,000。
- 網格的總大小在任何軸上均不超過 2000 單位。
- 請參見 網格要求 獲取模型規格的完整列表。

在 導入器 中,導入自訂的 .fbx 或 .obj 文件。

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

我們知道我們希望生物呈現黑暗,而焦點將是眼睛和它的“抓臂”觸手。強對比的高點往往會吸引注意,因此擁有一些強對比的點確保觀眾知道應該集中注意力。Studio 支持自發光的霓虹材料,因此我們在初期將眼睛分開,使它們可以成為與角色其他部分不同的材料。對於觸手,我們也做了類似的事情,讓它們只在尖端發光。

霓虹材料不會發出實際光線,因此經過一些測試後,我們添加了單獨的部分以控制光照的放置和方向。這確保了光照以增強眼睛的光芒的方式進行指向,還能發出自身的光源。

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

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

使視覺效果跟隨角色
當生物動畫化時,皮膚化角色的網格位置不會更新,因此我們需要一種方法來確保 VFX、SFX 和燈光能正確跟隨生物。為了實現這一點,我們創建了一個 VFX 控制器腳本,並使用 CollectionService 來告知包含 VFX 的部件生物的骨骼位置並讓其跟隨。
我們在 StarterPlayer → StarterPlayerScripts 中放置了以下 LocalScript。這基本上運行 VFX 更新函數。
本地腳本-- 將此代碼片段添加到現有的本地腳本中,使其進行 PreSimulation-- 連接local RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)模組腳本-- 此模組將零件附加到動畫中,因此它們在-- 動畫播放時更新。這是針對當前限制的變通方法-- 關於關節和骨骼,並不總是必要的。---- 前提條件:-- 要包含,模型需要標記為 "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 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 部件提及了無法找到的骨骼。")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 的對象在播放事件期間更新。
我們使用其屬性的 標籤 部分將必要的模型組標記為 AnimatedVfxModel。使用標籤允許 VFXUpdateModule 知道要查找哪個對象作為第一個 VFX 子項並應用更新。

最後,我們為想要動畫化的部件添加了一個 AttachedBoneName 自定義屬性,並添加了我們希望它跟隨的關節的精確名稱。
為生物設置材質
接下來,我們設置了 PBR(物理基礎渲染)紋理圖。這些強大的位圖使生物具有不同的光澤和表面變化,使其看起來有許多小的顆粒和瑕疵。這種視覺效果有助於在生物接近玩家時,讓它的外觀更加真實。

以下是我們創建表面外觀紋理圖的過程:
對於需要發光或自發光的區域,例如“抓臂觸手”,我們還在 SurfaceAppearance 上使用了透明度來與這些部件融合。

在創建表面外觀紋理圖時,我們發現遵循以下指南很有幫助:
- 確保您的圖不大於 1024×1024。
- 根據您所使用的應用程序,您的綠色通道可能需要翻轉。
為生物動畫
動畫是非常主觀的,具有個人風格。選項包括動作捕捉、在您的 DCC 應用中手動“關鍵幀”動畫,或使用 Studio 強大的動畫編輯器。
正如我們之前提到的,我們希望確保有足夠多的關節來實現流暢的運動,並且足夠的肢體,以便生物的動作感覺自然且“分層”。分層,也被稱為二次運動,是您在日常生活中看到的東西——當您伸出手臂時,每個關節都在對來自上臂的初始衝擊作出反應,而您身體的每個關節不會同時移動或休息。
我們使用這種技術來動畫化生物,讓肢體感覺像是對身體驅動的運動做出反應,如下所示:

如果使用外部 DCC 應用進行動畫,我們發現以下指南效果最佳:
- 設置幀率至少為 30 FPS。
- 使用與您應用於角色的同一角色創建動畫。
- 將您的動畫數據導出為單獨的 .fbx 文件。
由於我們在 Studio 外部動畫化角色,我們需要使用 動畫編輯器 導入動畫 .fbx 文件。編輯器允許您選擇任何帶有關節或馬達的角色,並通過時間軸中的點驅動它們。
要導入動畫:
在工具欄的 Avatar 標籤中,單擊 Clip Editor。
選擇您想要在 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)
最終結果
在對顏色、光亮度和一些額外的粒子效果進行幾個調整,以在窗戶前呈現更強的光暈效果後,這是太空站中的最終結果!




