コインコレクションメカニックを作成

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


3D 世界を持っていることになると、このチュートリアルのセクションでは、コインの収集メカニズムを定義する方法を学びます。このメカニズムは、プレイヤーがコインを集めることを許可し、最近収集されたコインを無効にします。

コインを作成する

何もスクリプトできる前に、コインとして使用するために世界にプレースホルダーオブジェクトが必要です。例え、前のセクションで作成した海賊スタックプラットフォームのように、コインはシンプルな Part オブジェクトです。

コインを作成するには:

  1. In the エクスプローラー window, add a new フォルダ into the ワールド フォルダ, then rename it コイン .

  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 BrickColor to Gold
    • 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. In the Explorer ウィンドウ, ServerScriptService の上にマウスポインタを置き、 ボタンをクリックします。コンテキストメニューが表示されます。

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

    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 サービスは、共通の機能について内蔵の機能を提供します。スクリプトはまず、Workspace のインスタンスを取得し、3D 世界に含まれるすべてのオブジェクトを含む、Player を管理します。

    • コインのオブジェクトにアクセスするための参照をすべて入手する - スクリプトは次に 3D ワークスペースからコインオブジェクトの参照をすべてのコインオブジェクトに GetChildren() メソッドでクエリーします。このメソッドは、以前に作成

    • グローバル変数を定義します - 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 世界を物理的にシミュレートし、レンダリング、物理、およびネットワークに関連するイベントを処理するためのロジックを多くの処理を処理します。当該イベントのスクリプトを作成するために、エンジンはコーヒンタイム、

    • コインが有効かどうかを検出します - すべての Instance には、3D 世界にオブジェクトが存在するかどうかを定義する Enabled ブールストラティビティが含まれています。Enabled メソッドを使用してインスタンス属性を取得できます。

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

    • コインをタッチした場合、プレイヤーが 10 秒後に再び有効化するようにします。 - 最終的に、プレイヤーがコインをタッチした場合、メソッドはコインを無効にし、10秒後に再び有効化します。task.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() ハンドラーメ

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

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

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

コインコレクションメカニズムが期待通りに機能するかどうかを確認する時間です。エクスペリエンスをプレイテストするには:

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

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. キャラクターをコインに触れるように移動します。スクリプトが正しく動作すると、出力 ウィンドウは Player collected coin を表示し、コインは 10秒間消えてから再び表示されます。

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