プレイヤーはコインを集めて死ぬとコインを失うことができますが、コインは何の役にも立たず、3Dの世界のほとんどは非常に高くジャンプする能力がなければアクセスできません。このチュートリアルのセクションでは、画面上のボタンを追加してコインを消費し、ジャンプパワーを増加させるロジックを完成させる方法を学びます。
アップグレードボタンを作成する
Robloxの2Dインターフェースは通常、GUIコンテナ内のGUIコンポーネントのコレクションで構成されます。この場合、TextButtonコンポーネントを一つ作り、その中に「Upgrade Jump (5 Coins)」と書かれているだけで十分です。
アップグレードGUIのセットアップReplicatedStorageに"Instances"という名前のフォルダーを作成します。Instancesフォルダーの中に、ResetOnSpawnを無効にしたJumpPurchaseGuiという名前のScreenGuiを作成します。JumpPurchaseGuiの中に、次のプロパティを持つJumpButtonという名前のTextButtonを作成します:- Text: "Upgrade Jump (5 Coins)"- TextSize: 25- AnchorPoint: 1, 1- Position: {1, 0}, {1, 0}Instancesフォルダーの中に、IncreaseJumpPowerFunctionという名前のRemoteFunctionを作成します。最後に、StarterPlayerサービスでCharacterUseJumpPowerプロパティを有効にします。
ジャンプパワーデータを定義する
現在、各プレイヤーのコイン数のみがPlayerDataモジュールスクリプトに保存されています。ジャンプパワーも同様に保存して更新する必要があります。PlayerData内の関数は変更されるデータに特有でないため、プレイヤーのジャンプパワーを保存するために必要なことは、Jumpキーを追加し、defaultPlayerData()でその初期値を初期化することだけです。
ジャンプパワーでPlayerDataを更新ServerStorageで、既存のPlayerData ModuleScriptのコードを以下の内容で置き換えます:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"PlayerData.JUMP_KEY_NAME = "Jump"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number,["Jump"] = jumpPower: number}--]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0,[PlayerData.JUMP_KEY_NAME] = 0,}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[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がジャンプパワーを追跡できるようになったので、プレイヤーのクライアントリクエストからジャンプパワーをアップグレードするロジックをサーバーに実装する必要があります。
サーバーとクライアントは、RemoteEventsまたはRemoteFunctionsを介して通信できます。リモートイベントは、発生するときに待機せず、一方向の通信に使用できます。対照的に、リモート関数は応答を受け取るまで待機するため、双方向の通信が可能です。
このチュートリアルでは、クライアントがサーバーがプレイヤーのジャンプパワーを正常にアップグレードしたかどうかを知る必要があるため、リモート関数を使用するべきです。
JumpServiceを作成するServerScriptServiceに、次のコードを持つJumpServiceという名前のScriptを作成します:```lua-- サービス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-- PlayerAddedイベントからのプレイヤーの通常初期化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()関数はプレイヤーのジャンプパワーとリーダーボードを更新し、視覚的なフィードバックを提供します。この関数は、プレイヤーの危険を作成するに登場するプレイヤーにダメージを与えるコードによく似ています。CharacterモデルとHumanoidがアップグレードされたプレイヤーのために存在する場合、この関数はPlayerDataによって保存された新しい値にJumpPowerプロパティを更新し、それを30増加させます。ゲームをわずかに長続きさせたい場合は、この数値を減らすことができます。
サーバーリクエストの検証 - onPurchaseJumpIncrease()は、プレイヤーが実際にアップグレードを購入するのに必要なコインを持っていることを最初にチェックします。すべてのリクエストは、ユーザーが虚偽のリクエストを送信し、ゲームを悪用するのを防ぐためにサーバーで検証する必要があります。
プレイヤーGUIにボタンを追加する
ScreenGuiオブジェクトは、プレイヤーのPlayerGuiオブジェクトに親として持たれている場合のみ画面に表示されます。デフォルトでは、これにはチャットウィンドウなどのシステムGUIが含まれています。次に、ReplicatedStorage内に新しいスクリプトを作成して、各プレイヤーのGUIにアップグレードボタンをコピーし、ボタンが押されたときの動作を実装する必要があります。
JumpButtonClickHandlerを作成するReplicatedStorageに、RunContextをClientに設定したJumpButtonClickHandlerという名前のScriptを作成し、以下のコードを追加します:```lualocal 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-- purchasedはsuccessがfalseの場合のエラーメッセージになりますerror(purchased)elseif success and not purchased thenwarn("コインが不足しています!")endendjumpButton.Activated:Connect(onButtonClicked)-- JumpPurchaseGuiをプレイヤーのGuiに追加jumpPurchaseGui.Parent = playerGui```
以下のセクションでは、コードの詳細について説明します。
- GUIとサーバー関数の参照を取得 - 変数IncreaseJumpPowerFunction、jumpPurchaseGui、およびjumpButtonには、後で必要となる関数とGUIへの参照が含まれています。
- イベントハンドラを定義 - onButtonClicked()は、ユーザーがアップグレードボタンをクリックしたときのロジックを定義します。pcall()(保護された呼び出し)を使用して、RemoteFunctionを呼び出します。このようなクライアント-サーバー間の通信には、エラーや接続の問題を処理するためにpcall()が必要です。
- ハンドラをボタンに接続 - Activatedイベントは、マウス、タッチスクリーン、またはゲームパッドのコンテキストを含むすべてのプラットフォームで互換性があります。これは、クリック、タッチ、またはゲームパッドボタンがリリースされたときにトリガーされます。
プレイテスト
ドロップダウンからテストを選択し、再生をクリックします。Upgrade Jumpボタンが右下隅に表示されます。
コインを集める前にボタンをクリックしても追加のジャンプパワーが付与されないことを確認し、コインをいくつか集めた後、再度クリックしてアップグレードが機能するかどうかを確認してください。
コードが完成したので、難易度を調整してみてください:ペースが遅いと感じる場合はコインを追加するか、簡単すぎる場合はコインをいくつか削除し、トリッキーな場所に隠してください。