コインコレクションメカニズムを作成する

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


3D ワールドがあることにより、このチュートリアルのこのセクションでは、最初のスクリプトを追加してコイン収集メカニズムを定義する方法を教えます。このメカニズムにより、プレイヤーはコインを収集でき、最近収集されたコインの収集を無効にできます。

コインを作成する

何かをスクリプトする前に、世界にコインとして使用するプレースホルダーオブジェクトが必要です。前のセクションで作成した海のスタックプラットフォームと同様、コインは単純な Part オブジェクトになる可能性があります。

コインを作成するには:

  1. エクスプローラー ウィンドウで、新しいフォルダを ワールド フォルダに追加し、名前を コイン に変更します。

  2. 挿入 シリンダー パーツを コイン フォルダに挿入し、パーツの名前を コイン に変更します。

    Studio's Explorer window with the Coin part highlighted. The hierarchy of the Workspace to World folder to Coins folder to Coin part is also highlighted.
  3. パーツを選択し、 プロパティ ウィンドウで、

    • ブリックカラーゴールド に設定。
    • マテリアルメタル に設定。
    • Set サイズ0.6, 8, 4 に設定します。
    • 無効にする CanCollide 。これは、エンジンに他の部分がコインを通過できると伝え、つまりプレイヤーがコインを集めるためにコインを通り抜けることができるという意味です。
    • 有効化 アンカー済み 。これにより、エンジンは物理関連のシミュレーションによってコインの位置を変更しないように指示し、プレイヤーはコインの位置に影響を与えずにタッチできます。
    A close up view of a gold coin next to two gray cylinder sea stacks on the island.
  4. いくつかのコインを複製し、テスト目的でマップの周りに配置します。

    Studio's Explorer window with multiple Coin parts highlighted under the Coins folder. A view of multiple coins on the island and two gray cylinder sea stacks.

シリンダーパーツは今コインのように見え、物理シミュレーションを防いでいますが、プレイヤーがそれらを集めることができるように、コインにロジックを追加する必要があります。

スクリプトを作成

コインを収集可能にするには、プレイヤーが触ったときに反応したいと思います。Roblox エンジンは、何かがコインに触れたときに通知できますが、スクリプトでそれを宣言する必要があります。スクリプトを作成するには:

  1. エクスプローラー ウィンドウServerScriptService をホバーし、 ボタンをクリックします。コンテキストメニューが表示されます。

  2. コンテキストメニューから、 スクリプト を選択します。新しいスクリプトは、 ServerScriptService の下に表示され、エンジンにサーバー上でスクリプトを実行するように指示し、クライアントがコードにアクセスするのを防ぎます。

    Studio's Explorer window with both ServerScriptService's plus icon and Script object highlighted.
  3. スクリプトを CoinService に名前変更します。

    Studio's Explorer window with the CoinService script highlighted under ServerScriptService.
  4. デフォルトコードを次のコードで置き換えます:


    -- サービスと変数の初期化
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local coinsFolder = Workspace.World.Coins
    local coins = coinsFolder:GetChildren()
    local COOLDOWN = 10
    -- イベントハンドラを定義する
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- プレイヤーがコインに触れた
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    print("Player collected coin")
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- イベント受信機を設定する
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    今、プレイヤーがコインに触れるたびに、コインは 10秒間消え、出力ログは Player collected coin を印刷します。

    次のセクションでは、スクリプトの機能がより詳細に説明されています。

    サービスと変数を初期化する

    他の言語で書いたコードの多くと同様、後でスクリプトの上部で必要な変数を定義します。私たちのコードは以フォロー中を行います:

    • サービスインスタンスを取得する - Roblox サービスは、一般的な機能に内蔵機能を提供します。スクリプトはまず、3D ワールドにあるすべてのオブジェクトを含む Workspace サービス、およびエクスペリエンスに接続されたすべてのプレイヤーを管理および含む Player サービスを取得します。

    • すべてのコインに対する参照を取得する - スクリプトは、GetChildren() メソッドで、すべてのコインオブジェクトに対する参照を 3D ワークスペースにクエリします。このメソッドは、関連するオブジェクトに属するすべてを含む配列を返し、この場合は以前に作成した Workspace.World.Coins フォルダです。

    • グローバル変数を定義する - COOLDOWN 変数は後で使用されて、コインが収集された後に無効にする期間を定義するために使用されます。

      サービスと変数の初期化

      local Workspace = game:GetService("Workspace")
      local Players = game:GetService("Players")
      local coinsFolder = Workspace.World.Coins
      local coins = coinsFolder:GetChildren()
      local COOLDOWN = 10
      ...

    イベントハンドラーを定義する

    Roblox エンジンは物理的に 3D 世界をシミュレートし、レンダリング、物理、ネットワーキングに関連するイベントを処理するための多くのロジックを処理します。これらのイベントの一部で自分のロジックをスクリプトすることに興味があるとき、エンジンが残りを処理する間、それらを聞き取って処理できます。この場合、タッチされたコインに関連するイベントを聞き取り、処理します。スクリプトは、フォロー中の操作を行う onCoinTouched() メソッドで、このイベントの処理ロジックを定義します:

    • コインが有効になっているかどうかを検出する - すべての Instance には、オブジェクトが 3D ワールドに存在するかどうかを定義する Enabled ブールアトリビュートがあります。インスタンス属性を GetAttribute() メソッドで取得できます。

    • プレイヤーがコインに触れたかどうかを検出する - コインが有効になっている場合、メソッドはプレイヤーサービスを使用して、コインに触れたオブジェクトが本当にプレイヤーであるかどうかをチェックします。タッチイベントが発生すると、Roblox エンジンはコインに触れたオブジェクトを otherPart パラメータとしてパスします。スクリプトは、otherPart の親がプレイヤーに属しているかどうかをチェックします。

    • プレイヤーがコインに触れた場合、コインを無効にし、10秒後に再び有効にする - 最後に、プレイヤーがコインに触れた場合、メソッドはコインを無効にし、10秒待ってからコインを収コレクションするために再び有効にする。task.wait() は、コードの実行を完全に停止せず、他のスレッドのタスクを同時に実行できるようにするため、wait() の代わりに使用されます。

      イベントハンドラーの定義

      local function onCoinTouched(otherPart, coin)
      if coin:GetAttribute("Enabled") then
      local character = otherPart.Parent
      local player = Players:GetPlayerFromCharacter(character)
      if player then
      -- プレイヤーがコインに触れた
      coin.Transparency = 1
      coin:SetAttribute("Enabled", false)
      print("Player collected coin")
      task.wait(COOLDOWN)
      coin.Transparency = 0
      coin:SetAttribute("Enabled", true)
      end
      end
      end

    イベントハンドラーを接続する

    すべてのシミュレーションされた 3D オブジェクトは、BasePart から継承しており、それゆえ、Touched() イベントがあります。次のループは、次の操作を行って、すべてのコインのタッチイベントに onTouchedEvent() ハンドラーを接続します:

    • すべてのコインをループする - 一般的な反復を使用して、コインのそれぞれをループします。

    • ハンドラーをイベントに接続する - ループの各回転では、デフォルトでコインが有効になるため、エクスペリエンスの初期起動中に 3D ワールドで表示されます。onCoinTouched() ハンドラーメソッドも、コインの Touched イベントに接続されており、イベントが発生するたびに実行されます。エンジンがタッチを検出すると、タッチしたオブジェクトもパスします、otherPart

      イベントハンドラを接続する

      for _, coin in coins do
      coin:SetAttribute("Enabled", true)
      coin.Touched:Connect(function(otherPart)
      onCoinTouched(otherPart, coin)
      end)
      end

メカニックをプレイテストする

コインコレクションメカニズムが意図通りに機能しているかを確認する時が来ました。エクスペリエンスをプレイテストするには:

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

    Play button highlighted in Studio's playtesting options.
  2. キャラクターを動かしてコインに触れます。スクリプトが正しく機能している場合、 出力 ウィンドウが Player collected coin 表示され、コインは再出現する前に 10 秒間消えます。

    Studio's Output window that displays confirmation that the player collected a coin.