Afterimage Module

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)

12 Likes

“looks dope”? What a selling point!

1 Like

It’s factual information. It really does “look dope.”

2 Likes