播放角色動畫

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

播放角色動畫 是讓虛擬人偶和不可操作的角色 (NPC) 對您的觀眾表達、寫實和引人入勝的重要部分。除了提供身臨其境的視覺外,角色動畫還提供玩家從行動中反饋、環境導航指南以及關於他們角色和其他人的重要資訊。

使用 危險空間站.rbxl 檔案作為參考,本教學會指導您使用兩種不同的技術來播放角色動畫,包括指示如何:

  • 使用自訂動畫與預設角色動畫資產ID交換。
  • 在 3D 空間內回應角色行動來啟動動畫。

完成此教學後,您將擁有為各種遊戲情況自訂動畫的技能。

變更預設動畫

每個具有預設 Humanoid 對象的角色,無論是玩家控制的虛擬人偶或非玩家角色 (NPC),都包括一組 預設動畫 ,在角色執行特定經驗操作時播放,例如跑步、攀爬和跳躍。Roblox 提供這些動畫給每個體驗,無需額外的編程努力。

預設墜落動畫
預設游泳動畫
預設攀爬動畫

然而,如果這些預設動畫不符合你世界環境、美感或整體故事的設計要求,你可以用與每個加入你體驗的玩家相關的自訂動畫來交換它們。這個遊戲設計技巧可以幫助你的角色和體驗感覺更個人、更有吸引力和更沉浸。

為了說明,下一個部分教你如何使用 創建角色動畫 的自訂步行週期動畫來替換預設的步行動畫。使用相同的過程,您可以用自己的動畫資產ID與預設動畫交換任何一個。

預設走路動畫
自訂走路動畫

創建腳本

每個角色的 Humanoid 對象包含一個兒童 Animator 對象,儲存所有角色的預設動畫。為了將這些預設動畫設置為新資產ID,您必須在 Class.ServiceScriptService 創建一個腳本,以便它可以引用並覆蓋玩家載入體驗時的預設值 Animator 對象。

要創建一個會引用預設動畫資產ID的腳本:

  1. 檢索器 窗口中,添加新的腳本到 ServerScriptService

    1. 將鼠標懸停在 伺服器腳本服務 上,然後單擊⊕按鈕。
    2. 從上下文選單中插入 腳本
  2. 在新的腳本中,貼上以下代碼:


    local Players = game:GetService("Players")
    local function onCharacterAdded(character)
    local humanoid = character:WaitForChild("Humanoid")
    local animator = humanoid:WaitForChild("Animator")
    print("Animator found!")
    end
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(onCharacterAdded)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

ResetDefaultAnimations 腳本首先獲得 Players 服務,該服務包含玩家連接到服務器時所有的 Player 對象。當玩家的角色皆載入體驗時,onCharacterAdded 功能會等待直到偵測到角色的 HumanoidAnimator 物件為止。

當它第一次偵測到 Animator 對象時,腳本會打印"找到動畫師!"通知您腳本正如預期般運作。

取代資產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:

  1. 呼叫預設走路動畫腳本參考,然後將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"
    end
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(onCharacterAdded)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)
  2. 測試你的體驗以確保你的自訂走路動畫覆蓋了預設動畫。

    1. 在工具欄中,單擊 播放 按鈕。Studio 進入播放測試模式。

      Play button highlighted in Studio's playtesting options.
    2. 使用你的虛擬人偶在太空站周圍走動。

啟動動畫

雖然以前的技巧專注於切換預設動畫,每當角色執行特定經驗動作時自動播放,但您可以通過程式啟動動畫來回應 3D 空間內的任何角色動作,例如撿起物品或受到危險的傷害。

在這個例子中,當玩家觸碰黃金平台時,他們會觸發非預設角色舞蹈動畫。

這種播放動畫的方法有用,因為它能讓玩家立即反饋他們應該如何與環境中的物體互動。為了說明,下一個部分向您展示如何在角色靠近危險蒸氣泄漏時觸發動畫,以一種悄悄地教導玩家避免走得太近牆壁的方式。

插入音量

啟動獨特遊戲行為的最常見方法之一是使用 音量 或 3D 空間內的隱形區域偵測角色或物體與環境特定區域互動時間。當您將音量與腳本配對時,您可以使用其碰撞反饋來程式啟動行動,例如減少玩家的生命值或播放動畫。

A far out view of a mansion room. An outline of a box is in the middle of the room to signify the volume that triggers gameplay events.
Duvall Drive的神秘使用音量觸發會改變房間視覺外觀的遊戲事件。

當將音量添加到您的體驗時,要將其縮放到只覆蓋您想要啟動動畫的空間即可。如果您使音量過小,玩家可能永遠無法碰到區域播放動畫;相反,如果您使音量過大,動畫將在玩家到達物品或感興趣區域之前播放,他們可能不會理解他們是如何啟動動畫的。

要插入會刺激動畫的蒸氣泄漏周圍的音量:

  1. 導航器 窗口中,添加新的方塊部分。
  2. 位置和縮放方塊,直到它覆蓋你想觸發動畫的區域。
  3. 屬性 窗口中,
    1. 名稱 設為 動畫偵測器

    2. 透明度 設為 1 以使區塊隱形。

      An outline of a block is visible around a steam vent to signify the position of the volume.

創建腳本

現在您已經擁有啟動動畫的定義區域,是時候創建一個腳本來程式atically偵測玩家與音量碰撞時了。您可以聆聽碰撞事件,以啟動任何對您的遊戲需求有意義的動畫。

例如,這個動畫技巧使用 LocalScript 而不是 Script 來為玩家提供即時反饋,當他們與音量碰撞時。如果伺服器聆聽碰撞並播放動畫,則可能會發生玩家在客戶端觸碰音量並看到動畫播放的延遲,因為從伺服器到客戶端的複製時間會導致延遲。

要創建一個本地腳本,當本地玩家的角色觸碰音量時偵測到:

  1. 導航器 窗口中,添加新的腳本到 啟動角色腳本 。這種放置方式確保腳本和其子腳本在加入 時複製到玩家角色上,當它們重生到體驗中時。

    1. 擴展 新手玩家 ,然後將鼠標懸停在其 新手角色腳本 子上,然後點擊⊕按鈕。
    2. 從上下文選單中插入 本地腳本 ,並將其重命名為 啟動動畫
  2. 在新的腳本中,貼上以下代碼:


    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 = false
    animationDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    if hitCharacter ~= localCharacter then
    return
    end
    debounce = true
    animationTrack:Play()
    animationTrack.Ended:Wait()
    debounce = false
    end)

TriggerAnimation 腳本首先獲得 Workspace 服務,其中包含所有存在於 3D 世界中的對象。這很重要,因為腳本需要引用作為你的音量的 Part 對象。

對於每個玩家角色載入或重生到體驗中,腳本等待:

  • 其子對象 Animation ,您將在下一節中添加。
  • 角色的 HumanoidAnimator 對象。
  • 工作區名為 AnimationDetector 的音量對象。

當任何東西與音量發生碰撞時,Touched會獲得第一個祖先,即Model,這應該是角色,如果碰撞的BasePart與音量相關的字模是角色模型的子孫。如果是,函數然後檢查是否 Model本地 玩家的角色。如果是,那麼功能會:

  • 將延遲設為 true
  • 播放並等待動畫結束。
  • 將延遲設為 false

將從 false 設置到 true 的延遲設置重置為 false 再次播放動畫後,動畫不再重複發生,因為玩家持續與音量碰撞,使動畫無法再次發生。有關此缓冲模式的更多信息,請參閱偵測碰撞

新增動畫

如果你現在玩測你的體驗,你的 TriggerAnimation 腳本仍然無法在回應本地玩家音量碰撞時播放動畫。這是因為它正在等待一個兒童 Animation 對象擁有一個動畫資產ID,可以參考,而那個 Animation 對象目前不存在。

要為本地腳本添加一個動畫,以便玩家碰撞音量時參考:

  1. 導航器 窗口中,添加新動畫到 觸發動畫

    1. 將鼠標懸停在 觸發動畫 上,然後點擊 ⊕ 按鈕。
    2. 從上下文選單中插入 動畫
  2. 選擇新的動畫對象,然後在 屬性 窗口中,將 動畫ID 設置為玩家觸碰音量時想要觸發的動畫資產ID。例如,危險空間站樣本參考rbxassetid://3716468774

  3. 測試你的體驗以確保你的動畫在玩家靠近第一次蒸氣泄漏時播放。