I’ve been dealing with this issue so much I’m trying to so hard to avoid the limit but everytime it happens, I have a gun game that uses animations a lot for them and the limit is happening so much.
Can you possibly modify and see if you can fix this where if it loads only doesn’t load it for every single id over and over where it’s running it up?
This is urgent stuff it effects anyone else with animation, and it’s ridiclous limit Roblox has.
Program:
function PlayAnimation(ID)
local anim
local char=game.Players.LocalPlayer.Character
if char ~=nil and game.Players.LocalPlaye.Character.Humanoid~=nil then
local id= ID
local oldanim=char:FindFirstChild("LocalAnimation")
if anim~=nil then
anim:Stop()
end
if oldanim~=nil then
if oldanim.AnimationId==id then
oldanim:Destroy()
return
end
oldanim:Destroy()
end
local animation=Instance.new("Animation",char)
animation.Name="LocalAnimation"
animation.AnimationId=id
anim=game.Players.LocalPlayer.Character.Humanoid:LoadAnimation(animation)
anim:Play()
end
end
I believe the issue is that you are calling LoadAnimation every time your animation is played, in other words, you’re loading a unique copy of your animation every time you play it. Instead, you should call LoadAnimation once and store your animations inside a table. Alternatively, share your Animation instance. Rather than passing the ID and creating a new Animation instance and setting the ID every time, pass an Animation instance you’ve already created instead of the ID. Roblox recognizes previously loaded Animation instances iirc.
For example, this is a way you can share the whole loaded AnimationTrack:
local Players = game:GetService("Players")
local loadedAnimations = {}
-- In your play animation bit:
local anim = loadedAnimations[id]
if not anim then
local animation = Instance.new("Animation", char)
animation.Name = "LocalAnimation"
animation.AnimationId=id
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if not humanoid then
return
end
anim = character.Humanoid:LoadAnimation(animation)
loadedAnimations[id] = anim
end
anim:Play()
This would place the loaded animation into a map where you can access it by its ID, that way you’re not repeatedly loading new copies of it.
The error you are getting is due to having 256 loaded AnimationTracks, meaning you have 256 different animations all loaded on the Humanoid at once.
And, the reason that you can load duplicate copies of an animation is because you can actually play multiple of the same animation on top of eachother at once, with different weights, times, etc. So, likely, you’re playing 256 copies of an animation over top of eachother, and just not realizing it because the others are weighted out.
I think GetPlayingAnimationTracks ( ) is the table of loaded tracks. I use this every now and then to check for conflicts, but for you, it should be full.
Edit to add: I name all my tracks “Animation” where is the name of the StringValue in ServerStorage, so that I can, via logic, find any animation track I need.
I only load about 8 animations per Humanoid, so I don’t overload. But here’s a sample code. It’s appears I do the same thing!
Load animation:
function animationLoader.SwapHumanoidAnimation(char,mode)
local specialState = serverStorage.AmbientMovement:FindFirstChild(mode)
local animState = Instance.new("Animation")
animState.Name = specialState.Name.."Animation"
animState.AnimationId = specialState.Value
animState.Parent = char.Humanoid
end
Play animation:
function AnimModule.getTrack(actor, animation, loop) --actor must be humanoid
local animator = actor.Animator or actor:WaitForChild("Animator")
local animationTrack = animator:LoadAnimation(actor:FindFirstChild(animation))
animationTrack.Priority = Enum.AnimationPriority.Action
animationTrack.Looped = loop
animationTrack:Play()
return animationTrack
end
Well look at that, I do call LoadAnimation every time! Oops! lol
Actually, this is the code that might be keeping me from overloading. I stop all tracks before I jump into a new animation.:
function AnimModule.stopTracks(actor, findTrack)
local ActiveTracks = actor:GetPlayingAnimationTracks()
for _,track in pairs(ActiveTracks) do
if track.Name == findTrack then --can remove this if statement to stop all tracks
track:Stop()
-- print(findTrack.." found and stopped on "..actor.Parent.Name)
end
end
end
Are you sure your id variable is correct? If its the wrong capitalization it won’t work, you have a local variable as local id = ID, but, if you removed that the example code I gave won’t work anymore because your argument is ID and I typed id.
Additionally, the reason why I do not just insert the animation into the table with table.insert, or loop over GetPlayingAnimationTracks() is because it still allows for duplicate animations. I use the ID as the table key because a table can only have one value per key, which is why my code works in the first place. That prevents you from loading any animations which contain the same ID, without any unnecessary looping.