播放角色動畫 是讓虛擬人偶和不可操作的角色 (NPC) 對您的觀眾表達、寫實和引人入勝的重要部分。除了提供身臨其境的視覺外,角色動畫還提供玩家從行動中反饋、環境導航指南以及關於他們角色和其他人的重要資訊。
使用 危險空間站.rbxl 檔案作為參考,本教學會指導您使用兩種不同的技術來播放角色動畫,包括指示如何:
- 使用自訂動畫與預設角色動畫資產ID交換。
- 在 3D 空間內回應角色行動來啟動動畫。
完成此教學後,您將擁有為各種遊戲情況自訂動畫的技能。
變更預設動畫
每個具有預設 Humanoid 對象的角色,無論是玩家控制的虛擬人偶或非玩家角色 (NPC),都包括一組 預設動畫 ,在角色執行特定經驗操作時播放,例如跑步、攀爬和跳躍。Roblox 提供這些動畫給每個體驗,無需額外的編程努力。
然而,如果這些預設動畫不符合你世界環境、美感或整體故事的設計要求,你可以用與每個加入你體驗的玩家相關的自訂動畫來交換它們。這個遊戲設計技巧可以幫助你的角色和體驗感覺更個人、更有吸引力和更沉浸。
為了說明,下一個部分教你如何使用 創建角色動畫 的自訂步行週期動畫來替換預設的步行動畫。使用相同的過程,您可以用自己的動畫資產ID與預設動畫交換任何一個。
創建腳本
每個角色的 Humanoid 對象包含一個兒童 Animator 對象,儲存所有角色的預設動畫。為了將這些預設動畫設置為新資產ID,您必須在 Class.ServiceScriptService 創建一個腳本,以便它可以引用並覆蓋玩家載入體驗時的預設值 Animator 對象。
要創建一個會引用預設動畫資產ID的腳本:
在 檢索器 窗口中,添加新的腳本到 ServerScriptService 。
- 將鼠標懸停在 伺服器腳本服務 上,然後單擊⊕按鈕。
- 從上下文選單中插入 腳本 。
在新的腳本中,貼上以下代碼:
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("Animator found!")endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)
取代資產ID
現在您知道您的腳本能夠偵測玩家載入並連接到服務器時間,您可以修改腳本來特別引用您想與自訂動畫交換的動畫ID(s)。
下表包含所有你可以在 Animator 對象中呼叫和替換的預設角色動畫。請注意,閒置有兩種變化,您可以編程以更多或更少頻率播放。
角色行動 | 動畫腳本參考 |
執行 | animateScript.run.RunAnim.AnimationId |
步行 | animateScript.walk.WalkAnim.AnimationId |
跳 | animateScript.jump.JumpAnim.AnimationId |
閒置 | animateScript.idle.Animation1.AnimationId``animateScript.idle.Animation2.AnimationId |
跌落 | animateScript.fall.FallAnim.AnimationId |
游泳 | animateScript.swim.Swim.AnimationId |
游泳 (閒置) | animateScript.swimidle.SwimIdle.AnimationId |
爬上 | animateScript.climb.ClimbAnim.AnimationId |
要取代預設走路動畫資產ID:
呼叫預設走路動畫腳本參考,然後將assetID替換為自己的自訂動畫assetID。例如,下面的代碼樣本引用來自 創建角色動畫 的步行週期動畫。
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("Animator found!")local animateScript = character:WaitForChild("Animate")animateScript.walk.WalkAnim.AnimationId = "rbxassetid://122652394532816"endlocal function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)測試你的體驗以確保你的自訂走路動畫覆蓋了預設動畫。
在工具欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
使用你的虛擬人偶在太空站周圍走動。
啟動動畫
雖然以前的技巧專注於切換預設動畫,每當角色執行特定經驗動作時自動播放,但您可以通過程式啟動動畫來回應 3D 空間內的任何角色動作,例如撿起物品或受到危險的傷害。
這種播放動畫的方法有用,因為它能讓玩家立即反饋他們應該如何與環境中的物體互動。為了說明,下一個部分向您展示如何在角色靠近危險蒸氣泄漏時觸發動畫,以一種悄悄地教導玩家避免走得太近牆壁的方式。
插入音量
啟動獨特遊戲行為的最常見方法之一是使用 音量 或 3D 空間內的隱形區域偵測角色或物體與環境特定區域互動時間。當您將音量與腳本配對時,您可以使用其碰撞反饋來程式啟動行動,例如減少玩家的生命值或播放動畫。

當將音量添加到您的體驗時,要將其縮放到只覆蓋您想要啟動動畫的空間即可。如果您使音量過小,玩家可能永遠無法碰到區域播放動畫;相反,如果您使音量過大,動畫將在玩家到達物品或感興趣區域之前播放,他們可能不會理解他們是如何啟動動畫的。
要插入會刺激動畫的蒸氣泄漏周圍的音量:
- 在 導航器 窗口中,添加新的方塊部分。
- 位置和縮放方塊,直到它覆蓋你想觸發動畫的區域。
- 在 屬性 窗口中,
將 名稱 設為 動畫偵測器 。
將 透明度 設為 1 以使區塊隱形。
創建腳本
現在您已經擁有啟動動畫的定義區域,是時候創建一個腳本來程式atically偵測玩家與音量碰撞時了。您可以聆聽碰撞事件,以啟動任何對您的遊戲需求有意義的動畫。
例如,這個動畫技巧使用 LocalScript 而不是 Script 來為玩家提供即時反饋,當他們與音量碰撞時。如果伺服器聆聽碰撞並播放動畫,則可能會發生玩家在客戶端觸碰音量並看到動畫播放的延遲,因為從伺服器到客戶端的複製時間會導致延遲。
要創建一個本地腳本,當本地玩家的角色觸碰音量時偵測到:
在 導航器 窗口中,添加新的腳本到 啟動角色腳本 。這種放置方式確保腳本和其子腳本在加入 和 時複製到玩家角色上,當它們重生到體驗中時。
- 擴展 新手玩家 ,然後將鼠標懸停在其 新手角色腳本 子上,然後點擊⊕按鈕。
- 從上下文選單中插入 本地腳本 ,並將其重命名為 啟動動畫 。
在新的腳本中,貼上以下代碼:
local Workspace = game:GetService("Workspace")local animation = script:WaitForChild("Animation")local humanoid = script.Parent:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")local animationTrack = animator:LoadAnimation(animation)local animationDetector = Workspace:WaitForChild("AnimationDetector")local debounce = falseanimationDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")if hitCharacter ~= localCharacter thenreturnenddebounce = trueanimationTrack:Play()animationTrack.Ended:Wait()debounce = falseend)
該 TriggerAnimation 腳本首先獲得 Workspace 服務,其中包含所有存在於 3D 世界中的對象。這很重要,因為腳本需要引用作為你的音量的 Part 對象。
對於每個玩家角色載入或重生到體驗中,腳本等待:
- 其子對象 Animation ,您將在下一節中添加。
- 工作區名為 AnimationDetector 的音量對象。
當任何東西與音量發生碰撞時,Touched會獲得第一個祖先,即Model,這應該是角色,如果碰撞的BasePart與音量相關的字模是角色模型的子孫。如果是,函數然後檢查是否 Model 是 本地 玩家的角色。如果是,那麼功能會:
- 將延遲設為 true。
- 播放並等待動畫結束。
- 將延遲設為 false 。
將從 false 設置到 true 的延遲設置重置為 false 再次播放動畫後,動畫不再重複發生,因為玩家持續與音量碰撞,使動畫無法再次發生。有關此缓冲模式的更多信息,請參閱偵測碰撞。
新增動畫
如果你現在玩測你的體驗,你的 TriggerAnimation 腳本仍然無法在回應本地玩家音量碰撞時播放動畫。這是因為它正在等待一個兒童 Animation 對象擁有一個動畫資產ID,可以參考,而那個 Animation 對象目前不存在。
要為本地腳本添加一個動畫,以便玩家碰撞音量時參考:
在 導航器 窗口中,添加新動畫到 觸發動畫 。
- 將鼠標懸停在 觸發動畫 上,然後點擊 ⊕ 按鈕。
- 從上下文選單中插入 動畫 。
選擇新的動畫對象,然後在 屬性 窗口中,將 動畫ID 設置為玩家觸碰音量時想要觸發的動畫資產ID。例如,危險空間站樣本參考rbxassetid://3716468774。
測試你的體驗以確保你的動畫在玩家靠近第一次蒸氣泄漏時播放。