プロジェクトが複雑になるにつれて、スクリプトがどのように構成されているかを考えることが重要になります。良い組織の習慣は、コードがスクリプト間で複製されたり、管理が困難になったりしないようにすることができます。
コードを整理して再利用するためのより良い方法は、 モジュールスクリプト 、共有目的に対応するように設計された一連の機能と変数を保存するユニークな種類のスクリプトです、プレイヤーのお金や敵を管理するなど。モジュールスクリプト内のコードは、他のスクリプトで使用できます。この方法では、プレイヤーがクエストを完了したり、ピックアップを見つけたりするたびに、複数の異なるスクリプトからコインを提供する同じ機能を呼び出すことができます。
一般的に使用されるコードをモジュールスクリプトに保存することで、複数のスクリプトを更新するのではなく、1つのモジュールスクリプトのみを変更することで、コードの維持と整理が簡素化されます。
モジュールスクリプトの基本
モジュールスクリプトは実際、スクリプトオブジェクトと比較して独自の別のオブジェクトです。RobloRoblox(ロブロックス) では、モジュールスクリプトは パープル アイコンで示されます。
モジュールスクリプトを作成する
モジュールスクリプトは、サーバー側のスクリプトと ServerScriptService を使用すると、サーバー側のローカルスクリプト (GUI のインタラクションなど) と ReplicatedStorage を使用すると、一般に配置されます。
- Create a モジュールスクリプト in ServerScriptService 。

モジュールスクリプトの構造
作成されると、すべてのモジュールスクリプトは以下のコードで始まります:
local Module = {}return Module
行 local Module = {} は、モジュールの共有コード能と変数を保存できるテーブルまたはコンテナを作成します。このテーブルは、RewardManager または ParticleController など、モジュールの目的に合わせて名前を変更する必要があります。カメルケース ( myVariable ) ではない他の変数とは異なり、モジュールテーブルはパスカルケースを使用し、大文字で始めることを推奨します ( MyModule )。
local RewardManager = {}return RewardManager
そのため、他のスクリプトはモジュールの非ローカル機能または変数を使用でき、すべてのモジュールは return MyModule で終了します。別のスクリプトがモジュールからコードを取得しようとするたびに、モジュールテーブル内に保存されたスクリプトアクセスコードを返します。
モジュールスクリプトに追加する
別のスクリプトで使用できるモジュールに機能または変数を追加するには、モジュールテーブルの名前、続いてドット、そして機能または変数の名前を、例えば TestModule.myVariable のように入力します。ドット演算子を使用することは、モジュールテーブルが返されるたびに他のスクリプトがそのコードにアクセスできるようにする別の方法です。
local TestModule = {}
-- 「TestModule」テーブルに変数を追加
TestModule.myVariable = 100
-- 「テストモジュール」テーブルに機能を追加
function TestModule.doTask(player)
-- プレースホルダコード
end
return TestModule
モジュールスクリプトでのスコープ
外部スクリプトで使用されるモジュール関数または変数の場合、 は をタイプしないでください。
変数や関数の前に をタイプすると、そのスクリプトでのみ使用できることを意味します。これはほとんどのスクリプトのエラーとトラブルシューティングの削減のための良い習慣ですが、モジュールスクリプトの機能と変数をローカルにすることはできません。
そのモジュールスクリプトによって使用されたコードが のみ である場合、それには 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() は、1つの引数を受け入れ、エクスプローラーのモジュールスクリプトの場所を受け入れます。
モジュールを使用するには、別のスクリプトで、変数を require(moduleScript) と同じに設定します。
local MyModule = require(ServerStorage.ModuleScript)
今、変数 MyModule には、そのモジュールスクリプトで作成されたモジュールテーブルが含まれています。そのテーブルから機能と変数を使用するには、変数名を入力し、ドットを付け、そのモジュールスクリプトで使用する正確な名前を、例えば MyModule.myFunction() のように入力します。スクリプトが実行され、その行に到達すると、モジュールテーブルに保存された特定の機能または変数にアクセスします。
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
RewardManager の例
ModuleScript - 報酬マネージャー
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
スクリプト - TreasureChestScript
local 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 のモジュールスクリプト は、コードを整理して再利用するためにコーダーが使用する方法です。モジュールスクリプトは、サーバーストレージ (またはクライアントベースのインタラクションの場合は ReplicatedStorage) によく保存されます。そこから、他のスクリプトは、そのモジュールスクリプトに保存された機能と変数を呼び出すことができます。
たとえば、1つのゲームがオブジェクトの収集に対してプレイヤーにポイントを授与することがあります。モジュールスクリプトは、ポイントを付与するコードを処理できます。その後、異なる種類のオブジェクトのスクリプトは、モジュールスクリプト機能を呼び出すだけでよいです。これにより、スクリプト間でコードを再使用する必要が減少し、コードを理解しやすく、維持しやすくなります。