プロジェクトが複雑になるにつれて、スクリプトの整理方法を考えることが重要になります。適切な整理の慣行は、スクリプト間でコードが重複したり、管理が難しくなったりしないようにするのに役立ちます。
コードを整理して再利用するためのより良い方法は、モジュールスクリプトを使用することです。モジュールスクリプトは、プレイヤーの資金や敵を管理するといった共有の目的に合わせて設計された関数や変数のセットを格納するためのユニークなタイプのスクリプトです。モジュールスクリプト内のコードは、他のスクリプトで使用できます。これにより、プレイヤーがクエストを完了したり、ピックアップを見つけたりするたびに、異なるスクリプトから同じコインを与える関数を呼び出すことができます。
一般的に使用されるコードをモジュールスクリプトに格納することで、コードのメンテナンスと整理が容易になり、複数のスクリプトを更新するのではなく、1つのモジュールスクリプトにのみ変更を加えれば済むようになります。
モジュールスクリプトの基本
モジュールスクリプトは、スクリプトオブジェクトとは異なる別のオブジェクトです。Robloxでは、モジュールスクリプトは紫色のアイコンで示されます。
モジュールスクリプトの作成
モジュールスクリプトは、サーバーサイドスクリプトで使用される場合はServerScriptServiceに、クライアントサイドのローカルスクリプト(例えばGUIの操作)で使用される場合はReplicatedStorageに配置されます。
- ServerScriptServiceにModuleScriptを作成します。

モジュールスクリプトの構造
作成されると、すべてのモジュールスクリプトは以下のコードで開始します。
local Module = {}return Module
local Module = {}という行は、モジュールの共有関数や変数を格納できるテーブル、またはコードのコンテナを作成します。このテーブルは、RewardManagerやParticleControllerなど、モジュールの目的に合わせて名前を変更するべきです。他の変数がキャメルケース(myVariable)であるのに対し、モジュールテーブルはパスカルケースを使用し、大文字で始めることが推奨されます(MyModule)。
local RewardManager = {}return RewardManager
モジュールの非ローカル関数や変数を他のスクリプトが使用できるようにするために、すべてのモジュールはreturn MyModuleで終了します。他のスクリプトがモジュールからコードを取得しようとするとき、returnはそのスクリプトにモジュールテーブル内のコードへのアクセスを許可します。
モジュールスクリプトへの追加
モジュールに他のスクリプトで使用できる関数や変数を追加するには、モジュールテーブルの名前の後にドット、そして関数や変数の名前をタイプします。例えばTestModule.myVariableのようになります。ドット演算子を使用することで、テーブルにコードを追加する別の方法であり、他のスクリプトがモジュールテーブルが返されたときにそのコードにアクセスできるようにします。
local TestModule = {}
-- 'TestModule'テーブルに変数を追加
TestModule.myVariable = 100
-- 'TestModule'テーブルに関数を追加
function TestModule.doTask(player)
-- プレースホルダーコード
end
return TestModule
モジュールスクリプトでのスコープ
モジュールの関数や変数を外部のスクリプトで使用するためには、localとタイプしないでください。
変数や関数の前にlocalをタイプすると、それらはそのスクリプトだけで使用可能になります。これは、エラーやトラブルシューティングを減らすためにほとんどのスクリプトにとって良い慣行ですが、モジュールスクリプトの関数や変数をローカルにすることはできません。
そのモジュールスクリプト内だけで使用されるすべてのコードには、依然としてlocalを含めるべきです。例えば、以下のコードは、モジュールスクリプト内でのみ使用できるローカル変数difficultyModifierと、モジュールの外部スクリプトで使用できる関数getCoinReward()を含んでいます。
local RewardManager = {}
-- モジュールスクリプト内でのみ使用可能
local rewardCoins = 50
-- モジュールスクリプト内でのみ使用可能
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- 他のスクリプトで使用可能
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
他のスクリプトでモジュールを使用する
モジュールスクリプトだけではコードを実行できません。別のスクリプトでキーワードrequire()を使用して読み込む必要があります。関数require()は、モジュールスクリプトのExplorer内の場所を示す1つの引数を受け取ります。
モジュールを使用するには、別のスクリプト内で変数をrequire(moduleScript)に等しく設定します。
local MyModule = require(ServerStorage.ModuleScript)
これで、変数MyModuleにはそのモジュールスクリプトで作成されたモジュールテーブルが含まれます。そのテーブルから関数や変数を使用するには、変数名の後にドットをつけて、モジュールスクリプトで使用したい名前を完全にタイプします。例えばMyModule.myFunction()のようにします。スクリプトが実行され、その行に達すると、モジュールテーブル内に格納された特定の関数や変数にアクセスします。
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
RewardManagerの例
ModuleScript - RewardManager
local RewardManager = {}
-- モジュールスクリプト内でのみ使用可能
local rewardCoins = 50
-- モジュールスクリプト内でのみ使用可能
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- 他のスクリプトで使用可能
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- モジュールスクリプトをロードlocal RewardManager = require(ServerStorage.RewardManager)-- モジュールスクリプトから関数を呼び出すlocal coins = RewardManager.getCoinReward("easy")print("Should award " .. coins .. " coins")
一般的なトラブルシューティング
ここでのヒントはいくつかのモジュールスクリプトを使用する際の一般的な問題に対処します。モジュールスクリプトは複雑なトピックであり、より細かいニュアンスがありますので、留意してください。より詳細については、モジュールスクリプトに関するより技術的なガイドをご覧ください。
問題: "Infinite yield possible"または"not a valid member"を含むエラーメッセージが表示される。
- 読み込まれているモジュールスクリプトのスペルを確認してください。require()には、モジュールスクリプトの正確なパスとスペルが含まれている必要があります。モジュールテーブルとは異なる名前が付けられているかもしれません。
問題: "attempt to index global"を含むエラーメッセージが表示される。
- モジュールスクリプトを使用するスクリプトでは、require()を使用して読み込まれていることを確認してください。そうでないと、そのスクリプトはモジュールスクリプトの関数や変数を使用できません。
まとめ
Robloxのモジュールスクリプトは、コーダーがコードを整理し、再利用するための方法です。モジュールスクリプトは通常、ServerStorage(またはクライアントベースの操作の場合はReplicatedStorage)に保存されます。そこから、他のスクリプトはそのモジュールスクリプトに格納された関数や変数を呼び出すことができます。
例えば、ある体験ではプレイヤーがオブジェクトを集めることでポイントを獲得します。モジュールスクリプトがポイントを与えるためのコードを処理できます。次に、異なるタイプのオブジェクトのスクリプトはモジュールスクリプトの関数を呼び出すだけで済みます。これにより、スクリプト間でコードを再利用する必要が減り、コードの理解とメンテナンスが容易になります。