特定のプレイヤーだけが通り抜けられるドアを作成します。
- Door という名前のパーツを設置します。
- Door の中に、RemoteEvent を追加します。
- さらに Script を追加し、以下のプログラムを入力します。
local Players = game:GetService("Players")
local door = script.Parent
-- ドアを通り抜けられるプレイヤーIDのリスト
local includePlayers = {
000000000,
111111111,
}
door.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
if table.find(includePlayers,player.UserId) then
door.RemoteEvent:FireClient(player)
end
end
end)
- StarterPlayer の StarterPlayerScripts に LocalScript を追加し、以下のプログラムを入力します。
local door = game.Workspace:WaitForChild("Door")
door.RemoteEvent.OnClientEvent:Connect(function()
door.CanCollide = false
end)
サーバー側で、「CanCollide を false にし、wait(xx)とし、CanCollide を ftrue」としたいところですが、そうするとタイミングによっては、他のプレイヤーも通れてしまいます。それを防ぐには、プレイヤーのクライアント側で、CanCollide を false にするというわけです。
もっと簡単に実現する方法
さらに、もっと簡単に処理したい場合は、LocalScriptに、以下のようなプログラムを入れておけば、良いわけです。
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local door = game.Workspace:WaitForChild("Door")
-- ドアを通り抜けられるプレイヤーIDのリスト
local includePlayers = {
000000000,
111111111,
}
if table.find(includePlayers,player.UserId) then
door.CanCollide = false
end
グループのランクによる制御
あるグループに入っていて、役割のランクが100以上の場合に限り、入れる部屋を作りたい場合は以下のように行えば実現できるでしょう。
local GROUP_ID = xxxxxxx -- グループのID
local GROUP_RANK = 100 -- 部屋に入れるランク(これ以上のランク者が入れる)
-- グループIDを渡すと、そのランクを返す
local function getGroupRank(player,groupId)
local GroupService = game:GetService("GroupService")
local playerRank = player:GetRoleInGroup(groupId)
local groups = GroupService:GetGroupsAsync(player.UserId)
for _, groupInfo in pairs(groups) do
if groupInfo.Id == groupId then
return groupInfo.Rank
end
end
return -1 -- グループに入っていない
end
if getGroupRank(player,GROUP_ID) >= GROUP_RANK then
door.CanCollide = false
end
なお、グループに入っているかどうかを調べるだけなら、「 player:IsInGroup(GROUP_ID) 」で調べられます。