创建 VIP 专用门¶
Time:10 分钟
警告:Roblox 将有效地禁止将所有衬衫称为“管理员”衬衫,因为其名称具有误导性。请不要将你的衬衫命名为管理员衬衫,应将它们命名为 VIP 衬衫之类的名称。
受限制的门,通常也称为 VIP 门,用来限制只有特定用户才能进入某一特定区域。一个受限制的门可能要应用许多限制,本文不能涵盖所有限制。但是,将涵盖最常用的限制:
限制某个玩家。
限制某个群组。
限制场景的创建者。
但是,在制作限制进入特定区域的受限制的门之前,你应该始终仔细考虑。在大多数情况下,会有更好的方法。问题在于受限制的门经常被过度使用。有时,它们用于保护包含某些物品的房间。但是,这些物品可以自动提供给玩家,而不必每次死亡时都进入房间。如果可以采用更清洁的方式,请尽量避免使用受限制的门。
建造门¶
建造门应该不是问题,但是我仍然要描述一下。首先,你需要创建门。通常,你希望它的大小与角色大小相同,以便玩家可以通过。你可能希望门也要锚固,除非你希望每当玩家触碰门时门就会移动…
玩家角色的大小为 4 x 5 x 1,因此你可能希望门也有这样的尺寸。另一个解决方案是只是让门稍大于角色的实际大小。通常,你还希望在门周围建造一个房间,但这超出了本教程的范围。
编写门的脚本¶
结构¶
首先,我们需要在门中创建一个脚本。将鼠标悬停在管理器中的门部件上,然后单击加号图标
,然后单击 Script
。
因为在脚本中会对门进行很多操作,所以最好定义一个包含对它的引用的变量。该脚本将调用变量 door,但你可以随意调用。
local door = script.Parent
你可能想打开和关上门。我们做一个开门的函数,再做一个关门的函数。
有很多方法可以打开门,但是,对于本教程,我们将选择一种使门逐渐消失的方法,正如你在此处所见:
别担心,你的门会消失得比这还要快。此处的动画比你的门实际消失的速度要慢。
我们将使用循环使门消失,并使用它的 BasePart/Transparency
属性来更改它的不透明度。最后,我们将更改门的 BasePart/CanCollide
属性,以允许玩家通过它。
local doorOpen = false
local function open()
if doorOpen then
-- 门已打开,无需再次打开!
return
end
doorOpen = true
door.CanCollide = false -- Make players able to walk through the door.
for transparency = 0, 1, 0.1 do
door.Transparency = transparency
wait(.1)
end
end
如果有一个开门的函数,当然也得有一个关门的函数。关门函数的作用与开门函数的作用正好相反!
local function close()
for transparency = 1, 0, -0.1 do
door.Transparency = transparency
wait(.1)
end
doorOpen = false
door.CanCollide = true -- Make players unable to walk through the door.
end
你可能希望门在被触碰时打开,因此应该使用 BasePart/Touched
事件。因此,让我们将 Touched 事件连接到某个函数。然后,我们将检查触碰门的部件是否在角色中。
local function onTouched(hit)
local character = hit.Parent
if character then
local player = game.Players:GetPlayerFromCharacter(character)
if player and not doorOpen then
open()
wait(3)
close()
end
end
end
现在,当门被触碰时,我们想做什么?我们要检查玩家是否符合其中一个限制!
限制¶
有很多方法可以检查玩家是否符合其中一个限制,但在本例中,我们将使用一个简单的系统。但我们鼓励你尝试用其他的方法去做,因为这会帮助你学习。
我们将在本例中使用的系统很简单。我们将用 or 关键字分隔所有限制。所有的限制都将采用布尔表达式的形式。如果这些布尔表达式中的任何一个为 true,门都将打开。
让我们看看你可能要应用的一些常用限制。
限制某个玩家¶
通常,你会想授权某些特定的玩家通过这扇门。在本例中,你可能会这样做。
你可能已经猜到了如何应用这个限制,但是,如果你没有猜到也没有关系,方法很简单。你只需检查玩家的名称是否等于某个字符串:
player.Name == "PlayerName"
限制某个群组¶
使用 Player/IsInGroup
可以很容易地检查玩家是否在某个群组中。
IsInGroup 方法接受一个参数,该参数是某个群组的 id。如果玩家在具有该 id 的群组中,该方法将返回 true。否则,将返回 false。
下面是应用此限制的示例(注意:你可以将 8 更改为任何群组的 id):
player:IsInGroup(127081)
限制场景的创建者¶
只需将玩家的名字与某个预定义的名字(场景所有者的名字)进行比较,并检查它们是否相等即可实现这一限制。但是,这种方法很有用,因为它可以在任何场景中使用。例如,在将脚本提供给朋友之前,无需编辑脚本,因为该脚本会适应场景。该脚本使用 DataModel/CreatorId
并将其与玩家的 id 进行比较。如果它们相等,那么该玩家就是所有者。因此,它可以在任何场景中使用,甚至在给朋友时,都无需将其名字更改为朋友的名字。
下面是应用此限制的方法:
game.CreatorId == player.UserId
限制某个用户的朋友¶
如果你想让你所有的朋友都能通过那扇门呢?为此,请使用 Player/IsFriendsWith
。它有一个参数,名为 userId,它是用户的 id。如果你希望允许创建者的所有朋友,可以将 game.CreatorId 作为参数发送到此方法。
此限制应用起来非常简单:
player:IsFriendsWith(2032622)
使用限制¶
现在,让我们在脚本中添加我们的限制!下面是一个示例,它只允许 Roblox 群组中的人通过:
local door = script.Parent
local doorOpen = false
local function open()
doorOpen = true
door.CanCollide = false -- Make players able to walk through the door.
for transparency = 0, 1, 0.1 do
door.Transparency = transparency
wait(.1)
end
end
local function close()
for transparency = 1, 0, -0.1 do
door.Transparency = transparency
wait(.1)
end
doorOpen = false
door.CanCollide = true -- Make players unable to walk through the door.
end
local function onTouched(hit)
local character = hit.Parent
if character then
local player = game.Players:GetPlayerFromCharacter(character)
if player then
if player:IsInGroup(7) then
-- 只在门处于关闭状态时打开。
if not doorOpen then
open()
wait(3)
close()
end
elseif doorOpen then
-- 有入侵者!可别让他们活着穿过这道门。
character:BreakJoints()
end
end
end
end
door.Touched:Connect(onTouched)
*[id]: identifier
***Roblox官方链接:创建 VIP 专用门