播放角色動畫

*此內容是使用 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. Name 設置為 AnimationDetector

    2. Transparency 設置為 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 是我們在美國及其他國家地區的部分註冊與未註冊商標。