How to make "collective" proximity prompts?

I’m trying to create a door system with proximity prompts. However I do not want to add a script to each door since that’s a pain to maintain and it causes performance issues. From a previous thread I’ve learned that using Collection Service cannot do this. Does anyone know an alternative?

That’s just false, the very documentation for collection services even gives code in order to make doors with a simple .touched mechanism.

Summary
local CollectionService = game:GetService("CollectionService")
 
------------------------------------------------------------------------------ 
-- In this section of the script, we define a Door class. This could be placed in
-- its own independent ModuleScript.
 
-- For more information on this class pattern, check out
-- the object-oriented programming chapter in Programming in Lua:  
-- https://www.lua.org/pil/16.html
 
local Door = {}
Door.__index = Door
Door.TAG_NAME = "Door"
Door.OPEN_TIME = 2
 
function Door.new(door)
	-- Create a table which will act as our new door object.
	local self = {}
	-- Setting the metatable allows the table to access
	-- the SetOpen, OnTouch and Cleanup methods even if we did not
	-- add all of the functions ourself - this is because the
	-- __index metamethod is set in the Door metatable.
	setmetatable(self, Door)
	
	-- Keep track of some door properties of our own
	self.door = door
	self.debounce = false
	
	-- Initialize a Touched event to call a method of the door
	self.touchConn = door.Touched:Connect(function (...)
		self:OnTouch(...)
	end)
	
	-- Initialize the state of the door
	self:SetOpen(false)
	
	-- Print a message so we know when doors are initialized
	print("Initialized door: " .. door:GetFullName())
	
	return self
end
 
function Door:SetOpen(isOpen)
	if isOpen then
		self.door.Transparency = .75
		self.door.CanCollide = false
	else
		self.door.Transparency = 0
		self.door.CanCollide = true
	end
end
 
function Door:OnTouch(part)
	if self.debounce then return end
	local human = part.Parent:FindFirstChild("Humanoid")
	if not human then return end
	self.debounce = true
	self:SetOpen(true)
	wait(Door.OPEN_TIME)
	self:SetOpen(false)
	self.debounce = false
end
 
function Door:Cleanup()
	self.touchConn:disconnect()
	self.touchConn = nil
end
 
------------------------------------------------------------------------------ 
-- In this section of the script, we want to listen for objects with the door
-- tag. When we find one, create a new Door and keep track of it. When the door
-- tag is removed, we'll find the Door we created and destroy it.
 
local doors = {}
 
local doorAddedSignal = CollectionService:GetInstanceAddedSignal(Door.TAG_NAME)
local doorRemovedSignal = CollectionService:GetInstanceRemovedSignal(Door.TAG_NAME)
 
local function onDoorAdded(door)
	if door:IsA("BasePart") then
		-- Create a new Door object and save it
		-- The door class will take over from here!
		doors[door] = Door.new(door)
	end
end
 
local function onDoorRemoved(door)
	if doors[door] then
		-- Clean up an already-existing door
		doors[door]:Cleanup()
		doors[door] = nil
	end
end
 
-- Listen for existing tags, tag additions and tag removals for the door tag 
for _,inst in pairs(CollectionService:GetTagged(Door.TAG_NAME)) do
	onDoorAdded(inst)
end
doorAddedSignal:Connect(onDoorAdded)
doorRemovedSignal:Connect(onDoorRemoved)

All you gotta do is replace the touched mechanism with your own using proximity prompts.

Do you have the link to the thread?

Plus two more tutorials with collection service doors

1 Like

uh here How to trigger a proximity prompt in collection service? - Help and Feedback / Scripting Support - DevForum | Roblox
I’ve tried making a simple script for proximity prompts with collection service but it does not work (seen in the thread)