
モジュールスクリプトに関する知識を活かすために、プレイヤーが鍵を拾い、それを使用して宝箱を開けることができるモジュールスクリプトを作成します。
プロジェクト設定
このプロジェクトには、リーダーボードと鍵および宝箱のためのスクリプト化されたピックアップオブジェクトを含むスターターマップが含まれています。
スタータープロジェクトのロード
Roblox Studioでダウンロードしたファイルを開きます: Intro to Module Scripts - Starter Project.rbxl。

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

TreasureManagerの中で、デフォルトのモジュールテーブルの名前を、moduleをTreasureManagerに置き換えることで変更します。
local TreasureManager = {}return TreasureManager
モジュールスクリプトで関数を使用する
モジュールスクリプトで関数がどのように機能するかをテストするために、getKey()という名前の新しい関数を作成します。getKey()関数が他のスクリプトから呼び出されると、破壊されるべき鍵パーツを受け取り、プレイヤーのインベントリ内の鍵の数に1を追加します。
鍵用のモジュール関数を作成する
このモジュールスクリプトは、モジュール関数とローカル関数の組み合わせを使用します。二つのコメントを入力して、それらを分けておきます。
local TreasureManager = {}------------------ ローカル関数------------------ モジュール関数return TreasureManagerモジュール関数のコメントの下に、TreasureManagerにgetKey()という名前の新しいモジュール関数を追加します。
二つのパラメータを使用します:
- keyPart - 破壊するパーツ。
- whichCharacter - 鍵パーツに触れたプレイヤー。
local TreasureManager = {}------------------ ローカル関数------------------ モジュール関数function TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagergetKey()内で、keyPartを破壊します。
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
モジュール関数を使用する
現在、モジュール関数getKey()は他のスクリプトで使用できます。その関数をテストするために、あらかじめ作成されたスクリプトを開いて呼び出します。
Workspace ⟩ Keys ⟩ KeyScript内のキースクリプトを開きます。
keyScript内で、モジュールスクリプトをtreasureManagerという名前の変数に格納し、それを以下のように設定します: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- 下面のモジュールスクリプトを要求 ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()プレイヤーがパーツに触れたときに確認するためのpartTouched()という関数が既にあります。partTouched()の中で:
- 鍵を破壊するためにgetKey()モジュール関数を呼び出します。
- keyPartとwhichCharacterを渡します。
local ServerStorage = game:GetService("ServerStorage")-- 下面のモジュールスクリプトを要求 ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- プレイヤーに鍵を与えて鍵パーツを破壊する-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendプロジェクトを実行し、鍵に触れるとそれが破壊されることを確認します。
トラブルシューティングのヒント
問題: "Infinite yield possible"を含むエラーメッセージが表示される。
- スクリプト内でモジュールスクリプトのスペルを確認してください。TreasureManagerのように異なるスペルの場合、エラーが発生します。
問題: "attempt to index global"を含むエラーメッセージが表示される。
- keyScript内のモジュールスクリプトを要求する行を確認してください。モジュールがrequireを含まない場合、そのモジュールスクリプトの関数や変数を使用することができません。
問題: スクリプトが実行されないか、鍵を拾えない。
モジュールスクリプト内で、すべてのコードがlocal TreasureManager = {}とreturn TreasureManagerの間にあることを確認します。returnはモジュールスクリプト内の最終行でなければなりません。
requireの行の最後に二つの括弧があることを確認してください。WaitForChild("TreasureManager"))のように。
ローカル関数を作成する
現在、リーダーボードはプレイヤーの鍵と宝物を追跡しています。リーダーボードの数値を変更するためには、モジュールスクリプト内でローカル関数を使用します。ローカル関数は、プレイヤーの鍵または宝物の値を変更する必要があるのはTreasureManagerスクリプト内だけであり、他の場所では必要ないためです。
ServerStorage内のTreasureManagerスクリプトを開きます。
次のことを行うローカル変数を作成します:
プレイヤーのリーダーボードの統計を操作できるように、Playersサービスを取得します。
keyPartに触れた後にプレイヤーが受け取る鍵の数を格納します。
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ ローカル関数------------------ モジュール関数function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerこれらの二つのローカル関数をローカル関数セクションにコピー&ペーストします。
getPlayerKeys()は、プレイヤーのLockpicksリーダースタットの値を返します。
getPlayerTreasure()は、プレイヤーのTreasureリーダースタットの値を返します。
------------------ ローカル関数local function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ モジュール関数プレイヤーの鍵を追加するために、getKey()モジュール関数内で:
getPlayerKeys(whichCharacter)を呼び出すためのローカル変数を作成します。
keyDropの値をplayerKeysに追加します。
------------------ モジュール関数function TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endプロジェクトを実行します。鍵に触れると、それが破壊され、プレイヤーのリーダーボードに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つの鍵を持っているかどうかをチェックするために使用されます。
宝箱が開けるか確認する
まず、ServerStorage ⟩ TreasureManagerスクリプトで、宝箱を開くのに必要な鍵の数と、各宝箱に含まれる金の量の変数を設定します。
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ ローカル関数local function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endプレイヤーが宝箱を開くことができるかどうかをチェックする関数を作成するために、モジュール関数セクションに、TreasureManagerテーブルにcanOpenChest()という名前の新しい関数を追加し、パラメータwhichCharacterを含めます。
------------------ モジュール関数function TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()end次のコードをcanOpenChest()にコピー&ペーストして、プレイヤーが十分な鍵を持っている場合はtrueを返し、持っていない場合はfalseを返します。
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
プレイヤーに宝物を与える
プレイヤーが宝箱を開けることができるように、宝物を与えるための関数をTreasureManager内に作成します。
TreasureManagerに新しいモジュール関数openChest()を追加します。
二つの引数を渡します:
- chestPart - 破壊する宝箱のパーツ。
- whichCharacter - 宝物を与えるプレイヤー。
function TreasureManager.openChest(chestPart, whichCharacter)endプレイヤーの鍵を減らし、宝物を与えるために、以下のコードをopenChest()にコピー&ペーストします。このコードは、以前に作成された変数(chestReward、宝箱ごとに与えられる宝物の量など)を使用します。
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.Parent:Destroy()end
宝箱の関数を呼び出す
現在、canOpenChest()とopenChest()という二つのモジュール関数が作成されたので、プレイヤーが宝箱のパーツに触れるときに、あらかじめ作成されたpartTouched()関数を使って呼び出すことができます。
Workspace ⟩ ChestsでChestScriptを開きます。
treasureManagerという名前の新しい変数を作成し、ServerStorage内のTreasureManagerモジュールスクリプトを要求します。
local ServerStorage = game:GetService("ServerStorage")-- 下面のモジュールスクリプトを要求local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()partTouched()内のif humanoid文の下に、新しい変数canOpenを作成し、以下のように設定します:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- プレイヤーが宝箱を開くことができるかチェックし、宝物を得られるようにします-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endend次に、canOpenがtrueであるかどうかを確認するif文を作成します。
そうであれば、TreasureManagerのopenChest()関数を呼び出します。
次に、二つのパラメータを渡します: chestPart、破壊する宝箱、そしてwhichCharacter、宝物を与えるプレイヤー。
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- プレイヤーが宝箱を開くことができるか確認し、宝物を得られるようにします-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendプロジェクトを実行します。以下のことを確認します:
- もし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が作成されました。