アップグレードボタンをスクリプトする

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。


プレイヤーはコインを集めて死ぬとコインを失うことができますが、コインは何の役にも立たず、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のコードを以下の内容で置き換えます:
```lua
local 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,
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end
return 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.IncreaseJumpPowerFunction
local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local JUMP_POWER_INCREMENT = 30
local JUMP_COIN_COST = 5
local 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 then
humanoid.JumpPower = newJumpPower
-- ジャンプリーダーボードを更新
Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
end
end
local function onPurchaseJumpIncrease(player)
local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
if coinAmount < JUMP_COIN_COST then
return false
end
-- プレイヤーのジャンプパワーを増加
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- コインテーブルを更新
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- コインリーダーボードを更新
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- キャラクターが追加されたときにプレイヤーのジャンプパワーをリセット
updateJumpPower(player, function(_)
return 0
end)
end
-- PlayerAddedイベントに接続する前に追加されたプレイヤーを初期化
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- PlayerAddedイベントからのプレイヤーの通常初期化
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function()
onCharacterAdded(player)
end)
end
local function onPlayerRemoved(player)
updateJumpPower(player, function(_)
return nil
end)
end
IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
Players.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を作成し、以下のコードを追加します:
```lua
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local playerGui = player.PlayerGui
local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
local jumpButton = jumpPurchaseGui.JumpButton
local function onButtonClicked()
local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
if not success then
-- purchasedはsuccessがfalseの場合のエラーメッセージになります
error(purchased)
elseif success and not purchased then
warn("コインが不足しています!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- JumpPurchaseGuiをプレイヤーのGuiに追加
jumpPurchaseGui.Parent = playerGui
```

以下のセクションでは、コードの詳細について説明します。

  • GUIとサーバー関数の参照を取得 - 変数IncreaseJumpPowerFunctionjumpPurchaseGui、およびjumpButtonには、後で必要となる関数とGUIへの参照が含まれています。
  • イベントハンドラを定義 - onButtonClicked()は、ユーザーがアップグレードボタンをクリックしたときのロジックを定義します。pcall()(保護された呼び出し)を使用して、RemoteFunctionを呼び出します。このようなクライアント-サーバー間の通信には、エラーや接続の問題を処理するためにpcall()が必要です。
  • ハンドラをボタンに接続 - Activatedイベントは、マウス、タッチスクリーン、またはゲームパッドのコンテキストを含むすべてのプラットフォームで互換性があります。これは、クリックタッチ、またはゲームパッドボタンがリリースされたときにトリガーされます。

プレイテスト

ドロップダウンからテストを選択し、再生をクリックします。Upgrade Jumpボタンが右下隅に表示されます。

コインを集める前にボタンをクリックしても追加のジャンプパワーが付与されないことを確認し、コインをいくつか集めた後、再度クリックしてアップグレードが機能するかどうかを確認してください。

コードが完成したので、難易度を調整してみてください:ペースが遅いと感じる場合はコインを追加するか、簡単すぎる場合はコインをいくつか削除し、トリッキーな場所に隠してください。

©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。