Skip to content

Animation and avatars

Nova supports classic character rigs and keyframe animations. The modern skinning and avatar-description stack is not implemented yet.

What works

  • Humanoid, Humanoid.RigType (R6 and R15), Humanoid.WalkSpeed, JumpPower/JumpHeight, MoveTo, TakeDamage, state changes.
  • Animator and AnimationController.
  • Animation, AnimationTrack, KeyframeSequence, Keyframe, Pose.
  • Humanoid:LoadAnimation (legacy) and Animator:LoadAnimation.
  • AnimationTrack:Play, Stop, AdjustSpeed, AdjustWeight, GetTimeOfKeyframe, TimePosition, Priority, KeyframeReached.

What is missing

  • Bone and skeletal skinning. Mesh v4/v5 skin data is parsed but not rendered.
  • HumanoidDescription and Humanoid:ApplyDescription.
  • WrapLayer, WrapTarget, layered clothing.
  • SurfaceAppearance and PBR avatar materials.
  • AnimationTrack modern members such as PlaybackState, Completed, DidLoop, Pause, Resume, and Speed.

Playing an animation

local Players = game:GetService("Players")

local function playAnimation(character: Model, animationId: string)
    local humanoid = character:WaitForChild("Humanoid") :: Humanoid
    local animator = humanoid:FindFirstChildOfClass("Animator")

    if not animator then
        animator = Instance.new("Animator")
        animator.Parent = humanoid
    end

    local animation = Instance.new("Animation")
    animation.AnimationId = animationId

    local track = animator:LoadAnimation(animation)
    track.Priority = Enum.AnimationPriority.Action
    track.Looped = false

    track:Play(0.15)
    return track
end

Players.PlayerAdded:Connect(function(player)
    player.CharacterAdded:Connect(function(character)
        task.wait(1)
        playAnimation(character, "rbxassetid://123456789")
    end)
end)

If Animator:LoadAnimation is unavailable in an older place, use Humanoid:LoadAnimation(animation). The engine supplies an Animator for normal characters.

Keyframe events

track.KeyframeReached:Connect(function(keyframeName)
    if keyframeName == "Hit" then
        print("hit frame reached")
    end
end)

GetTimeOfKeyframe(name) returns the time in seconds, which is useful for scheduling effects without listening to every keyframe.

R6 and R15

Enum.HumanoidRigType contains both R6 and R15. Classic R15 rigs work; what does not work is skinned R15 (bone deformation, layered clothing, PBR body materials).

If a place depends on skinned avatars:

  • Replace the avatar with a classic body rig.
  • Bake clothing into textures.
  • Use SpecialMesh/MeshPart bodies rather than SurfaceAppearance.
  • Avoid HumanoidDescription; apply body parts and clothing assets directly.

Avatar customization

There is no HumanoidDescription replacement API. For a character:

  1. Create the rig (R6 or classic R15).
  2. Set body-part colours with BodyColors or per-part BrickColor/Color.
  3. Insert clothing (Shirt, Pants, ShirtGraphic) as instances.
  4. Set body meshes with SpecialMesh or MeshPart.
local bodyColors = character:FindFirstChildOfClass("BodyColors")
if bodyColors then
    bodyColors.HeadColor = BrickColor.new("Bright yellow")
    bodyColors.TorsoColor = BrickColor.new("Bright blue")
    bodyColors.LeftArmColor = BrickColor.new("Bright yellow")
    bodyColors.RightArmColor = BrickColor.new("Bright yellow")
    bodyColors.LeftLegColor = BrickColor.new("Bright green")
    bodyColors.RightLegColor = BrickColor.new("Bright green")
end

Debugging

Symptom Likely cause
Animation does not play The asset ID is wrong, the animation is not owned by the place, or the Animator is missing.
Animation plays but the mesh does not deform Skinned mesh / Bone usage; not supported.
Character has no clothes HumanoidDescription or layered clothing; replace with classic assets.
R15 looks wrong SurfaceAppearance or skinned body; use a classic rig.

Next