プレイヤーは今、コインを集めて死んだときに失うことができますが、コインは何もしません、そしてゲーム世界のほとんどが非常に高くジャンプできる能力なしでアクセスできません。このチュートリアルのセクションでは、コインを使ってジャンプ力を増やす画面上のボタンを追加することで、エクスペリエンスのロジックを終了する方法を教えます。
アップグレードボタンを作成
Roblox の 2D インターフェイスは、一般的に GUI コンテナ内の GUI コンポーネントのコレクションで構成されています。この場合、コンテナ内で アップグレードジャンプ(5コイン)と言う のみのコンポーネントが必要です。
GUI を作成するには:
- エクスプローラー ウィンドウで、新しいフォルダを ReplicatedStorage に追加し、フォルダの名前を インスタンス に変更します。 ReplicatedStorage のどのオブジェクトも、GUI が表示される場所である各プレイヤーの Roblox クライアントにアクセスできます。
- インスタンス フォルダに ScreenGui オブジェクトを追加します。
- Select the ScreenGui オブジェクト、 then in the プロパティ ウィンドウ、
- Set 名前 を JumpPurchaseGui に設定します。
- リスポーン時に GUI がプレイヤーに依存したままであるように、 ResetOnSpawn を無効にして、プレイヤーがリスポーンするときに GUI が親になるようにします。
- エクスプローラ ウィンドウで、 テキストボタン を JumpPurchaseGui コンテナに挿入し、テキストボタンの名前を JumpButton に変更します。
- (オプション) ボタンの外観と位置をカスタマイズするには、プロパティを構成してください。単純な提案には次のものがあります:
- テキスト プロパティを ジャンプのアップグレード (5コイン) に設定します。
- テキストサイズ プロパティを 25 に設定します。
- アンカーポイント を と 位置 を に設定して、ボタンを右下隅に移動します。
このチュートリアルの後でプレイヤーの GUI にボタンを追加しますが、追加する前に、ボタンが機能するために必要なすべてのロジックとデータを定義する必要があります。
ジャンプパワーデータを定義する
現在、コイン数のみが PlayerData モジュールスクリプトで各プレイヤーに保存されています。同じ方法でジャンプ力も保存して更新する必要があります。 プレイヤーデータ の機能は、変更されるデータに特定的ではないため、プレイヤーのジャンプ力を保存するために必要なものはすべて、 キーを追加し、初期値を で初期化することです。
ジャンプ力を保存するために PlayerData モジュールスクリプトを更新するには:
エクスプローラー ウィンドウで、 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方向通信を可能にします。この場合、クライアントはサーバーがプレイヤーのジャンプ力をうまくアップグレードしたかどうかを知る必要があるので、リモート関数が理想的です。
ジャンプアップグレードを実装するには:
エクスプローラ ウィンドウで、 ReplicatedStorage の インスタンス フォルダを開きます。
リモート機能 を インスタンス フォルダに挿入し、リモート機能の名前を JumpPowerIncreaseFunction に変更します。クライアントとサーバーの両方がアクセスできる必要があるため、常に ReplicatedStorage でリモート機能を作成します。
In the エクスプローラー window, select StarterPlayer .
プロパティ ウィンドウで、 CharacterUseJumpPower プロパティを有効にします。デフォルトでは、キャラクターのジャンプ力値はキャラクターがジャンプする量を定義しませんので、これを有効にする必要があります。
エクスプローラー ウィンドウ で、新しいスクリプトを 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-- プレイヤー追加イベントに接続する前に追加されたプレイヤーを初期化する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 がプレイヤーがアップグレードされているため、機能は JumpPower プロパティを PlayerData に保存された新しい値に更新し、30を増加します。ゲームがわずかに長く続くようにしたい場合は、この数を減らすことができます。
サーバーリクエストの検証 - onPurchaseJumpIncrease() 最初にプレイヤーがアップグレードを購入するために必要なコイン数を持っているかどうかをチェックします。 すべてのリクエスト クライアントからサーバーへのすべてのリクエストは、悪意のあるアクターが偽のリクエストを送信し、エクスペリエンスを悪用するのを防ぐために 有効にする 必要があります。
ボタンをプレイヤーGUIに追加
A ScreenGui オブジェクトは、プレイヤーの PlayerGui オブジェクトに親属している場合にのみ画面上に表示されます。デフォルトでは、これにはチャットウィンドウなどのシステムGUIが含まれます。現在、アップグレードボタンを各プレイヤーの GUI にコピーし、押すときの動作を実装するために ReplicatedStorage でスクリプトを作成する必要があります。
参加するときにプレイヤーの GUI にボタンを追加するには:
エクスプローラー ウィンドウで、 ReplicatedStorage で スクリプト を作成します。
スクリプトを選択し、 プロパティ ウィンドウで、
- Set 名前 を JumpButtonClickHandler に設定します。
- 実行コンテキスト を クライアント に設定します。これは、エンジンにネットワーク通信を最適化するために、クライアント上でこのスクリプトを常に実行するように伝えます。
オープンスクリプトで、デフォルトコードを以下のコードで置き換えます:
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)-- プレイヤーのGUIに JumpPurchaseGui を追加jumpPurchaseGui.Parent = playerGuiコード説明次のセクションでは、コードをより詳細に説明します。
- GUI とサーバー機能への参照を取得する - 変数 IncreaseJumpPowerFunction、jumpPurchaseGui、および jumpButton には、後で必要になる機能と GUI の参照が含まれています。
- イベントハンドラーを定義する - onButtonClicked() は、ユーザーがアップグレードボタンをクリックしたときのロジックを定義します。それは pcall() (保護された呼び出し) を使用して、RemoteFunction を呼び出します。このようなクライアント-サーバー通信では、エラーや接続問題を処理するには pcall() が必要です。
- ハンドラーをボタンに接続する - Activated イベントは、マウス、タッチスクリーン、またはゲームパッドのコンテキストを含むすべてのプラットフォームで互換性があります。クリック、タッチ、またはゲームパッドボタンがリリースされるとトリガーされます。It triggers when a click , touch , or gamepad button is released.
プレイテスト
アップグレードボタンを使用して、コインのジャンプアップグレードを購入できるようになっているはずです。プロジェクトをテストするには:
ツールバーで プレイ ボタンをクリックします。Studio がプレイテストモードに入ります。
スクリプトが正しく機能している場合、ジャンプ力の購入ボタンが画面に表示されます。コインを収集する前にボタンをクリックして、追加のジャンプ力を授与しないかどうかを確認し、コインをいくつか収集して、再度クリックするとアップグレードが機能するかどうかを確認してください。
コードが完了したので、コインの量と位置でゲームのバランスを試してみてください。ゲームが遅すぎる場合は、コインを増やし、速すぎる場合はコインを控除し、挑戦的な場所に置くことで、より速く、簡単に感じます。