Code Generator | Lua

Roblox Animation Control Script for Characters

This Lua script manages animations in Roblox, controlling idle, walking, jumping, attacking, and equipping a sword. It employs state management to ensure smooth transitions between animations based on player actions.


Empty image or helper icon

Prompt

local Players = game:GetService("Players")
local rs = game:GetService("ReplicatedStorage")

local Player = Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")

local Sword = script.Parent

local Walk
local Idle
local Jump
local Attack
local Equip
local isWalking = false
local isAttacking = false

local function setupAnimations()
    workspace:WaitForChild(Player.Name)
    Character = Player.Character or Player.CharacterAdded:Wait()
    Humanoid = Character:WaitForChild("Humanoid")
    local Animator = Humanoid:WaitForChild("Animator")

    if not Animator then
        warn("Animator not found on Humanoid")
        return
    end

    Walk = Animator:LoadAnimation(rs.Assets.Animations.Walk)
    Idle = Animator:LoadAnimation(rs.Assets.Animations.Idle)
    Jump = Animator:LoadAnimation(rs.Assets.Animations.Jump)
    Attack = Animator:LoadAnimation(rs.Assets.Animations.Attack)
    Equip = Animator:LoadAnimation(rs.Assets.Animations.Equip)

    if not Equip then
        warn("Failed to load Equip animation")
    else
        print("Equip animation loaded successfully")
    end
end

local function stopAnimations()
    if Walk then Walk:Stop() end
    if Idle then Idle:Stop() end
    if Jump then Jump:Stop() end
    if Attack then Attack:Stop() end
    if Equip then Equip:Stop() end
    isWalking = false
    isAttacking = false
end

local function onRunning(speed)
    if Sword.Parent == Character then
        if speed > 0 and not isWalking and Humanoid.MoveDirection.Magnitude > 0 then
            isWalking = true
            Walk:Play()
        elseif speed == 0 and isWalking then
            isWalking = false
            Walk:Stop()
            Idle:Play() -- Start Idle animation when stopping
        end
    end
end

local function onJumping(isJumping)
    if Sword.Parent ~= Character then return end

    if isJumping then
        Jump:Play()
    end
    if isWalking then
        isWalking = false
        Walk:Stop()
        Idle:Play() -- Ensure Idle plays if stopping while jumping
    end
end

local function onEquipped()
    print("Sword equipped")
    if not Equip then
        warn("Equip animation is nil, reloading...")
        Equip = Humanoid:WaitForChild("Animator"):LoadAnimation(rs.Assets.Animations.Equip)
    end
    if Equip then
        print("Playing Equip animation")
        Equip:Play()
    else
        warn("Equip animation is still nil after reload")
    end
    Idle:Play()
    if Humanoid.MoveDirection.Magnitude > 0 then
        isWalking = true
        Walk:Play()
    end
end

local function onUnequipped()
    print("Sword unequipped")
    Idle:Stop()
    isWalking = false
    Walk:Stop()
    isAttacking = false
    Attack:Stop()
    if Equip then
        Equip:Stop()
    end
end

local function onAttack()
    if Sword.Parent == Character and not isAttacking then
        isAttacking = true
        stopAnimations() -- Stop all animations before attack
        Attack:Play()
        Attack.Stopped:Connect(function()
            isAttacking = false
            if not isWalking and Humanoid.MoveDirection.Magnitude == 0 then
                Idle:Play() -- Play Idle animation after attack if not walking
            end
        end)
    end
end

Humanoid.Running:Connect(onRunning)
Humanoid.Jumping:Connect(onJumping)
Sword.Equipped:Connect(onEquipped)
Sword.Unequipped:Connect(onUnequipped)
Sword.Activated:Connect(onAttack)

if Player.Character or Player.CharacterAdded:Wait() then
    stopAnimations()
    setupAnimations()
    if Sword.Parent == Character then
        onEquipped()
    end
end                                                                                                                                               сделай так, что чтобы после завершения анимаций атак при условии что я стою на месте должна работать анимация Idle

Answer

Lua Animation Control Script for Roblox

This script manages character animations in Roblox, focusing on walking, idle, jumping, equipping, and attacking with a sword. The specific requirement is to ensure that the idle animation plays after attacking, provided the character is not moving.

Overview

  • Services Used: Players, ReplicatedStorage.
  • Animations Handled: Walk, Idle, Jump, Attack, and Equip.
  • State Management: Utilizes flags to track whether the character is walking or attacking.

Code Implementation

local Players = game:GetService("Players")
local rs = game:GetService("ReplicatedStorage")

local Player = Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")

local Sword = script.Parent

local Walk, Idle, Jump, Attack, Equip
local isWalking = false
local isAttacking = false

local function setupAnimations()
    workspace:WaitForChild(Player.Name)
    Character = Player.Character or Player.CharacterAdded:Wait()
    Humanoid = Character:WaitForChild("Humanoid")

    local Animator = Humanoid:WaitForChild("Animator")
    if not Animator then
        warn("Animator not found on Humanoid")
        return
    end

    Walk = Animator:LoadAnimation(rs.Assets.Animations.Walk)
    Idle = Animator:LoadAnimation(rs.Assets.Animations.Idle)
    Jump = Animator:LoadAnimation(rs.Assets.Animations.Jump)
    Attack = Animator:LoadAnimation(rs.Assets.Animations.Attack)
    Equip = Animator:LoadAnimation(rs.Assets.Animations.Equip)

    if not Equip then
        warn("Failed to load Equip animation")
    else
        print("Equip animation loaded successfully")
    end
end

local function stopAnimations()
    if Walk then Walk:Stop() end
    if Idle then Idle:Stop() end
    if Jump then Jump:Stop() end
    if Attack then Attack:Stop() end
    if Equip then Equip:Stop() end

    isWalking = false
    isAttacking = false
end

local function onRunning(speed)
    if Sword.Parent == Character then
        if speed > 0 and not isWalking and Humanoid.MoveDirection.Magnitude > 0 then
            isWalking = true
            Walk:Play()
        elseif speed == 0 and isWalking then
            isWalking = false
            Walk:Stop()
            Idle:Play() -- Start Idle animation when stopping
        end
    end
end

local function onJumping(isJumping)
    if Sword.Parent ~= Character then return end
    
    if isJumping then
        Jump:Play()
    end
    if isWalking then
        isWalking = false
        Walk:Stop()
        Idle:Play() -- Ensure Idle plays if stopping while jumping
    end
end

local function onEquipped()
    print("Sword equipped")
    if not Equip then
        warn("Equip animation is nil, reloading...")
        Equip = Humanoid:WaitForChild("Animator"):LoadAnimation(rs.Assets.Animations.Equip)
    end

    if Equip then
        print("Playing Equip animation")
        Equip:Play()
    else
        warn("Equip animation is still nil after reload")
    end
    Idle:Play()
    if Humanoid.MoveDirection.Magnitude > 0 then
        isWalking = true
        Walk:Play()
    end
end

local function onUnequipped()
    print("Sword unequipped")
    Idle:Stop()
    isWalking = false
    Walk:Stop()
    isAttacking = false
    Attack:Stop()
    if Equip then
        Equip:Stop()
    end
end

local function onAttack()
    if Sword.Parent == Character and not isAttacking then
        isAttacking = true
        stopAnimations() -- Stop all animations before attack
        Attack:Play()
        Attack.Stopped:Connect(function()
            isAttacking = false
            if not isWalking and Humanoid.MoveDirection.Magnitude == 0 then
                Idle:Play() -- Play Idle animation after attack if not walking
            elseif isWalking then
                Walk:Play() -- If still moving, continue walking
            end
        end)
    end
end

-- Event Connections
Humanoid.Running:Connect(onRunning)
Humanoid.Jumping:Connect(onJumping)
Sword.Equipped:Connect(onEquipped)
Sword.Unequipped:Connect(onUnequipped)
Sword.Activated:Connect(onAttack)

if Player.Character or Player.CharacterAdded:Wait() then
    stopAnimations()
    setupAnimations()
    if Sword.Parent == Character then
        onEquipped()
    end
end

Key Modifications and Logic

  1. State Management: Utilizes flags (isWalking, isAttacking) for control flow based on user actions.
  2. Animation Control after Attack: Ensures that after an attack, if the character is not moving, the idle animation plays. If moving, the walk animation is played instead.
  3. Robust Connections: Event connections ensure the animations respond accurately to player input.

Conclusion

This code provides a smooth and responsive animation experience for a player character in Roblox. The careful handling of animation states ensures that character movement feels natural during combat and movement, meeting all specified requirements effectively.

For further learning and enhancement of skills in animation within game development, consider checking out courses available on the Enterprise DNA Platform.

Create your Thread using our flexible tools, share it with friends and colleagues.

Your current query will become the main foundation for the thread, which you can expand with other tools presented on our platform. We will help you choose tools so that your thread is structured and logically built.

Description

This Lua script manages animations in Roblox, controlling idle, walking, jumping, attacking, and equipping a sword. It employs state management to ensure smooth transitions between animations based on player actions.