播放角色動畫 是表達虛擬人偶和非玩家角色 (NPC) 的重要部分。 提供身临其境的視覺效果外,角色動畫還提供玩家對其行動的回饋、指向環境的提示和關於他們的角色和其他人的重要信息。
使用 危險空間站.rbxl 作為參考,這個教學會顯示您如何使用兩種不同的技術玩角色動畫,包括指南:
- 與自訂動畫資產交換預設角色動畫資產ID。
- 在 3D 空間內對角色進行動畫的觸發。
完成此教學後,您將擁有可自訂遊戲玩法動畫的能力。
變更預設動畫
每個擁有預設 Humanoid 對象的角色,無論是玩家控制的虛擬人偶或非玩家角色 (NPC),都包含一套 預設動畫 ,該動畫會在角色執行特定體驗操作時播放,例如跑步、攀爬和跳躍。 Roblox 為每個
如果這些預設動畫不能滿足您世界環境的設計要求、美觀或總體故事,您可以與您的體驗加入的每個玩家交換自訂動畫,這可以幫助您的角色和體驗感覺更個人、更引人入勝、更身體。這個遊戲設計技術可以幫助您的角色和體驗感覺更自然、更引人入勝、更身體。
為了展示,下一個區域教你如何使用 Creating Character Animations 中的自訂走路動畫來交換預設走路動畫。使用此過程,你可以使用任何預設動畫與自己的動畫資產ID交換。
建立腳本
每個角色的 Humanoid 對象包含一個子對象 Animator ,存儲所有角色的預設動畫。為了設置任何此預設動畫的新資產ID,您必須在 Class.ServiceScriptService 中創建一個指
要建立一個會參照預設動畫資產 ID 的指引程式碼:
在 Explorer 窗口中,加入新的脚本到 ServerScriptService。
- 將鼠標指针指向 ServerScriptService 並按一下 ⊕ 按鈕。
- 從上下文菜單中,插入 指令碼 。
在新的指令碼中,請輸入以下代碼:
local Players = game:GetService("Players")local function onCharacterAdded(character)local humanoid = character:WaitForChild("Humanoid")local animator = humanoid:WaitForChild("Animator")print("Animator found!")local function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)
替換資產 ID
現在您知道您的腳本可以偵測玩家載入並連接到服務伺服器時,您可以修改您的腳本,以特定地參照您想要與自訂動畫交換的動畫 id。
下表包含您可以在 Animator 物件象內呼叫並替換的預設角色動畫。請注意,Idle 有兩個可程式的變體,您可以設定程序來在更多或更少的頻率播放。
角色行動 | 動畫腳本參考 |
執行 | 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 |
游泳 (Idle) | animateScript.swimidle.SwimIdle.AnimationId |
爬攀 | animateScript.climb.ClimbAnim.AnimationId |
要取代預設走路動畫資產ID:
呼叫預設走路動畫指令碼參考,然後將資產ID替換為您自己的自訂動畫資產ID。舉例來說,下列代碼示例從 創建角色動畫 中參考走路環境動畫。
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"local function onPlayerAdded(player)player.CharacterAdded:Connect(onCharacterAdded)endPlayers.PlayerAdded:Connect(onPlayerAdded)測試您的體驗,以確認您自訂的走路動畫會否覆蓋預設動畫。
在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
與您的虛擬人偶在太空站走。
啟動動畫
雖然上一種技術專注於交換角色在特定體驗動作中自動播放的預設動畫,您可以程式化地觸發動畫以在 3D 空間中的任何角色行動中播放,例如撿起一個物品或受到危險的傷害。
這種方法的播放動畫是有用的,因為它提供玩家即時反饋,告訴他們環境中的對象如何與他們交互。要示範的例子,下一個部分會顯示玩家每次接近危險蒸氣漏水時,如何讓玩家潛行地避開牆壁。
插入音量
使用 音量 或 3D 空間中的隱藏區域來觸發獨特遊戲行為是一種常見的方法,以偵測當角色或對象與環境特定區域互動時是否發生。當您與音量結合腳本時,您可以使用碰撞回饋來程式化觸發行動,例如減少玩家的生命值或播放動畫。
添加音量到您的體驗是重要的,因為它只會覆蓋您想要啟動動畫的區域。 如果您的音量太小,玩家可能無法與區域玩家碰撞,進而播放動畫;相反,如果您的音量太大,動畫將在玩家到達區域或目標前播放,並且他們可能無法理解您為什麼要啟動動畫。
要在蒸氣泄漏周圍插入音動畫:
- 在 Explorer 窗口中,添加新的方塊零件。
- 將方塊放置並調整大小,直到它覆蓋您想要啟動動畫的區域。
- 在 屬性 視窗中,
將 名稱 設置在 動畫偵測器 。
將 透明度 設為 1 以隱藏區塊。
建立腳本
現在您已定義了啟動您的動畫的區域,您可以創建一個程式碼,以程式方式偵測當玩家與音量碰撞時是否發生。您可以聽取衝突事件來啟動任何對您的遊戲玩法要求合理的動畫。
舉例來說,此動畫技術使用 LocalScript 而不是 Script 來提供玩家即時反饋,當玩家與音量碰撞時。 如果服務器聽到碰撞並播放此動畫,可能會發生延遲,因為服務器從客戶端聽到碰撞並播放此動畫,而且從
要創建一個本地指令碼,會在本地玩家的角色接觸音量時偵測到:
在 Explorer 窗口中,加入 StartercharacterScripts 的新指令碼。這個放置確保指令碼和其子複製到玩家角色在 和 他們重新返回體驗時。
- 將 新手玩家 擴展,然後將鼠標放在其 新手角色指令碼 子上,然後單擊 ⊕ 按鈕。
- 從上下文菜單中,插入 本地指令碼 並重命名為 觸發動畫。
在新的指令碼中,請輸入以下代碼:
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 指令碼由取得 3D 世界中存在的所有對象開始,這些對象包含在 3D 世界中存在的所有對象。這很重要,因為指令碼需要參照 3D 世界中存在的 Workspace 對象作為您的音量。
每個玩家角色載入或重生回到體驗時,腳本等待:
- 其子 Animation 物件,您將在下一個部分添加。
- 名為 AnimationDetector 的工作區 объ象。
當任何東西與音量發生衝突時, Touched 事件處理器會獲得第一個祖先,這是一個 Model ,這應該是角模型,如果音量與 BasePart 相碰撞,是後代角
- 將彈跳設為 true。
- 播放和等待動畫結束。
- 將 debounce 設定為 false 。
將 debounce 從 false 設定為 true 再設定為 false 後,動畫播放完畢時發生的 debounce 模式是防止動畫再次發生的 debounce 模式,因為玩家在音量上持續碰撞時會造成碰撞次數。對於此 debounce 模式的更多資訊,請參閱 《偵
添加動畫
如果您現在玩測您的體驗,您的 TriggerAnimation 指令碼仍然無法播放因應本地玩家音量碰撞而發生的動畫。這是因為它正在等待一個子對象 Animation 對應的動畫資產ID,並且那個子對象目前並不存在。
要為本地指令碼添加一個動畫,玩家與音量碰撞時參考:
在 Explorer 窗口中,添加新動畫到 TriggerAnimation 。
- 將鼠標指向 觸發動畫 並點擊按鈕。
- 從上下文菜單中,插入 動畫 。
選擇新的動畫物件,然後在 屬性 窗口中,設定 動畫ID 為您想要啟動時玩家觸摸音量的動畫資產ID。例如, 危險太空站 範例會參考 2> rbxassetid://37164687742> 來播放一個角色
測試您的體驗,以確認玩家靠近第一個蒸氣泄漏時您的動畫會播放。