Created
January 20, 2023 17:48
-
-
Save spelled-ayayron/1a148cde09c084866ca465b0dd34a075 to your computer and use it in GitHub Desktop.
Generic wrapper for playing animation tracks by name
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- Makes playing and loading tracks into a Animator easy | |
| -- @classmod AnimationPlayer | |
| local RunService = game:GetService("RunService") | |
| local Knit = require(game.ReplicatedStorage.Packages.Knit) | |
| local Signal = require(game.ReplicatedStorage.Packages.Signal) | |
| local AnimationPlayer = {} | |
| AnimationPlayer.__index = AnimationPlayer | |
| AnimationPlayer.ClassName = "AnimationPlayer" | |
| --- Constructs a new animation player | |
| -- @constructor | |
| -- @tparam Animator Animator | |
| function AnimationPlayer.new(Animator) | |
| local self = setmetatable({}, AnimationPlayer) | |
| -- if type(Animator) == "table" then | |
| -- for i, v in pairs(Animator) do | |
| -- print(i, v) | |
| -- end | |
| -- end | |
| self.Animator = Animator or error("No Animator") | |
| self.Tracks = {} | |
| self.FadeTime = 0.2 -- Default | |
| self.TrackPlayed = Signal.new() | |
| self.TrackPlaying = false | |
| self._tracker = RunService.Heartbeat:Connect(function() | |
| for _, track in pairs(self.Tracks) do | |
| if track.IsPlaying then | |
| self.TrackPlaying = true | |
| return | |
| end | |
| end | |
| self.TrackPlaying = false | |
| end) | |
| return self | |
| end | |
| --- Adds an animation to use | |
| function AnimationPlayer:ClearAllTracks() | |
| for i, v in pairs(self.Tracks) do | |
| self.Tracks[i]:Destroy() | |
| self.Tracks[i] = nil | |
| end | |
| return self | |
| end | |
| function AnimationPlayer:RemoveTrack(Name) | |
| if self.Tracks[Name] ~= nil then | |
| self.Tracks[Name]:Destroy() | |
| end | |
| self.Tracks[Name] = nil | |
| return self | |
| end | |
| function AnimationPlayer:WithAnimation(Animation: Animation, name: string | nil) | |
| self.Tracks[name or Animation.Name] = self.Animator:LoadAnimation(Animation) | |
| return self.Tracks[name or Animation.Name] | |
| end | |
| --- Adds an animation to play | |
| function AnimationPlayer:AddAnimation(Name, AnimationId) | |
| local Animation = Instance.new("Animation") | |
| if tonumber(AnimationId) then | |
| Animation.AnimationId = "http://www.roblox.com/Asset?ID=" .. tonumber(AnimationId) or error("No AnimationId") | |
| else | |
| Animation.AnimationId = AnimationId | |
| end | |
| Animation.Name = Name or error("No name") | |
| return self:WithAnimation(Animation) | |
| end | |
| --- Returns a track in the player | |
| function AnimationPlayer:GetTrack(TrackName) | |
| return self.Tracks[TrackName] --or error("Track does not exist") | |
| end | |
| function AnimationPlayer:AdjustWeight(TrackName, weight) | |
| local track = self:GetTrack(TrackName) | |
| track:AdjustWeight(weight) | |
| end | |
| ---Plays a track | |
| -- @tparam string TrackName Name of the track to play | |
| -- @tparam[opt=0.4] number FadeTime How much time it will take to transition into the animation. | |
| -- @tparam[opt=1] number Weight Acts as a multiplier for the offsets and rotations of the playing animation | |
| -- This parameter is extremely unstable. | |
| -- Any parameter higher than 1.5 will result in very shaky motion, and any parameter higher ' | |
| -- than 2 will almost always result in NAN errors. Use with caution. | |
| -- @tparam[opt=1] number Speed The time scale of the animation. | |
| -- Setting this to 2 will make the animation 2x faster, and setting it to 0.5 will make it | |
| -- run 2x slower. | |
| -- @tparam[opt=0.4] number StopFadeTime | |
| function AnimationPlayer:PlayTrack(TrackName, FadeTime, Weight, Speed, StopFadeTime) | |
| FadeTime = FadeTime or self.FadeTime | |
| local Track = self:GetTrack(TrackName) | |
| if not Track.IsPlaying then | |
| self.TrackPlayed:Fire(TrackName, FadeTime, Weight, Speed, StopFadeTime) | |
| self:StopAllTracks(StopFadeTime or FadeTime) | |
| Track:Play(FadeTime, 1, Speed) | |
| else | |
| self.TrackPlayed:Fire(TrackName, FadeTime, Weight, Speed, StopFadeTime) | |
| Track:AdjustWeight(Weight or 0.95) | |
| end | |
| return Track | |
| end | |
| --- Stops a track from being played | |
| -- @tparam string TrackName | |
| -- @tparam[opt=0.4] number FadeTime | |
| -- @treturn AnimationTrack | |
| function AnimationPlayer:StopTrack(TrackName, FadeTime) | |
| FadeTime = FadeTime or self.FadeTime | |
| local Track = self:GetTrack(TrackName) | |
| if Track.IsPlaying then | |
| Track:AdjustWeight(0.0001, FadeTime) | |
| end | |
| return Track | |
| end | |
| --- Stops all tracks playing | |
| function AnimationPlayer:StopAllTracks(FadeTime) | |
| for TrackName, _ in pairs(self.Tracks) do | |
| self:StopTrack(TrackName, FadeTime) | |
| end | |
| end | |
| function AnimationPlayer:GetTracks() | |
| return self.Tracks | |
| end | |
| --- | |
| function AnimationPlayer:Destroy() | |
| self:StopAllTracks() | |
| setmetatable(self, nil) | |
| end | |
| return AnimationPlayer |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment