Hello Roblox Developers!
Today, I decided to share my knowledge on how to make a Key Card door since many of the tutorials on YouTube either give links to models or show you how to make a CanCollide on/off door.
What will we use to achieve this?
- Tween Service
- Touched Events
I know right! Only 2 simple concepts!
Let’s get started by creating the door itself! First, create the door frame!
Here is what I have created:
Make sure it is anchored and grouped. Call the group ‘Frame’.
Now, create the actual door!
Here’s mine:
Group this and call it ‘Door’! Remember to unanchor all the parts in this group. This is so we can freely move the door around.
Now, create a new part and call it ‘Root’. This is where the door will turn around at.
Paste the following code in your command bar:
local Selection = game:GetService("Selection"):Get()[1]
local NormalIds = {
[Enum.NormalId.Top] = BrickColor.new("Lime green").Color,
[Enum.NormalId.Front] = BrickColor.new("Really blue").Color,
[Enum.NormalId.Right] = BrickColor.new("Really red").Color
}
for NormalId, HandleColor in pairs(NormalIds) do
local Handles = Instance.new("Handles")
Handles.Color3 = HandleColor
Handles.Style = Enum.HandlesStyle.Movement
Handles.Faces = Faces.new(NormalId)
Handles.Adornee = Selection
Handles.Parent = Selection
end
Now select the ‘Root’ part and run the code. You should see handles pop up on your part as shown:
Rotate the part so that the Blue arrow is pointing towards you, the Red arrow is pointing left and the green arrow pointing up like so:
Now reshape the ‘Root’ part to be the size of your door, with the width and depth being the 0.1, like so:
As you can see, the root part is the same height as my door model. Now, place the root partat the edge of the door model like so:
I isolated the door to show you a representation. You do not have to do this, but it helps with visibility!
You can now remove the handles inside the ‘Root’ part and make the part transparent!
At this point, your ‘Door’ model should have this inside it:
Now, make the primary part of your ‘Door’ model, the ‘Root’ part.
After this, create a part called ‘Front’ and place it at the front of your door. This is what will detect the player when the player touched the door.
Duplicate this part and place it at the back of your door, naming it ‘Back’!
Now make both parts transparent.
Now, insert this new line of code into your Command Bar (don’t forget to delete the comment!):
local Door = workspace.KeyCardDoor.Door -- The place where the 'Door' model is stored.
local Part1 = Door.PrimaryPart
for _, Part0 in pairs(Panel:GetChildren()) do
if Part0:IsA("BasePart") and not (Part0 == Part1) then
local WeldConstraint = Instance.new("WeldConstraint")
WeldConstraint.Part0 = Part0
WeldConstraint.Part1 = Part1
WeldConstraint.Parent = WeldConstraint.Part0
Part0.Anchored = false
end
end
Part1.Anchored = true
Part1.CanCollide = false
Run this code, and you should see welds appear in your door parts, except the ‘Root’ part.
That is the welding and building parts complete! Scripting time!
Create a new script inside the ‘Door’ model and name it ‘DoorHandler’
Inside the script, type this in (explanations in code):
local TweenService = game:GetService("TweenService") -- Get's the TweenService
local Root = script.Parent.PrimaryPart -- Defining the 'Root' part we made earlier
local SwingInfo = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out) -- This is the tween information. Change it to your liking. The first parameter decides how fast the door opens.
local Debounce = false -- A debounce variable to prevent opening of the door too many times!
local function OpenDoor() -- Creating a function to shorten the amount of code!
TweenService:Create(Root, SwingInfo, {CFrame = Root.CFrame * CFrame.Angles(0, math.rad(90), 0)}):Play() -- Creates a tween of the 'Root' part using the SwingInfo we gave earlier. It tweens the CFrame of the Root part by 90 degrees. Since the door is welded to the root part, the entire door swings!
end
local function CloseDoor() -- Creating a function to shorten the amount of code!
TweenService:Create(Root, SwingInfo, {CFrame = Root.CFrame * CFrame.Angles(0, math.rad(-90), 0)}):Play() -- Creates a tween of the 'Root' part using the SwingInfo we gave earlier. It tweens the CFrame of the Root part by -90 degrees. Since the door is welded to the root part, the entire door swings!
end
local function FrontTouched(hit) -- Creating a function to shorten code.
if Debounce then return end -- If debounce is true, then we stop this function
local Character = hit.Parent -- We assume that the character is the parent of the part that hit the front detector.
local Player = game.Players:GetPlayerFromCharacter(Character) -- We get the player of the character. If it really is a character, it will give us a value, else it will return nil
if not Player then return end -- If it is nil, then we stop the function
if Character:FindFirstChild("Keycard") or Player.Backpack:FindFirstChild("Keycard") or Player.TeamColor == BrickColor.new("Electric blue") then -- We check to see if the player has a 'Keycard' tool in their character or backpack or if they are in the police team. If so, we proceed with the code
Debounce = true -- We set debounce to true so this function doesn't repeat when it is already running.
OpenDoor() -- We call the open door function
script.Parent.Indicator.BrickColor = BrickColor.new("Lime green") -- We change the indicator colour to green. This is of course, optional.
task.wait(3) -- We wait for 3 seconds
CloseDoor() -- We close the door.
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red") -- We change the colour back to red.
task.wait(1) -- We wait one second
Debounce = false -- We set debounce back to false to ensure the code can run again.
else -- if player doesn't have a keycard or is not a police
Debounce = true -- We set debounce to true again
for i = 0, 3 do -- This is for effect, to show that the player is not allowed.
script.Parent.Indicator.BrickColor = BrickColor.new("Lily white")
task.wait(0.1)
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red")
end
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red")
task.wait(3) -- We wait 3 seconds
Debounce = false -- We set debounce back to false.
end
end
local function BackTouched(hit) -- This function runs when the back part is touched
if Debounce then return end -- If debounce is true, then we stop this function
local Character = hit.Parent -- We assume that the character is the parent of the part that hit the front detector.
local Player = game.Players:GetPlayerFromCharacter(Character) -- We get the player of the character. If it really is a character, it will give us a value, else it will return nil
if not Player then return end -- If player does not have a value, end this function.
if Character:FindFirstChild("Keycard") or Player.Backpack:FindFirstChild("Keycard") or Player.TeamColor == BrickColor.new("Electric blue") then -- Same thing as above
Debounce = true
CloseDoor() -- We call close door since player is coming from the back. This will open the door from their perspective.
script.Parent.Indicator.BrickColor = BrickColor.new("Lime green")
task.wait(3)
OpenDoor() -- Same thing here
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red")
task.wait(1)
Debounce = false
else
Debounce = true
for i = 0, 3 do
script.Parent.Indicator.BrickColor = BrickColor.new("Lily white")
task.wait(0.1)
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red")
end
script.Parent.Indicator.BrickColor = BrickColor.new("Bright red")
task.wait(3)
Debounce = false
end
end
script.Parent.Front.Touched:Connect(FrontTouched) -- We call the 'FrontTouched' function when the front part of the door is touched
script.Parent.Back.Touched:Connect(BackTouched) -- We call the 'BackTouched' function when the back part of the door is touched
In the end, it should function like this:
https://drive.google.com/file/d/1o3hFUu5ulPsM8EHAm0cgj3McqT2tb73u/view?usp=sharing
That’s it! Enjoy your door!
Thank you for reading through my first tutorial! I hope it helped you a lot! Have a fantastic day!
Quick Note
Please tell me if something does not work or is not explained properly, since I am more than willing to change and help! Thanks!
Huge thanks to @colbert2677 for introducing me to tweening models and teaching me how it works. For further information on tweening models, look into his tutorial here: Introduction to Tweening Models