I’ve created a small module for easy animation control between scripts. It allows inserting/playing/stopping animations from different scripts.
The module is easy to use and can be used on animator (humanoids and animation controllers to)
API :
AnimatorModule.new Creates new “Class” using Animator (Humanoid and Animation Controller works too).
AnimatorModule.new(Instance :: Animator || Humanoid || Animation Controller)
AnimatorModule.GetAnimator returns already existing animator
AnimatorModule.GetAnimator(Instance :: Animator || Humanoid || Animation Controller)
AnimatorModule:GetAnimatorList() returns table with all existing animators
AnimatorModule:GetAnimatorList()
Animator:Play - this requires string argument (given animation name) and plays the given animation. (if this is empty it will result an warning). Speed,Weight and FadeTime are optional
Animator:Play(AnimationName :: string, Speed :: number, Weight :: number, FadeTime :: number)
Animator:Stop This requires string argument (given animation name) and stops the given animation. (if this is empty it will result an warning)
Animator:Stop(AnimationName :: string)
Animator:StopAll Stops all animation
Animator:StopAll()
Animator:GetAnimationList() returns table with all animations names for the given animator instance
Animator:GetAnimationList()
Example:
-- Script #1
local AnimatorModule = require(game.ReplicatedStorage.AnimatorModule)
local Animator = AnimatorModule.new(Animator) -- creates instance to given Animator
(humanoid and animation controller works too)
Animator:InsertAnimation(4123512626,"Epic Animation") -- this works with Animation instance or just the id/link to the animation.
wait(3)
Animator:Stop("Epic Animation") -- stops the animation
And here is the second script
-- Script #2
local AnimatorModule = require(game.ReplicatedStorage.AnimatorModule)
wait(1)
local Animator = AnimatorModule.GetAnimator(Animator) -- gets given Animator
Animator:Play("Epic Animation") -- plays the animation from different script.
Here is the module: Animator Module
Here is the code:
local AnimatorModule = {};
AnimatorModule.__index = AnimatorModule
_G.Animators = _G.Animators or {};
function AnimatorModule.new(Animator : Animator)
if game:GetService("RunService"):IsClient() then warn("Inserting animations for the client will be accessable only on this client. Be aware") end
local self = setmetatable({},AnimatorModule);
self.Animator = Animator;
self.Animations = {};
_G.Animators[Animator] = self
Animator.Parent.AncestryChanged:Connect(function(p)
if not p then
table.remove(Animator,Animator);
end
end)
return self;
end
function AnimatorModule.GetAnimator(Animator : Animator)
return _G.Animators[Animator]
end
function AnimatorModule:InsertAnimation(Animation, Name : string)
Name = Name or "Animation"..#self.Animations;
if typeof(Animation) == "Instance" then
self.Animations[Name] = self.Animator:LoadAnimation(Animation);
else
local rbxasset = tonumber(Animation) and "rbxassetid://"..Animation or Animation;
Animation = Instance.new("Animation");
Animation.AnimationId = rbxasset;
self.Animations[Name] = self.Animator:LoadAnimation(Animation);
end
_G.Animators[self.Animator] = self
end
function AnimatorModule:Play(AnimationName : string, Speed : number, Weight : number, FadeTime : number)
Speed = Speed or 1;
Weight = Weight or 1;
FadeTime = FadeTime or 0.100000001;
if not self.Animator then return end
if _G.Animators[self.Animator].Animations[AnimationName] then
if not _G.Animators[self.Animator].Animations[AnimationName].IsPlaying then
_G.Animators[self.Animator].Animations[AnimationName]:Play(FadeTime,Weight,Speed);
end
else warn("Animation doesnt exist"); end
end
function AnimatorModule:Stop(AnimationName : string)
if not self.Animator then return end
if _G.Animators[self.Animator].Animations[AnimationName] then
if _G.Animators[self.Animator].Animations[AnimationName].IsPlaying then
_G.Animators[self.Animator].Animations[AnimationName]:Stop();
end
else warn("Animation doesnt exist"); end
end
function AnimatorModule:StopAll()
if not self then return end
for _,v in pairs(_G.Animators[self.Animator].Animations) do
v:Stop();
end
end
function AnimatorModule:GetAnimationList()
local anims = {};
for Name,_ in pairs(self.Animations) do table.insert(anims,Name) end;
return anims;
end
function AnimatorModule.GetAnimatorList()
local animators = {};
for _,tabel in pairs(_G.Animators) do
animators[#animators+1] = {FullName = tabel.Animator:GetFullName(), Instance = tabel.Animator}
end;
return animators;
end
return AnimatorModule;