播放角色动画

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

播放角色动画 是表达虚拟形象和非玩家角色 (NPC) 的重要部分。 除了提供身临其境的视觉效果外,角色动画还为玩家提供了反馈,指导他们如何导航环境,并提供重要的信息。 为其他角色和其他角色提供了重要信息。

使用 危险空间站 .rbxl 文件作为参考,本教程向您展示如何使用两种不同的技术玩角色动画,包括以下指南:

  • 与您自己的自定义动画交换默认角色动画资产ID。
  • 在 3D 空间中回应角色行动的动画。

完成此教程后,您将拥有可以自定义游戏玩法动画的技能。

更改默认动画

每个具有默认 Humanoid 对象的角色,无论是玩家控制的虚拟形象还是非玩家角色 (NPC),包括一组 默认动画 ,它们会在角色执行特定体验操作时播放,例如跑步、攀爬和跳跃。 Roblox 为每个体验提供这些动画,无需任何额外的脚本

默认秋季动画
默认游泳动画
默认攀登动画

如果这些默认动画不能满足您世界的环境、美学或总体故事的设计要求,您可以使用自定义动画与每个加入您体验的玩家交换。 此游戏设计技术可以帮助您的角色和体验更有个性、更有吸沉浸式、更有身临其境。

要示示,下面的部分教您如何使用“创建角色动画”中的自定义走路动画来交换默认走路动画。使用此过程,您可以使用您自己的动画资产ID来交换任何默认动画。

默认步行动画
自定义步行动画

创建脚本

每个角色的 Humanoid 对象包含一个子对象 Animator ,该对象存储所有角色的默认动画。为了将任何此默认动画设置为新的资产ID,您必须在 Class.ServiceScriptService 中创建一个脚本,以便它可以在玩

要创建一个会引用默认动画资源ID的脚本:

  1. Explorer 窗口中,将一个新脚本添加到 ServerScriptService

    1. 将鼠标悬停在 ServerScriptService 上,然后单击 ⊕ 按钮。
    2. 从上下文菜单中,插入一个 脚本
  2. 在新脚本中,粘贴以下验证码:


    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)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

ResetDefaultAnimations 脚本开始时获得 Players 服务,其中包含所有 Player 对象为玩家连接到服务器。当每个玩家的角色加载到体验时, 1> Class.Player

当它检测到一个 Animator 对象时,脚本会打印“找到Animator”,让您知道脚本正常运行。

替换 AssetID

现在您知道您的脚本可以检测到玩家加载并连接到服务器时,您可以修改您的脚本,以具体引用您想要与自定义动画交换的动画 id(s)。

下表包含您可以在 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 found!")
    local animateScript = character:WaitForChild("Animate")
    animateScript.walk.WalkAnim.AnimationId = "rbxassetid://122652394532816"
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(onCharacterAdded)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)
  2. 测试您的体验,以确保您自定义的步行动画覆盖默认动画。

    1. 在菜单栏中,单击 播放 按钮。Studio进入播放测试模式。

      A Studio view of the Home tab with the Play button highlighted.
    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.
杜瓦尔驱动的神秘使用音量来触发视觉效果改变的游戏事件。

添加音量到您的体验是重要的,因为它只覆盖您想要触发动画的空间。 如果您使您的音量过小,玩家可能无法与区域玩家碰撞,从而播放动画;相反,如果您使您的音量过大,动画将在玩家到达区域或目标之前播放,以便他们不会理解您触发动画所做的事。

要插入一个音效会触发动画的蒸汽泄漏:

  1. Explorer 窗口中,添加一个新的方块部分。
  2. 将位置和大小调整到您想要触发动画的区域。
  3. 属性 窗口中,
    1. 名称 设置为 动画侦测器 .

    2. 透明度 设置为 1 以隐藏该区块。

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

创建脚本

现在您已定义了触发您的动画的区域,您可以创建一个使用程序检查规则检查玩家是否与音量碰撞时程序检查的脚本。您可以然后听到可以为您的游戏玩法要求意义的任何动画。

例如,此动画技术使用一个 LocalScript 而不是一个 Script 为玩家提供即时反馈,当他们与音量碰撞时。如果服务器听到碰撞并播放动画,可能会在玩家触摸到音量的客户端上播放动画,因为服务器从客户端复制到服务器的时间有延迟。

要创建一个本地脚本,检测当本地玩家的角色触摸音量时:

  1. Explorer 窗口中,在 StartercharacterScripts 添加一个新脚本。 此放置确保脚本和其子脚本在加入 后重新生成在玩体验角色上。

    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 ,这应该是角色 if BasePart 与音量是一个角色模型的后代。 如果它

  • 将弹跳设置为 true
  • 播放和等待动画结束。
  • 将弹跳返回到 false

将弹跳从 false 设置为 truefalse 再次后弹跳模式是弹跳模式,防止弹跳在玩家不断与音量碰撞时弹跳。有关此弹跳模式的更多信息,请参阅1>检测碰撞1>。

添加动画

如果您现在玩测试您的体验,您的 TriggerAnimation 脚本仍然无法播放本地玩家-音量冲突的动画。 因为它正在等待一个子对象 Animation 对象,它可以参考,并且 Animation 对象不存在。

要为本地脚本添加一个动画,玩家与音量碰撞时参考:

  1. Explorer 窗口中,添加新的动画到 TriggerAnimation

    1. 将鼠标悬停在 TriggerAnimation 上,然后单击 ⊕ 按钮。
    2. 从上下文菜单中,插入一个 动画
  2. 选择新的动画对象,然后在 属性 窗口中,将 AnimationID 设置为您想要触发玩家触摸音量时玩家触摸的音效资产ID。例如, 危险空间站 示例参考 2>rbxassetid://37164687742> 播放一个角色倒下时的动画。

  3. 测试您的体验,以确保您的动画在玩家靠近第一个蒸汽泄露点时播放。