モジュールスクリプトの知識を適用するには、プレイヤーが鍵を拾うことができ、それらを使用して宝箱を開くようにするモジュールスクリプトを作成します。
プロジェクト設定
このプロジェクトには、キーと宝箱のためのスクリプト付きピックアップオブジェクトが含まれているスターターマップが含まれています。
スタータープロジェクトをロードする
In Roblox Studio、ダウンロードしたファイル: Intro to Module Scripts - Starter Project.rbxl を開きます。
モジュールスクリプトを作成
プレイヤーが宝箱から宝を手に入れ、TreasureManager という名前のモジュールスクリプトを作成できます。モジュールスクリプトを使用すると、ピックアップとリーダーボードを連接できます。
In ServerStorage で、新しい ModuleScript を作成し、TreasureManager に名前を変更します。
In TreasureManager で、デフォルトのモジュールテーブルを module に置き換えて、両方の場所で TreasureManager に変更します。
local TreasureManager = {}return TreasureManager
モジュールスクリプトで関数を使用する
モジュールスクリプトの機能がどのように動作するかをテストするには、getKey() という名持ち物リストの新しい関数を作成します。getKey() 関数が別のスクリプトから呼び出されると、キーを受信し、プレイヤーのインベントリのキーの数に 1 を追加します。
鍵のモジュール機能を作成
このモジュールスクリプトは、モジュールとローカル関数の組み合わせを使用して、 2 行のコメントをタイプして、あなたがそれらを分離するのを助けます。
local TreasureManager = {}--Local Functions------------------ モジュール機能return TreasureManagerUnder the コメントするジュール機能 comment, add a new module function to TreasureManager named getKey() 。
2つのパラメータを使用してください:
- keyPart - 破壊する部品。
- whichCharacter - キーの部分に触れたプレーヤー。
local TreasureManager = {}--Local Functions------------------ モジュール機能function TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerIn getKey() , destroy keyPart .
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
モジュール機能を使用
さあ、モジュール機能 getKey() は他のスクリプトで使用できます。その機能をテストするには、プリメイドスクリプトを開き、それを呼び出します。
Open the key script in ワークスペース > キー > キースクリプト .
In keyScript で、 module スクリプトを変数名 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() :
- Key モジュール機能を呼び出して、キーを破壊します。
- パス 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 がスペルされている場合、スクリプト内のスペルが異なるため、エラーが発生する可能性があります。 問題: グローバルインデックスを含むエラーメッセージを取得します。
keyScript の中のモジュールスクリプトの要求を含む行をチェックします。モジュールスクリプトに要必須が含まれていない場合、そのモジュールスクリプトの機能や変数を使用できません。 問題: スクリプトが実行されないか、キーを取得できません。
モジュールスクリプトで、すべてのコードが local TreasureManager = {} と return TreasureManager の間にあることを確認してください。返す必須はモジュールスクリプトの最後のコードです。
チェックし必須、WaitForChild("TreasureManager")) のように、行の終わりに「」が 2 個あることを確認してください。
ローカル関数を作成
現在、リーダーボードはプレイヤーのキーと宝物を追跡します。リーダーボードの数を変更するには、モジュールスクリプトのローカル関数を使用します。ローカル関数は、プレイヤーのキーまたは宝物の値を変更するだけでなく、他の場所では必要ない場合があります。
In ServerStorage で、TreasureManager スクリプトを開きます。
フォロー中のコードを実行するには、ローカル変数を作成してください:
スクリプトがプレイヤーのランクボード統計と一緒に動作できるようにするためにプレイヤーサービスを取得します。
ストアプレイヤーが keyPart に触れた後に受け取るキーの数を保存します。
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1--Local Functions------------------ モジュール機能function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerこれらの 2つのローカル関数を ローカル関数 セクションにコピーして貼り付けます。
getPlayerKeys() は、プレイヤーの Lockpicks リーダーステータスの値を返します。
getPlayerTreasure() は、プレイヤーの Treasure リーダーステータスの値を返します。
--Local Functionslocal 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------------------ Module Functionsプレイヤーのキーに追加するには、 getKey() モジュールの機能:
Create a local 変数 to call getPlayerKeys(whichCharacter) .
keyDrop の値を playerKeys に追加します。
------------------ モジュール機能function TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endプロジェクトを実行します。キーをタッチすると破壊され、リーダーボードにプレイヤーのキーに 1 が追加されます。
必要に応じて、スクリプトを以下の 1つにチェックして、問題の修正を行います。
Current TreasureManager Script
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
--Local Functions
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 Functionslocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")end「モジュール機能」セクションの「チェストを開ける」をチェックする機能を作成するには、 TreasureManager テーブルの名前を変更し、パラメーターを canOpenChest に設定します。2>
------------------ モジュール機能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() に追加します。
2つの引数をパスします:
- 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:Destroy()end
胸部機能を呼び出す
2つのモジュール機能、 canOpenChest() と openChest() が作成されたため、プレメイドの partTouched() 関数を使用して、プレイヤーが触れるたびにチェストのパーツを呼び出すことができます。
In ワークスペース > チェスト > チェストスクリプト を開く。
新しい変数を作成し、treasureManager と名付け、TreasureManager モジュールスクリプトを サーバーストレージ に要求します。
local ServerStorage = game:GetService("ServerStorage")-- 以下のモジュールスクリプトが必要ですlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()In 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 が真であるかどうかをチェックする if のステートメントを作成します。
そうである場合は、TreasureManager の openChest() 関数を呼び出します。
次に、2つのパラメータを通過します: 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 個のキーがある場合、宝箱を開けることはできません。
トラブルシューティングのヒント
In チェストスクリプト で、モジュールスクリプトから呼び出される関数が canOpenChest() のようにスペルされていることを確認してください。任意の違いはエラーを引き起こす可能性があります。
レッスンに示されているように、treasureManager.openChest() のようなコピーと貼り付ける関数が正確に表示されていることを確認してください。任意の違いはスクリプトで微妙なエラーを引き起こす可能性があります。
完了したスクリプト
宝物マネージャースクリプトを完了しました
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
--Local Functions
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: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]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
完了したキースクリプト
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 というモジュールスクリプトが、ゲームオブジェクトとのインタラクションに応じてプレイヤーにキーと宝を提供するように構築されました。