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

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

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

プロジェクトのセットアップ

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

スタータープロジェクトをロードする

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

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

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

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

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

  2. TreasureManager内で、デフォルトのモジュールテーブルの名前をmoduleからTreasureManagerに変更します。

    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を含む行を確認します。モジュールが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)を呼び出すためのlocal変数を作成します。

    • 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. TreasureManageropenChest()という名前の新しいモジュール関数を追加します。

    二つの引数を渡します:

    • 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. WorkspaceChests内のChestScriptを開きます。

  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を作成し、次のように設定します:

    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は、米国並びにその他の国における登録商標および非登録商標です。