モジュールスクリプトで作成する

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

モジュールスクリプトに関する知識を活かすために、プレイヤーが鍵を拾い、それを使用して宝箱を開けることができるモジュールスクリプトを作成します。

プロジェクト設定

このプロジェクトには、リーダーボードと鍵および宝箱のためのスクリプト化されたピックアップオブジェクトを含むスターターマップが含まれています。

スタータープロジェクトのロード

  1. スタータープロジェクトをダウンロードします。

  2. Roblox Studioでダウンロードしたファイルを開きます: Intro to Module Scripts - Starter Project.rbxl

モジュールスクリプトの作成

プレイヤーが宝箱から宝物を得ることができるように、TreasureManagerという名前のモジュールスクリプトを作成します。モジュールスクリプトを使用することで、ピックアップとリーダーボードを接続することができます。

  1. ServerStorage内に新しいModuleScriptを作成し、名前をTreasureManagerに変更します。

  2. TreasureManagerの中で、デフォルトのモジュールテーブルの名前を、moduleTreasureManagerに置き換えることで変更します。


    local TreasureManager = {}
    return TreasureManager

モジュールスクリプトで関数を使用する

モジュールスクリプトで関数がどのように機能するかをテストするために、getKey()という名前の新しい関数を作成します。getKey()関数が他のスクリプトから呼び出されると、破壊されるべき鍵パーツを受け取り、プレイヤーのインベントリ内の鍵の数に1を追加します。

鍵用のモジュール関数を作成する

  1. このモジュールスクリプトは、モジュール関数とローカル関数の組み合わせを使用します。二つのコメントを入力して、それらを分けておきます。


    local TreasureManager = {}
    ------------------ ローカル関数
    ------------------ モジュール関数
    return TreasureManager
  2. モジュール関数のコメントの下に、TreasureManagergetKey()という名前の新しいモジュール関数を追加します。

    二つのパラメータを使用します:

    • keyPart - 破壊するパーツ。
    • whichCharacter - 鍵パーツに触れたプレイヤー。

    local TreasureManager = {}
    ------------------ ローカル関数
    ------------------ モジュール関数
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. getKey()内で、keyPartを破壊します。


    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end

モジュール関数を使用する

現在、モジュール関数getKey()は他のスクリプトで使用できます。その関数をテストするために、あらかじめ作成されたスクリプトを開いて呼び出します。

  1. WorkspaceKeysKeyScript内のキースクリプトを開きます。

  2. keyScript内で、モジュールスクリプトをtreasureManagerという名前の変数に格納し、それを以下のように設定します: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- 下面のモジュールスクリプトを要求 ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. プレイヤーがパーツに触れたときに確認するためのpartTouched()という関数が既にあります。partTouched()の中で:

    • 鍵を破壊するためにgetKey()モジュール関数を呼び出します。
    • keyPartwhichCharacterを渡します。

    local ServerStorage = game:GetService("ServerStorage")
    -- 下面のモジュールスクリプトを要求 ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
    local function partTouched(otherPart, keyPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- プレイヤーに鍵を与えて鍵パーツを破壊する
    -- =============================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =============================================
    end
    end
  4. プロジェクトを実行し、鍵に触れるとそれが破壊されることを確認します。

トラブルシューティングのヒント

問題: "Infinite yield possible"を含むエラーメッセージが表示される。

  • スクリプト内でモジュールスクリプトのスペルを確認してください。TreasureManagerのように異なるスペルの場合、エラーが発生します。

問題: "attempt to index global"を含むエラーメッセージが表示される。

  • keyScript内のモジュールスクリプトを要求する行を確認してください。モジュールがrequireを含まない場合、そのモジュールスクリプトの関数や変数を使用することができません。

問題: スクリプトが実行されないか、鍵を拾えない。

  • モジュールスクリプト内で、すべてのコードがlocal TreasureManager = {}return TreasureManagerの間にあることを確認します。returnはモジュールスクリプト内の最終行でなければなりません。

  • requireの行の最後に二つの括弧があることを確認してください。WaitForChild("TreasureManager"))のように。

ローカル関数を作成する

現在、リーダーボードはプレイヤーの鍵と宝物を追跡しています。リーダーボードの数値を変更するためには、モジュールスクリプト内でローカル関数を使用します。ローカル関数は、プレイヤーの鍵または宝物の値を変更する必要があるのはTreasureManagerスクリプト内だけであり、他の場所では必要ないためです。

  1. ServerStorage内のTreasureManagerスクリプトを開きます。

  2. 次のことを行うローカル変数を作成します:

    • プレイヤーのリーダーボードの統計を操作できるように、Playersサービスを取得します。

    • keyPartに触れた後にプレイヤーが受け取る鍵の数を格納します。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ ローカル関数
    ------------------ モジュール関数
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. これらの二つのローカル関数をローカル関数セクションにコピー&ペーストします。

    • getPlayerKeys()は、プレイヤーのLockpicksリーダースタットの値を返します。

    • getPlayerTreasure()は、プレイヤーのTreasureリーダースタットの値を返します。


    ------------------ ローカル関数
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
    local function getPlayerTreasure(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Treasure")
    end
    ------------------ モジュール関数
  4. プレイヤーの鍵を追加するために、getKey()モジュール関数内で:

    • getPlayerKeys(whichCharacter)を呼び出すためのローカル変数を作成します。

    • keyDropの値をplayerKeysに追加します。


    ------------------ モジュール関数
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. プロジェクトを実行します。鍵に触れると、それが破壊され、プレイヤーのリーダーボードに1が追加されるかを確認します。

必要に応じて、スクリプトを以下のものと照らし合わせて、問題をトラブルシューティングします。

現在のTreasureManagerスクリプト

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ ローカル関数
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ モジュール関数
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

モジュールスクリプトから情報を取得する

TreasureManagerモジュールスクリプトは、プレイヤーが宝箱に触れたときに、開く前に少なくとも1つの鍵を持っているかどうかをチェックするために使用されます。

宝箱が開けるか確認する

  1. まず、ServerStorageTreasureManagerスクリプトで、宝箱を開くのに必要な鍵の数と、各宝箱に含まれる金の量の変数を設定します。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ ローカル関数
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. プレイヤーが宝箱を開くことができるかどうかをチェックする関数を作成するために、モジュール関数セクションに、TreasureManagerテーブルにcanOpenChest()という名前の新しい関数を追加し、パラメータwhichCharacterを含めます。


    ------------------ モジュール関数
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. 次のコードをcanOpenChest()にコピー&ペーストして、プレイヤーが十分な鍵を持っている場合はtrueを返し、持っていない場合はfalseを返します。


    function TreasureManager.canOpenChest(whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    if playerKeys.Value >= chestPickCost then
    return true
    else
    return false
    end
    end

プレイヤーに宝物を与える

プレイヤーが宝箱を開けることができるように、宝物を与えるための関数をTreasureManager内に作成します。

  1. TreasureManagerに新しいモジュール関数openChest()を追加します。

    二つの引数を渡します:

    • chestPart - 破壊する宝箱のパーツ。
    • whichCharacter - 宝物を与えるプレイヤー。

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. プレイヤーの鍵を減らし、宝物を与えるために、以下のコードをopenChest()にコピー&ペーストします。このコードは、以前に作成された変数(chestReward、宝箱ごとに与えられる宝物の量など)を使用します。


    function TreasureManager.openChest(chestPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    local playerTreasure = getPlayerTreasure(whichCharacter)
    playerKeys.Value = playerKeys.Value - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart.Parent:Destroy()
    end

宝箱の関数を呼び出す

現在、canOpenChest()openChest()という二つのモジュール関数が作成されたので、プレイヤーが宝箱のパーツに触れるときに、あらかじめ作成されたpartTouched()関数を使って呼び出すことができます。

  1. WorkspaceChestsChestScriptを開きます。

  2. treasureManagerという名前の新しい変数を作成し、ServerStorage内のTreasureManagerモジュールスクリプトを要求します。


    local ServerStorage = game:GetService("ServerStorage")
    -- 下面のモジュールスクリプトを要求
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. partTouched()内のif humanoid文の下に、新しい変数canOpenを作成し、以下のように設定します:

    treasureManager.canOpenChest(whichCharacter)


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- プレイヤーが宝箱を開くことができるかチェックし、宝物を得られるようにします
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. 次に、canOpenがtrueであるかどうかを確認するif文を作成します。

    • そうであれば、TreasureManagerのopenChest()関数を呼び出します。

    • 次に、二つのパラメータを渡します: chestPart、破壊する宝箱、そしてwhichCharacter、宝物を与えるプレイヤー。


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- プレイヤーが宝箱を開くことができるか確認し、宝物を得られるようにします
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =============================================
    end
    end
  5. プロジェクトを実行します。以下のことを確認します:

    • もし1つ以上の鍵を持っている場合、宝箱に触れるとそれが破壊され、宝物が与えられます。
    • もし0個の鍵しか持っていない場合、宝箱を開けることができません。

トラブルシューティングのヒント

  • ChestScriptで、canOpenChest()のようなモジュールスクリプトから呼び出された関数が、TreasureManagerスクリプトにあるスペルと正確に一致していることを確認してください。違いがある場合、エラーが発生します。

  • コピー&ペーストした関数、例えばtreasureManager.openChest()が、レッスンに表示されているように正確であることを確認してください。何らかの違いがあれば、スクリプトに微妙なエラーを引き起こすことがあります。

完成したスクリプト

完成したTreasureManagerスクリプト

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ ローカル関数
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ モジュール関数
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart.Parent:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
完成したChestScript

local ServerStorage = game:GetService("ServerStorage")
-- 下面のモジュールスクリプトを要求 ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- プレイヤーが宝箱を開くことができるか確認し、宝物を得られるようにします
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- すべての宝箱のパーツをタッチ関数にバインドするので、すべての部分で機能します
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
完成したkeyScript

local ServerStorage = game:GetService("ServerStorage")
-- 下面のモジュールスクリプトを要求 ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- プレイヤーに鍵を与えて鍵パーツを破壊する
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- すべての鍵パーツをタッチ関数にバインドするので、すべての部分で機能します
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

まとめ

Roblox体験におけるモジュールスクリプトを使用する一般的な用途は、プレイヤーにポイントを付与するなどの共通タスクを処理することです。この例では、プレイヤーにゲーム内オブジェクトと相互作用する際に鍵と宝物を与えるためのモジュールスクリプトTreasureManagerが作成されました。

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