I was looking for a solution to my post, and I came across a plugin that does exactly what I wanted. So, I turned it into a module for in-game usage!
Here’s what it looks like in action:
This is a bad example, but you might be starting to see what you can do with this! You could use it for bullet holes, blood, and more.
The code used to make this example:
Summary
local overlayer = require(game:GetService('ReplicatedStorage'):WaitForChild('OverlayModule'))
-- Since skinned meshes won't work in workspace soon
local overlayFolder = Instance.new('Folder')
overlayFolder.Name = 'Overlays'
overlayFolder.Parent = workspace
local decal = Instance.new('Decal')
decal.Texture = "rbxassetid://10422148194"
decal.Face = Enum.NormalId.Top
-- First param is self, which we use for :Update(), second is the actual mesh
-- .new's first param can be 'Low', 'Medium' or 'High'. Performance greatest to least.
local overlay, overlayInstance:BasePart = overlayer.new('High')
overlayInstance.CFrame = CFrame.new(-60, 11.5, -21, 0, -1, 0, 0, 0, 1, -1, 0, 0)
overlayInstance.Size = Vector3.new(4,0,4)
overlayInstance.Transparency = 1
-- Offset will be how much the overlay levitates from the surface
overlayInstance:SetAttribute('Offset', 0.001)
overlayInstance.Parent = overlayFolder
-- And finally, wrap it around the surface!
overlay:Update()
decal.Parent = overlay.overlay
Get the module here. Enjoy, and credit to Sol_ttu for the original plugin!