After a few weeks of research, I managed to stitch together a basic afterimage module.
I don’t know how it does performance-wise, but it works and looks good.
Hope someone gets some use out of it.
Media
Pros:
- Looks dope
- Customizable
Cons:
- Can see afterimages through other objects
- Not very optimized
Code:
-- Services --
local Players = game:GetService("Players")
-- Player --
local Player = Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
-- Gui --
local ViewportUi = Instance.new("ScreenGui")
ViewportUi.Name = "ViewportUI"
ViewportUi.Parent = PlayerGui
local TemplateViewportFrame = Instance.new("ViewportFrame")
TemplateViewportFrame.Name = "TemplateViewportFrame"
TemplateViewportFrame.Size = UDim2.new(1, 0, 1.1, 0)
TemplateViewportFrame.AnchorPoint = Vector2.new(0, 0.5)
TemplateViewportFrame.Position = UDim2.new(0, 0, 0.45, 0)
TemplateViewportFrame.BackgroundTransparency = 1
TemplateViewportFrame.Visible = false
TemplateViewportFrame.CurrentCamera = workspace.CurrentCamera
TemplateViewportFrame.Parent = ViewportUi
--- Clones an instance.
-- @param instance object to clone
-- @return ViewportFrame frame containing the clone
local function cloneInstance(instance: Instance): ViewportFrame
local clonedInstance = instance:Clone()
local viewportFrame = TemplateViewportFrame:Clone()
viewportFrame.CurrentCamera = workspace.CurrentCamera
viewportFrame.Name = "AfterImageFrame"
viewportFrame.Visible = true
viewportFrame.Parent = ViewportUi
clonedInstance.Parent = viewportFrame
return viewportFrame
end
--- Activates afterimages for a time.
-- Repeatedly clones instance and renders it through a ViewportFrame.
-- @param instance object to clone
-- @param activeTime time to do afterimages for
-- @param timeBetweenImages time waited before creating afterimages
-- @param transparency base transparency of the afterimages
-- @param fadeInTime time the afterimages take to get to their base transparency
-- @param timeBeforeFadeOut time before afterimages start fading out
-- @param fadeOutTime time it takes for afterimages to fade out
-- @param imageColor color of the afterimages (255, 255, 255 by default)
-- @return nil
return function(instance: Instance, activeTime: number, timeBetweenImages: number, transparency: number, fadeInTime: number, timeBeforeFadeOut: number, fadeOutTime: number, imageColor: Color3?): nil
local archivable = instance.Archivable
-- Make sure object is archivable
if not archivable then
instance.Archivable = true
end
local doAfterImages = true
task.spawn(function()
while doAfterImages do
local clonedInstance = cloneInstance(instance)
if typeof(imageColor) == "Color3" then
clonedInstance.ImageColor3 = imageColor
clonedInstance.LightColor = imageColor
end
task.spawn(function()
-- Fade in
for i = 0, 1 - transparency, 0.1 do
clonedInstance.ImageTransparency = 1 - i
task.wait(fadeInTime / 10)
end
task.wait(timeBeforeFadeOut)
-- Fade out
for i = transparency, 1, 0.1 do
clonedInstance.ImageTransparency = i
task.wait(fadeOutTime / 10)
end
clonedInstance:Destroy()
end)
task.wait(timeBetweenImages)
end
end)
task.wait(activeTime)
doAfterImages = false
instance.Archivable = archivable
return
end
Module:
AfterImages.lua (3.1 KB)