立即開始
中級教學

播放角色動畫

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

播放角色動畫 是使虛擬角色和非可玩角色(NPC)表現生動、真實以及吸引觀眾的重要部分。除了提供沉浸式視覺效果外,角色動畫還向玩家提供其行動的反饋,指導他們如何在環境中導航,以及有關其角色及其他角色的重要信息。

使用 危險太空站 .rbxl 文件作為參考,本教程向您展示如何使用兩種不同技術播放角色動畫,包括指導:

  • 用您自己的自定義動畫替換默認角色動畫資產 ID。
  • 根據角色在 3D 空間中的行動觸發動畫。

完成本教程後,您將擁有為各種遊戲情境自定義動畫的技能。

更改默認動畫

每個帶有默認 Humanoid 對象的角色,無論是玩家控制的虛擬角色還是非玩家角色 (NPC),都包含一組 默認動畫,當角色執行特定的體驗內行為(例如跑步、爬升和跳躍)時會播放這些動畫。Roblox 為每個體驗提供了這些默認動畫,而無需額外的腳本編寫工作。

默認掉落動畫
默認游泳動畫
默認攀爬動畫

然而,如果這些默認動畫不符合您世界的環境、審美或整體敘事設計要求,您可以用適用於每個加入您體驗的玩家的自定義動畫進行替換。

為了演示,以下部分將教授您如何用 創建角色動畫 中的自定義行走循環動畫替換默認行走動畫。使用相同的過程,您可以用自己的動畫資產 ID 替換任何默認動畫。

默認行走動畫
自定義行走動畫

創建腳本

每個角色的 Humanoid 對象包含一個子 Animator 對象,用於存儲角色的所有默認動畫。為了將任何這些默認動畫設置為新的資產 ID,您必須在 ServerScriptService 中創建一個腳本,以便在玩家進入體驗時它可以引用並覆蓋 Animator 對象的默認值。

要創建一個將引用默認動畫資產 ID 的腳本:

  1. Explorer 窗口中,向 ServerScriptService 添加一個新腳本。

    1. 懸停在 ServerScriptService 上,然後單擊 ⊕ 按鈕。
    2. 在上下文菜單中插入一個 Script
  2. 在新腳本中,粘貼以下代碼:


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

ResetDefaultAnimations 腳本首先通過獲取 Players 服務來啟動,該服務包含所有隨著玩家連接到伺服器而存在的 Player 對象。當每個玩家的角色進入體驗時,onCharacterAdded 函數會等到檢測到角色的 HumanoidAnimator 對象。

當它第一次檢測到 Animator 對象時,腳本將打印“找到 Animator!”以告訴您腳本按預期運行。

替換資產 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
游泳(靜止)animateScript.swimidle.SwimIdle.AnimationId
攀爬animateScript.climb.ClimbAnim.AnimationId

要替換默認行走動畫資產 ID:

  1. 調用默認行走動畫腳本引用,然後用您的自定義動畫資產 ID 替換資產 ID。例如,下面的代碼示例引用了來自 創建角色動畫 的行走循環動畫。


    local Players = game:GetService("Players")
    local function onCharacterAdded(character)
    local humanoid = character:WaitForChild("Humanoid")
    local animator = humanoid:WaitForChild("Animator")
    print("找到 Animator!")
    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的中層測試模式下拉菜單中的測試選項。
    2. 用您的角色在太空站內走動。

觸發動畫

雖然前一技術專注於替換默認動畫,這些動畫會在角色執行特定的體驗內行為時自動播放,但您可以以程式方式觸發動畫以響應 任何 角色在 3D 空間中的行動,例如撿起物品或受到危險的傷害。

在此示例中,當玩家觸摸金色平台時,他們觸發一個非默認角色舞蹈動畫。

這種播放動畫的方法很有用,因為它為玩家提供了即時反饋,告訴他們應如何與環境中的物體互動。為了演示,以下部分將向您展示如何觸發動畫,當角色太靠近危險的蒸汽洩漏時,作為一種微妙的方式來教導玩家避免走得太靠近牆壁。

插入體積

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

一幅遠景,顯示了豪宅房間的輪廓。在房間的中央是一個箱子的輪廓,標示著觸發遊戲事件的體積。
杜瓦爾大道之謎使用體積來觸發改變房間視覺外觀的遊戲事件。

在您的體驗中添加體積時,重要的是要調整其大小,使其僅覆蓋您希望觸發動畫的空間。如果將體積做得太小,玩家可能永遠無法與該區域發生碰撞以播放動畫;相反,如果將體積做得太大,動畫可能會在玩家到達物品或感興趣的區域之前播放,並且他們可能不明白他們是如何觸發動畫的。

要在一個蒸汽洩漏周圍插入一個將觸發動畫的體積:

  1. Explorer 窗口中,添加一個新的塊部件。
  2. 調整並重新調整該塊的大小,使其覆蓋您希望觸發動畫的區域。
  3. Properties 窗口中,
    1. 名稱 設置為 AnimationDetector

    2. 透明度 設置為 1 使該塊隱形。

      一個塊的輪廓位於蒸汽洩漏處,以表示體積的位置。

創建腳本

現在您有了一個定義的區域來觸發動畫,是時候創建一個腳本來以程式方式檢測玩家何時與體積發生碰撞。然後,您可以監聽碰撞事件以觸發對於您的遊戲要求有意義的任何動畫。

例如,這種動畫技術使用 LocalScript 而不是 Script 來提供玩家與體積發生碰撞時的即時反饋。如果伺服器用來監聽碰撞並播放動畫,則可能會出現延遲,因為從伺服器到客戶端的複製時間導致玩家在其客戶端觸摸體積和看到動畫播放之間的延遲。

要創建一個本地腳本,以檢測本地玩家的角色何時觸摸體積:

  1. Explorer 窗口中,向 StarterCharacterScripts 添加一個新腳本。這樣的放置確保腳本及其子項在玩家角色加入 以及 當他們重新生成回到體驗時會克隆。

    1. 展開 StarterPlayer,然後懸停在其 StarterCharacterScripts 子項上,單擊 ⊕ 按鈕。
    2. 在上下文菜單中插入一個 LocalScript,並將其重命名為 TriggerAnimation
  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 是否是本地玩家的角色。如果是,函數然後:

  • 將 debounce 設置為 true
  • 播放動畫並等待動畫結束。
  • 將 debounce 設置回 false

將 debounce 從 false 設置為 true,然後再設置回 false,是防止動畫在玩家持續與體積碰撞時重複觸發的一種防抖模式。欲了解有關該防抖模式的更多信息,請參見 檢測碰撞

添加動畫

如果您現在測試您的體驗,您的 TriggerAnimation 腳本仍然無法播放動畫以響應本地玩家與體積的碰撞。這是因為它在等待一個子 Animation 對象,該對象具有可以引用的動畫資產 ID,而該 Animation 對象當前不存在。

要為本地腳本添加一個在玩家與體積碰撞時參考的動畫:

  1. Explorer 窗口中,向 TriggerAnimation 添加一個新動畫。

    1. 懸停在 TriggerAnimation 上,然後單擊 ⊕ 按鈕。
    2. 在上下文菜單中插入一個 Animation
  2. 選擇新的動畫對象,然後在 Properties 窗口中將 AnimationID 設置為當玩家觸摸體積時要觸發的動畫資產 ID。例如, 危險太空站 範例引用 rbxassetid://3716468774 來播放角色向後跌倒的動畫。

  3. 測試您的體驗,以確保當玩家靠近第一個蒸汽洩漏時動畫會播放。

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