"Animate"/Animations Issue

I have something that sounds basic but I literally can’t figure out or find any easy solutions for.

How do I add custom animations efficiently? Thus far I’ve used the “Animate” roblox one for animations, it is so messy, and I don’t know how to use it at all right now. it doesn’t even update with new anims as you change the values based on running or not, etc.

Is there a module, a script, or any technique easier and simplier that makes my life easy when tryna add basic animations that change. For example, if someone takes out an ak-47, their running, walking, etc animations change. How do I do proper running animation implementation? Please help if you are experienced in this stuff.

What is the problem you had with the Animate script?
I find editing the animations using that script pretty simple, it has values for each animation and those changes in real time.

As example, a player that equips a tool/gun. When the tool is equipped just change the running value of the script. The player will be using your custom animation when running, and then restore the original animation when the tool is unequipped

script.Parent.Equipped:Connect(function()
      local animateScript = Players.LocalPlayer.Character:WaitForChild("Animate")
      animateScript.run.RunAnim.AnimationId = "rbxassetid://0000000" -- Set your Custom Run Animation
end)
script.Parent.Unequipped:Connect(function()
      local animateScript = Players.LocalPlayer.Character:WaitForChild("Animate")
      animateScript.run.RunAnim.AnimationId = "rbxassetid://913376220" -- Restore Original/Default Roblox Run Animation
end)

This is how I’m currently doing it, the walk works fine, but when I change it to the running animation it doesn’t update. I’ve had issues with Animate for a while, and who knows, maybe I’m using it wrong.

function onChangeAnims(char)
	local Animate = char:FindFirstChild("Animate")
	local AnimIdleOne = Animate:FindFirstChild("idle"):FindFirstChild("Animation1")
	local AnimIdleTwo = Animate:FindFirstChild("idle"):FindFirstChild("Animation2")
	local AnimWalk = Animate:FindFirstChild("walk"):FindFirstChild("WalkAnim")
	local AnimJump = Animate:FindFirstChild("jump"):FindFirstChild("JumpAnim")
	
	local A_V = char:FindFirstChild("Player_Module"):FindFirstChild("Player_Values"):FindFirstChild("Animation_Values")
	local IdleVal = A_V:FindFirstChild("IdleVal")
	local JumpVal = A_V:FindFirstChild("JumpVal")
	local WalkVal = A_V:FindFirstChild("WalkVal")
	local RunVal = A_V:FindFirstChild("RunVal")
	local Running = A_V:FindFirstChild("Running")

	RunService.Heartbeat:Connect(function()
		wait(0.05)
		AnimIdleOne.AnimationId = "http://www.roblox.com/asset/?id="..IdleVal.Value
		AnimIdleTwo.AnimationId = "http://www.roblox.com/asset/?id="..IdleVal.Value
		AnimJump.AnimationId = "http://www.roblox.com/asset/?id="..JumpVal.Value
		
		if Running.Value == true then
			AnimWalk.AnimationId = "http://www.roblox.com/asset/?id="..RunVal.Value
			print("running anim")
		else
			AnimWalk.AnimationId = "http://www.roblox.com/asset/?id="..WalkVal.Value
		end
	end)
end

Why using the heartbeat?
Once you changed the animation id of the animateScript, the new animation will be played when the player runs, until you restore the old one.

One detail about the walking and running animation is, that players on pc, will only trigger the running animation, and the players on mobile/device will trigger walking animation when moving slowly and running animation when moving faster.

You only need to change those values once, I never needed to add a HeartBeat to constantly change them

Pretty much I’m running my animations based on values which can be changed by any script. So when it’s melee or gun animations or anything that needs new idle/walk/run then it changes to that, and the heartbeat is supposed to always update it.

I really don’t think I’m doing it right though, theres gotta be a more efficent and easy way to set up animations with the animate roblox script.

In your game, the players can walk/run no matter if they are on pc?
I mean, in pc only running animation works, not walking.
You have a custom movement system that allows players to normally walk and when pressing a key they can run then?

I usually go with the AnimateScript approach, based on which tool or thing the player equips, that tool/thing instantly changes the AnimateScript with its own animation id, so each tool/gun/thing always updates the animation that the player should use, without reading data from another module.
Then I usually fuse the AnimateScript approach with Animator:LoadAnimation(anim):Play().
So the animations are layered, fusing the running animation with special arms movement or something at the same time. Using the custom animation I did set on the AnimateScript at the same time with some action from the tool too.

I like the AnimateScript, cause its easy and quick to use, but maybe doesnt fit in your case.
Maybe you would wish to disable that module totally, no animations controlled by roblox at all, and handling all anims with your own system, I would need to see more of your gameplay when using the weapons, running, walking, jumping, crouching etc to know better what approach I would suggest

If I wasn’t to use the animatescript, what should I do? How do I go with making my own? Is there any public better modules for it?

Tbh, I dont know any module, I usually never use any public module, unless the task is extremely hard to achieve.

I never made my own animation system.
I would probably go with tool/things events, along with the custom movement system events. Calling a module, sending the movement type of the player, running/walking/crouching etc, and the module should decide the proper animation based on which tool/thing the player is using.
Maybe I would try to avoid reading any Humanoid State events, and I would just handle all animations only from the custom movement system events.
Idk, its only a matter of testing and playing around.