
モジュールスクリプトに関する知識を適用するために、プレイヤーが鍵を拾い、それを使って宝箱を開けることができるモジュールスクリプトを作成します。
プロジェクトのセットアップ
このプロジェクトには、リーダーボードと鍵および宝箱のスクリプト化されたピックアップオブジェクトを含むスターターマップが含まれています。
スタータープロジェクトをロードする
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を含む行を確認します。モジュールが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)を呼び出すためのlocal変数を作成します。
keyDropの値をplayerKeysに加えます。
------------------ モジュール関数function TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endプロジェクトを実行します。鍵に触れると、それが破壊され、リーダーボードのプレイヤーの鍵に1が加算されることを確認します。

必要に応じて、トラブルシューティングの問題に対して以下のスクリプトを確認してください。
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()endcanOpenChest()内に以下のコードをコピー&ペーストして、プレイヤーが十分な鍵を持っている場合は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を作成し、次のように設定します:
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())がレッスンに示された通りであることを確認します。違いがあると、スクリプトに微妙なエラーが発生する可能性があります。
完成したスクリプト
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 TreasureManagerlocal 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)
endlocal 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という名前のモジュールスクリプトが作成されました。