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

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


プレイヤーは今、コインを集めて死んだときに失うことができますが、コインは何もしません、そしてゲーム世界のほとんどが非常に高くジャンプできる能力なしでアクセスできません。このチュートリアルのセクションでは、コインを使ってジャンプ力を増やす画面上のボタンを追加することで、エクスペリエンスのロジックを終了する方法を教えます。

アップグレードボタンを作成

Roblox の 2D インターフェイスは、一般的に GUI コンテナ内の GUI コンポーネントのコレクションで構成されています。この場合、コンテナ内で アップグレードジャンプ(5コイン)と言う のみのコンポーネントが必要です。

GUI を作成するには:

  1. エクスプローラー ウィンドウで、新しいフォルダを ReplicatedStorage に追加し、フォルダの名前を インスタンス に変更します。 ReplicatedStorage のどのオブジェクトも、GUI が表示される場所である各プレイヤーの Roblox クライアントにアクセスできます。
  2. インスタンス フォルダに ScreenGui オブジェクトを追加します。
  3. Select the ScreenGui オブジェクト、 then in the プロパティ ウィンドウ、
    1. Set 名前JumpPurchaseGui に設定します。
    2. リスポーン時に GUI がプレイヤーに依存したままであるように、 ResetOnSpawn を無効にして、プレイヤーがリスポーンするときに GUI が親になるようにします。
  4. エクスプローラ ウィンドウで、 テキストボタン を JumpPurchaseGui コンテナに挿入し、テキストボタンの名前を JumpButton に変更します。
  5. (オプション) ボタンの外観と位置をカスタマイズするには、プロパティを構成してください。単純な提案には次のものがあります:
    • テキスト プロパティを ジャンプのアップグレード (5コイン) に設定します。
    • テキストサイズ プロパティを 25 に設定します。
    • アンカーポイント を と 位置 を に設定して、ボタンを右下隅に移動します。

このチュートリアルの後でプレイヤーの GUI にボタンを追加しますが、追加する前に、ボタンが機能するために必要なすべてのロジックとデータを定義する必要があります。

ジャンプパワーデータを定義する

現在、コイン数のみが PlayerData モジュールスクリプトで各プレイヤーに保存されています。同じ方法でジャンプ力も保存して更新する必要があります。 プレイヤーデータ の機能は、変更されるデータに特定的ではないため、プレイヤーのジャンプ力を保存するために必要なものはすべて、 キーを追加し、初期値を で初期化することです。

ジャンプ力を保存するために PlayerData モジュールスクリプトを更新するには:

  1. エクスプローラー ウィンドウで、 PlayerData モジュールスクリプトを ServerStorage で開きます。

  2. スクリプトのコードを次のサンプルで置換し、それぞれのプレイヤーの既存の 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_DATA
    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 がジャンプ力を追跡できるようになったので、サーバー上でロジックを実装して、プレイヤーのクライアントリクエストからジャンプ力をアップグレードする必要があります。

サーバーとクライアントは、リモートイベント または リモート機能 を介して通信できます。リモートイベントは発射されると生成しないため、一方通行の通信に適しています。リモート関数は、返答を受けるまで生成され、2方向通信を可能にします。この場合、クライアントはサーバーがプレイヤーのジャンプ力をうまくアップグレードしたかどうかを知る必要があるので、リモート関数が理想的です。

ジャンプアップグレードを実装するには:

  1. エクスプローラ ウィンドウで、 ReplicatedStorage の インスタンス フォルダを開きます。

  2. リモート機能 を インスタンス フォルダに挿入し、リモート機能の名前を JumpPowerIncreaseFunction に変更します。クライアントとサーバーの両方がアクセスできる必要があるため、常に ReplicatedStorage でリモート機能を作成します。

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. In the エクスプローラー window, select StarterPlayer .

  4. プロパティ ウィンドウで、 CharacterUseJumpPower プロパティを有効にします。デフォルトでは、キャラクターのジャンプ力値はキャラクターがジャンプする量を定義しませんので、これを有効にする必要があります。

  5. エクスプローラー ウィンドウ で、新しいスクリプトを ServerScriptService に挿入し、スクリプトの名前を JumpService に変更します。このスクリプトには、ジャンプアップグレードのロジックが含まれます。

  6. デフォルトコードを次のコードで置き換えます:


    -- サービス
    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
    -- プレイヤー追加イベントに接続する前に追加されたプレイヤーを初期化する
    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 がプレイヤーがアップグレードされているため、機能は JumpPower プロパティを PlayerData に保存された新しい値に更新し、30を増加します。ゲームがわずかに長く続くようにしたい場合は、この数を減らすことができます。

    • サーバーリクエストの検証 - onPurchaseJumpIncrease() 最初にプレイヤーがアップグレードを購入するために必要なコイン数を持っているかどうかをチェックします。 すべてのリクエスト クライアントからサーバーへのすべてのリクエストは、悪意のあるアクターが偽のリクエストを送信し、エクスペリエンスを悪用するのを防ぐために 有効にする 必要があります。

ボタンをプレイヤーGUIに追加

A ScreenGui オブジェクトは、プレイヤーの PlayerGui オブジェクトに親属している場合にのみ画面上に表示されます。デフォルトでは、これにはチャットウィンドウなどのシステムGUIが含まれます。現在、アップグレードボタンを各プレイヤーの GUI にコピーし、押すときの動作を実装するために ReplicatedStorage でスクリプトを作成する必要があります。

参加するときにプレイヤーの GUI にボタンを追加するには:

  1. エクスプローラー ウィンドウで、 ReplicatedStorage で スクリプト を作成します。

  2. スクリプトを選択し、 プロパティ ウィンドウで、

    1. Set 名前JumpButtonClickHandler に設定します。
    2. 実行コンテキスト を クライアント に設定します。これは、エンジンにネットワーク通信を最適化するために、クライアント上でこのスクリプトを常に実行するように伝えます。
  3. オープンスクリプトで、デフォルトコードを以下のコードで置き換えます:


    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
    -- 購入されたものは、成功が false の場合はエラーメッセージになります
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- プレイヤーのGUIに JumpPurchaseGui を追加
    jumpPurchaseGui.Parent = playerGui

    次のセクションでは、コードをより詳細に説明します。

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

プレイテスト

アップグレードボタンを使用して、コインのジャンプアップグレードを購入できるようになっているはずです。プロジェクトをテストするには:

  1. ツールバーで プレイ ボタンをクリックします。Studio がプレイテストモードに入ります。

    Play button highlighted in Studio's playtesting options.
  2. スクリプトが正しく機能している場合、ジャンプ力の購入ボタンが画面に表示されます。コインを収集する前にボタンをクリックして、追加のジャンプ力を授与しないかどうかを確認し、コインをいくつか収集して、再度クリックするとアップグレードが機能するかどうかを確認してください。

コードが完了したので、コインの量と位置でゲームのバランスを試してみてください。ゲームが遅すぎる場合は、コインを増やし、速すぎる場合はコインを控除し、挑戦的な場所に置くことで、より速く、簡単に感じます。