当用户加入体验时,Roblox 将他们视为数据模型中的 玩家 。该 Player 对象包含普适于体验的用户信息,例如其用户名、好友列表、保存的 虚拟形象角色 以及 Roblox 会员输入,以及影响用户生命周期的属性、方法和事件,例如加入体验和离开体验之间。
Players包含体验中的所有Player。每个 Player 对象都代表体验中的用户,它们的父级代表您可以使用来自定义用户体验的四个重要容器:Backpack , StarterGear , PlayerGui 和 PlayerScripts 。
生命周期
客户端和服务器端脚本都可以连接到 Players.PlayerAdded 和 Players.PlayerRemoved 事件以执行对Player 对象生命周期的响应的操作。它们还可以连接到 Player.CharacterAdded , Player.CharacterRemoving , 和 Humanoid.Died 事件,执行角色生成、解除生成和死亡时的游戏相关操作。
使用脚本访问服务器相关服务,例如数据存储来恢复和保存用户加入或离开时的数据。如果客户需要创建并删除与新用户相关的游戏实例,例如用于自定义排行榜的用户统计显示的图形用户界面,请使用 LocalScripts。
用户加入
当客户端连接到体验时,其关联的 Player 对象复制到 Players 服务。Players.PlayerAdded 代表用户加入体验。一些示例使用案例包括加载用户数据、分配团队和更改用户角色的服装。该 Players.PlayerAdded 事件传递加入的用户的 Player 对象,您可以在调用其他函数时使用,例如数据存储和 RemoteEvent 对象。
加载用户数据在加入时
要在用户加入体验时加载数据,请在 Players.PlayerAdded 中使用事件 Script 。以下示例 Script 收听事件,并尝试使用用户 ID 作为数据存储键来检索用户的数据。成功恢复用户数据后,您可以使用它来加载用户的进度和统计数据。
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
game:GetService("Players").PlayerAdded:Connect(function(player)
local userId = player.UserId
-- 阅读数据存储关键
local getSuccess, currentData = pcall(function()
return playerDataStore:GetAsync(userId)
end)
if getSuccess then
print(currentData)
end
-- 对当前数据进行进一步操作
end)
用户离开
当客户端从体验中断开时,服务器会从 Player 服务中删除其相关的对象 Players 。Players.PlayerRemoving事件代表用户离开体验。一些示例使用案例包括保存用户数据、从得分板中删除其统计数据以及摧毁任何模型,例如房屋。该 Players.PlayerRemoving 事件传递离开的用户的 Player 对象,您可以在调用其他函数时使用,例如数据存储和 RemoteEvent 对象。
注意事件被称为 Player.PlayerRemoving ,而不是 Player.PlayerRemoved ,因为“删除”暗示该 Player 对象已被移除,因此无法访问脚本。
在离开时保存用户数据
要保存用户在离开体验时的数据,请在 Players.PlayerRemoving 中使用 Script 事件。以下示例 Script 收听事件,并尝试使用用户 ID 作为数据存储键来保存用户的数据。
服务器脚本服务中的脚本
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
game:GetService("Players").PlayerRemoving:Connect(function(player)
local userId = player.UserId
-- 在游戏中获取玩家的数据状态
local currentData = getCurrentData(player)
-- 保存到数据存储商店
local setSuccess, errorMessage = pcall(function()
playerDataStore:SetAsync(userId, currentData)
end)
if not setSuccess then
warn(errorMessage)
end
end)
角色生成
用户的 Player.Character 模型代表他们的虚拟形象。默认情况下,Player.CharacterAutoLoads 是真的,当用户加入体验时,自动生成用户角色模型。如果 Player.CharacterAutoLoads 为 false,那么您需要调用 Player:LoadCharacter() 手动生成角色。
当用户的 Player.Character 重生时,脚本和本地脚本在 StarterCharacterScripts 复制到角色模型,并触发 Player.CharacterAdded 事件。Player.CharacterAdded将新的角色模型传递给任何事件听众,您可以使用它来找到角色的Humanoid并修改其行为。例如,你可以使用 Humanoid:ApplyDescription() 来更改虚拟形象的服装,并使用 Humanoid.WalkSpeed 或 Humanoid.JumpHeight 来修改虚拟形象的移动。
角色产生
当玩家的 Humanoid 死亡时,其身体部件掉落到地面,并触发 Humanoid.Died 事件。服务器会在 Players.Respawntime 属性确定的时间后自动删除角色模型和其内部的任何脚本。您可以使用 Player.CharacterRemoving 事件来重置与角色相关的其他对象,例如车辆驾驶时的网络所有权。
计数玩家死亡
您可以使用 Humanoid.Died 事件来处理击杀的得分或创建自定义的布娃娃模型。以下 Script 连接到 Player.CharacterAdded 以检索每个用户的角色模型,然后连接到角色的 Humanoid 对象。当人形的 Humanoid.Died 事件触发时,脚本增加用户的人形死亡次数并输出该数字。
服务器脚本服务中的脚本
game:GetService("Players").PlayerAdded:Connect(function(player)
local deaths = 0
player.CharacterAdded:Connect(function(character)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
deaths += 1
print(player.Name .. " death count: " .. deaths)
end)
end)
end)
禁止用户
为了确保您的体验中的礼貌和公平游戏,您可以禁止那些违反您的体验规则和社区准则的用户。您可以修改禁令时长、禁令消息,甚至将禁令扩展到潜在的替换帐户。使用此精选时,您还必须遵循禁止和消息传递的指南。
有关实施和使用说明,请参阅Players.BanAsync。
禁止指南
在你的体验中实施禁令时,遵守以下指南:
- 创作者必须在所有用户都能访问的地方清晰说明他们的经验规则。
- 创作者必须公平地应用他们的经验规则,而不能随意选择某些用户。
- 用户可以直接向创建者提出上诉,如果他们认为他们的禁令是错误的。
- Roblox 不会介入这些上诉,除非用户认为创作者的经验规则或执行他们的规则违反了 社区标准。
- Roblox 可以在有理由相信创作者的经验规则或执行规则违反社区标准的情况下,对经验进行管理。
消息指南
当用户被禁止时,他们会收到一个错误模态显示信息,例如禁止长度和原因。在文本筛选的消息中,您可以包含上诉或联系信息等额外信息,只要您符合 Roblox 的 社区标准 。
例如,在你的封禁消息中,你可以引用品牌名称和平台:
- “访问我的群组/体验页面上的 Discord”
- “在 Twitter 或 X 上关注我”
此消息字段不允许提及个人信息或直接链接。这包括发布特定的用户名或手柄,或提供直接链接到 Discord 服务器或 X 帐户。
容器
Player 对象存储了几个重要容器:
背包
容器 Player.Backpack 存储用户的道具。用户的 显示物品在他们屏幕底部的库存中。如果用户从道具中选择一个 Tool ,他们装备它,它将从 Player.Backpack 移至 Player.Character 。
当用户的 生成时,服务的内容和它们的 克隆到他们的 。当角色死亡时,客户端摧毁其Backpack并替换为新的一个。
该 Backpack 还存储并运行 Scripts 和 LocalScripts ,客户端和服务器都可以1) 使用权 2)通行证 3)访问权限。
Roblox 提供一个接口,让玩家在屏幕底部访问他们的 Backpack 和库存。要禁用默认 Roblox 背包 GUI 并替换为自拥有的 GUI,请在本地脚本中调用 StarterGui:SetCoreGuiEnabled() 。了解更多信息,请参阅StarterGui。
新手装备
容器 StarterGear 将其内容复制到用户的 Player.Backpack 当其角色生成时。此外,如果你的地方允许装备和用户拥有装备,那么在它们重生点时,它们的装备克隆对象 Tool 对其 Player.StarterGear 。
与 StarterPack 不同,Player.StarterGear 不是服务,而是每个 Player 对象的子,因此其内容是用户特定的。每个用户都可以在自己的 Tool 中拥有不同的 Player.StarterGear 对象。要使用 Player.StarterGear , 在 权限 下启用体验设置页面中的装备。在权限页面上,您可以通过装备的输入启用它。要禁用装备,取消选择其输入。
始终在添加装备到游戏后测试游戏,以确保用户不能在那里轻易滥用它们。装备包括 Script 个对象,允许玩家执行你可能不会考虑的行动。例如,导航装备可能允许玩家访问你不希望他们访问的地图部分。武器允许装备的玩家对其他玩家造成伤害,可能无需报复或报复。
玩家界面
PlayerGui 容器存储创建玩家图形GUI户界面的对象。如果屏幕用户界面是 PlayerGui 的子孙,那么屏幕用户界面内的任何 GuiObject 都会显示在玩家的屏幕上。任何 LocalScript 在克隆到 PlayerGui 时运行。当玩家的 Player.Character 首次生成时,StarterGui 的所有内容自动复制到玩家的 PlayerGui 中。
如果玩家.角色自动加载设置为 false,角色不会生成,直到 被调用为止,内容不会复制。如果 StarterGui.ResetPlayerGuiOnSpawn 设置为真,每次玩家角色重生时,该玩家的 PlayerGui 内容都会清除并替换为 StarterGui 的内容。
玩家脚本
当用户加入体验时,容器中的内容在 StarterPlayer.StarterPlayerScripts 复制到 PlayerScripts 。当复制时,任何本地脚本和模块脚本都运行。
与 Backpack 和 PlayerGui 容器不同,PlayerScripts 容器不能访问服务器,用户的 PlayerScripts 容器在角色死亡并重生时不会重置。服务器端 Script 对象也不会在被父辈到 PlayerScripts 时运行。PlayerScripts 容器对那些不捆绑到用户角色生命周期的脚本有用,例如一般聊天系统或玩家输入控制。