玩家现在可以收集硬币并在死亡时失去它们,但硬币不会做任何事情,而且游戏世界的大部分区域都无法通过添加屏幕按钮来增加跳跃力来访问。 此部分教程教你如何完成你的体验,通过添加屏幕按钮来增加跳跃力。
创建升级按钮
Roblox 的 2D 界面通常由 TextButton 组成。 在这种情况下,您只需要一个 Upgrade Jump (5 Coins) 组成,内部的 GUI 组件说 ScreenGui 在一个 2> Class.ScreenGui2> 容器。
要创建图形用户界面:
- 在 Explorer 窗口中,将一个新文件夹添加到 ReplicatedStorage 中,然后将文件夹重命名为 Instances。 2> ReplicatedStorage2> 中的任何对象都可以通过每个玩家的 Roblox 客户端访问。
- 将 ScreenGUI 对象添加到 Instances 文件夹。
- 选择 ScreenGui 对象,然后在 属性 窗口中,
- 将 名称 设置为 JumpPurchaseGui 。
- 禁用 RespawnOnSpawn 以确保 GUI 在他们重生时仍然是父级。
- 在 Explorer 窗口中,将 TextButton 插入 JumpPurchaseGui 容器中,然后将 1> JumpButton1> 重命名为 4> JumpButton4>。
- (可选) 配置属性以定制按钮的外观和位置。简单建议包括:
- 将 文本 属性设置为 升级跳跃 (5 金币) 。
- 将 文本大小 属性设置为 25 。
- 将 锚定点 设置为 1, 1 并将位置设置为 1, 0,1,0 以将按钮移到右下角。
你将在此教程中稍后添加按钮到玩家的 GUI,但在添加之前,你需要定义所有必要于该按钮运行的逻辑和数据。
定义跳跃力数据
目前,只有硬币数量为每个玩家在 PlayerData 模块脚本中存储。您还需要存储和更新跳跃力。因为 PlayerData 中的函数非常具体地描述数据正在更改,因此您需要添加一个 Jump 键并在 1>默认玩家数据1> 中初始化它的
要更新 PlayerData 模块脚本来存储跳跃力:
在 Explorer 窗口中,在 PlayerData 模块脚本在 ServerStorage 中打开。
将脚本中的代码替换为以下示例,其中初始化每个玩家旁边的 Jump 值,并且其现有的 Coins 值:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"PlayerData.JUMP_KEY_NAME = "Jump"local playerData = {-- [[[userId: string] = {["Coins"] = coinAmount: number,["Jump"] = jumpPower: number}--}]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0,[PlayerData.JUMP_KEY_NAME] = 0,}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData
更新跳跃力数据
现在 PlayerData 已能够跟踪跳跃力,您需要在服务器上实现逻辑来升级跳跃力从玩家的客户端请求。
服务器和客户端通过 远程事件 或 远程函数 来通信。 远程事件不会在发射时产生,并且适合单向通信。 远程函数产生直到它们收到回复,这允许 2 方通信。 在此情况下,客户端需要知道服务器是否成功升级了玩家的跳跃能力,因此 远程函数是理想的。
要实现跳跃升级:
在 Explorer 窗口中,在 ReplicatedStorage 中打开 实例文件夹 。
将 远程函数 插入 实例 文件夹,然后将远程函数重命名为 1> IncreJumpPowerFunction1>。您总是在 4> ReplicatedStorage4> 中创建远程函数,因为客户端和服务器都必须能够访问它们。
在 Explorer 窗口中,选择 StarterPlayer 。
在 属性 窗口中,启用 角色使用跳跃力 属性。 默认情况下,角色的跳跃力值不会定义跳跃角色所需的跳跃力,因此需要启用。
在 Explorer 窗口中,将一个新脚本插入 ServerScriptService ,然后将脚本重命名为 JumpService 。 此脚本将包含跳跃升级的逻辑。
将以下代码替换为默认代验证码:
-- 服务local ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- 模块local Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- 事件local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local function updateJumpPower(player, updateFunction)-- 更新跳跃力表local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- 更新玩家的跳跃力local character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- 更新跳跃排行榜Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- 增加玩家的跳跃力updateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- 更新硬币桌local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- 更新硬币排行榜Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- 在角色添加时重置玩家的跳跃力updateJumpPower(player, function(_)return 0end)end-- 在连接到 PlayerAdded 事件之前初始化任何玩家for _, player in Players:GetPlayers() doonCharacterAdded(player)end-- 从“玩家添加”事件中的常规初始化local function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)兑换码说明下面的部分描述了代码更详细。
更新跳跃力数据 - updateJumpPower() 更新玩家和排行榜的跳跃力
验证服务器请求 - 首先检查玩家是否拥有购买升级所需的硬币。 onPurchaseJumpIncrease() 从客户端到服务器都应该被验证,以防止恶意攻击发出错误请求并使用您的体验。
将按钮添加到玩家 GUI
一个 ScreenGui 对象只会在屏幕上显示,如果它是玩家的 PlayerGui 对象的父级。默认情况下,这包含系统 GUI ,例如聊天窗口。您现在需要在 ReplicatedStorage 中创建脚本来复制升级按钮并实现为每个玩家的 GUI 实现行为,当按钮被按下。
要将按钮添加到玩家的 GUI 当他们加入时:
在 Explorer 窗口中,在 ReplicatedStorage 中创建一个 脚本 。
选择脚本,然后在 属性 窗口中,
- 将 名称 设置为 JumpButtonClickHandler 。
- 将 RunContext 设置为 Client 。这使得引擎总是在客户端上运行此脚本以优化网络通信。
在打开脚本中,将默认代码替换为以下验证码:
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- 购买将是 false 的错误消息error(purchased)elseif success and not purchased thenwarn("Not enough coins!")endendjumpButton.Activated:Connect(onButtonClicked)-- 将 JumpPurchaseGui 添加到玩家的 GuijumpPurchaseGui.Parent = playerGui兑换码说明下面的部分描述了代码更详细。
- 获取对图形用户界面和服务器功能的引用 - 变量 IncreaseJumpPowerFunction , jumpPurchaseGui 和 0> jumpButton0> 中包含参考该功能和 GUI 的功能。
- 定义事件处理器 - onButtonClicked() 定义用户单击升级按钮时的逻辑。它使用 pcall() (保护调用) 来调用 0> Class.RemoteFunction0> 。 任何客户端-服务器通信都需要 <
游戏测试
您现在应该能够使用升级按钮购买金币的跳跃升级。 要测试项目:
在菜单栏中,单击 播放 按钮。Studio进入播放测试模式。
如果您的脚本正常运行,屏幕上会出现购买跳跃力的按钮。尝试在收集任何硬币之前单击按钮,以确认它不会向您授予额外的跳跃力,然后尝试收集一些硬币并查看升级是否在您再次单击时工作。
现在代码已完成,请尝试通过硬币的数量和位置来平衡游戏。如果游戏感觉太慢,请添加更多硬币,或者减去硬币,并将它们放在有挑战意义的位置。