Скрипт: проигрывание анимации персонажа

Скрипт проигрывает анимацию персонажа по нажатию клавиши. Работает он на клиенте: анимация — это показ, и её видят все игроки, потому что движок реплицирует анимации сам.

Куда положить

StarterPlayer → StarterPlayerScripts, тип объекта LocalScript

Что должно быть в проекте

  • Своя анимация, созданная в Animation Editor и загруженная в Roblox
  • Её идентификатор, подставленный вместо нуля в коде

Код

StarterPlayerScripts/PlayEmote.client.lua
  1. local Players = game:GetService("Players")
  2. local UserInputService = game:GetService("UserInputService")
  3.  
  4. local ANIMATION_ID = "rbxassetid://0" -- свой идентификатор
  5.  
  6. local player = Players.LocalPlayer
  7. local track
  8.  
  9. local function prepare(character)
  10. local humanoid = character:WaitForChild("Humanoid")
  11. local animator = humanoid:WaitForChild("Animator")
  12.  
  13. local animation = Instance.new("Animation")
  14. animation.AnimationId = ANIMATION_ID
  15.  
  16. track = animator:LoadAnimation(animation)
  17. track.Priority = Enum.AnimationPriority.Action
  18. end
  19.  
  20. if player.Character then
  21. prepare(player.Character)
  22. end
  23.  
  24. player.CharacterAdded:Connect(prepare)
  25.  
  26. UserInputService.InputBegan:Connect(function(input, processed)
  27. if processed or input.KeyCode ~= Enum.KeyCode.E then
  28. return
  29. end
  30.  
  31. if not track then
  32. return
  33. end
  34.  
  35. if track.IsPlaying then
  36. track:Stop()
  37. else
  38. track:Play()
  39. end
  40. end)

Аргумент processed отсекает нажатия, которые уже забрал интерфейс: иначе анимация запустится во время набора текста в чате.

На что обратить внимание

  • Анимацию нужно создать самому: чужие идентификаторы не сработают и брать их нельзя
  • Приоритет Action перекрывает ходьбу; для замены базовых движений есть отдельные приоритеты
  • Трек перезагружается при каждом респауне — за это отвечает CharacterAdded