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

モジュールスクリプトの構造
作成されると、すべてのモジュールスクリプトは以下のコードから始まります。
local Module = {}
return Modulelocal 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内の場所を引数として受け取ります。
モジュールを使用するには、別のスクリプトで変数をrequire(moduleScript)に等しく設定します。
local MyModule = require(ServerStorage.ModuleScript)これで、変数MyModuleには、そのモジュールスクリプトで作成されたモジュールテーブルが含まれます。そのテーブルから関数や変数を使用するには、変数名の後にドットを付けて、モジュールスクリプト内で使用する正確な名前を記述します。例えば、MyModule.myFunction()のようにします。スクリプトが実行され、その行に達すると、モジュールテーブルに格納された特定の関数や変数にアクセスします。
local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()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 RewardManagerlocal 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)に格納されます。そこから、他のスクリプトはそのモジュールスクリプトに格納された関数や変数を呼び出すことができます。
例えば、あるゲームでは、オブジェクトを収集することでプレイヤーにポイントを与えることがあります。モジュールスクリプトはポイントを与えるコードを処理できます。その後、異なるタイプのオブジェクトのスクリプトは、モジュールスクリプトの関数を呼び出すだけで済みます。これにより、スクリプト間でコードを再利用する必要が減り、コードが理解しやすく、保守しやすくなります。