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)