マップが作成されたので、スクリプトの構築を開始する時間です。このコースの残りの部分では、ゲームループの異なる要素全体をスクリプトすることに重点が置かれます。
スクリプトを設定する
バトルロイヤルは、モジュールスクリプトとノーマルスクリプトの組み合わせを使用します。以下はスクリプトとその機能です。
ゲームマネージャ | スクリプト。ゲーム設定の変数を使用してマッチマネージャから機能を実行します |
マッチマネージャ | モジュールスクリプト。プレイヤーをアリーナに送るなどの機能を実行したり、マッチで時間を追跡したりします。 |
ゲーム設定 | モジュールスクリプト。他のスクリプトによく使用される変数を保存します。 |
ゲーム設定スクリプト
ゲーム設定という名前のモジュールスクリプトを作成して、マッチやインターミッションの期間など、他のスクリプトに使用される変数を保存します。これらの変数は後で GameManager スクリプトで使用されます。
In ServerStorage で、ModuleScripts という名前のフォルダを作成します。そのフォルダで、GameSettings という新しいモジュールスクリプトを作成します。
ゲーム設定を開き、モジュールテーブルの名前をスクリプトの名前に合わせて変更します。
local GameSettings = {}return GameSettingsモジュールテーブルでは、次の使用のための変数を追加します。それぞれの値について、テストするときに後でいつでも変更できます。
- インターミッション期間 - プレイヤーが一致合前に待つ秒数
- マッチ期間 - 秒ごとのマッチの長さ。
- 最小プレイヤー - 開始に必要な最小プレイヤー数。
- 移行時間 - 秒でマッチの前と後の時間。ゲームループのパーツ間の移行をより急がなくします。
local GameSettings = {}-- ゲーム変数GameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MatchManager スクリプト
ゲームマネージャーに接続された 2番目のスクリプトは、マッチマネージャーです。このスクリプトは、タイマーの起動や試合終了後のプレイヤーのリセットなどのタスクを管理します。
マッチマネージャ内には、prepareGame() という名前の機能があり、プレイヤーを一致合に移行させることでゲームを開始します。
In ServerStorage > ModuleScripts > マッチマネージャーという名前のモジュールスクリプトを追加します。モジュールテーブルの名前を変更します。
local MatchManager = {}return MatchManager新しいモジュール機能を MatchManager に名前 prepareGame() として追加します。後でスクリプトをテストするための印字文を含めます。
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
ゲームループをコードする
メインのゲームループは、作成したばかりの変数を使用して GameManager スクリプトにコード化されます。ゲームループには、インターミッション、競争、そしてクリーンアップとリセットが 3 つあることを覚えておいてください:インターミッション、競争、そしてクリーンアップとリセット。
ゲームマネージャースクリプト
このスクリプトは通常のサーバースクリプトであるため、モジュールスクリプトフォルダではなく ServerScriptService に置きます。実際のゲームループは、while true do ループになります。
ServerScriptService で、ゲームマネージャーという新しいスクリプトを作成します。
モジュールスクリプトがある場所である「ServerStorage」サービスの変数を追加します。次に、インターミッション中にプレイヤー数をチェックするために必要な「プレイヤー」サービスの変数を追加します。
-- サービスlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")以前に作成されたモジュールを使用するには:
- 変数 moduleScripts をモジュールスクリプトフォルダの場所に設定します。
- 変数 matchManager と gameSettings の名前を追加します。それぞれの変数に、それぞれのスクリプトが必要であるように設定します。
-- サービスlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- モジュールスクリプトlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))変数の後、while true do ループを追加します。ゲームループのすべてのフェーズが内部に入り、無期限に繰り返されます。
-- モジュールスクリプトlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- メインゲームループwhile true doend
休憩をコードする
ゲームループが無期限で実行されている間、インターミッションはループを一時停止し、マッチに十分なプレイヤーがいる場合にのみ再開する必要があります。この一時停止をコードするには、 while ループ内のネストされた繰り返しループを介入に含めます。そのネストループは、十分なプレイヤーがいるまで繰り返され、メインループを一時停止します。プレイヤーが十分にいると、終了してプレイヤーをマッ一致に移行します。 繰り返しループ では、ループ内のコードが少なくとも 1回実行されます。 whileループとは異なり、ループが終了するまで条件をチェックしません。これにより、プレイヤーは常に一致合前にロビーに行きます。
while true doで、repeatを入力し、Enterを押して、キーワード untilで自動完了させます。
while true dorepeatuntilend現在のプレイヤー数 (#Players:GetPlayers()) がゲーム設定モジュールで以前に作成された minimumPlayers 変数と大きく異なるか等しいかをチェックします。
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersend繰り返しループで、インターミッションが開始しているという印刷文を追加します。使用 task.wait() を使用して、ゲーム設定から intermissionDuration を介して休憩を一時停止します。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendプレイテストし、印刷文章 "Starting intermission" が少なくとも 2 回表示されるかどうかをチェックします。メッセージを 2 回見ると、繰り返しループが十分なプレイヤーを見つけられず、再度実行したことが証明されます。メッセージを 2 回目に見るまで、休憩の長さを待たなければなりません。
トラブルシュートのヒント
この時点で、意図した通りにスポーンしていない場合は、以下のいずれかを試してください。
- task.wait() は繰り返しループ内にあるべきです。待機せずに、スクリプトは 1 秒で複数回実行され、Roblox Studio をオーバーロードしてエラーを発生させます。
- ゲーム設定モジュールでは、変数 intermissionDuration が 1 より大きくなければなりません。低ければ、スクリプトが頻繁に繰り返され、遅延の問題が発生します。
休憩を終わらせる
プレイヤーが十分にいると、短い移行時間を待たせます。次に、MatchManager の prepareGame() 機能を呼び出して、マッチに送信します。覚えておいてください、その機能は単に行を印刷しますが、後でもっとコードを追加します。
繰り返しループの終わりに、インターミッションが終了してコードをテストするという印刷文を追加します。次に、GameSetting の 変数を使用してそれに続きます。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)end待機の後、MatchManager モジュールから prepareGame() を呼び出します。コードが実行されると、これは単に出力ウィンドウにテキストを印刷します。次のセクションまで待って、このコードをテストします。
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
マルチプレイヤーゲームをテスト
現在、コードを実行するには prepareGame() , 繰り返しループから退出する必要があります。しかし、それを行うには、1人以上のプレイヤーが必要です。つまり、プレイテストボタンを使用すると、ゲームに唯一のプレイヤーしかいないため、機能は決して実行されません (最低プレイヤーが 1 人である場合を除きます)。これをテストするには、マルチプレイヤーゲームをシミュレートする必要があります。
ローカルサーバーを開始
1人以上のプレイヤーが必要なコードをテストするには、ローカルサーバーを作成します。公開されたゲームは通常 Roblox サーバーにありますが、 ローカルサーバー はシミュレーションされたプレイヤーでコンピュータ上のマルチプレイヤーゲームをシミュレートします。
ローカルサーバーを開始するには、 テスト タブ > クライアントとサーバー セクション > playerドロップダウンを GameSetting の変数 minimumPlayers のプレイヤー数に設定します。このレッスンは 2 人のプレイヤーを使用します。
開始をクリックして、サーバーを開始します。
サーバーが設定されるまで数秒待ちます。オリジナルの Studio ウィンドウに加えて、複数のウィンドウが開きます。ファイアウォールまたは他のオンラインセキュリティソフトウェアから Roblox Studio へのアクセスを許可する必要があるかもしれません。
トラブルシュートのヒント
この時点で、テストサーバーを見ることはできません。以下のいずれかを試してください。
- サーバーの開始に問題がある場合は、ファイアウォールとルーターの問題 の記事を再確認してください。
- プレイヤーの数を 2 または 3 のような小さな値に設定します。
- 問題が解決しない場合は、Studio を再起動するか、コンピュータを再起動してみてください。
ローカルサーバーでテスト
サーバーが開始すると、複数のウィンドウが表示されます。それぞれがサーバー/クライアント関係の異なる部分を表しています。
- サーバー (緑の境界) がゲームを実行します。
- クライアント (青いボーダー) はプレイヤーの経験をシミュレートします。


サーバーが稼働していると、コードが機能しているかどうかをチェックできます。
緑の境界の サーバー ウィンドウを見つけるMatchManager スクリプトから呼び出された印刷文をチェックします。繰り返しループがあるため、同じ印刷文が繰り返されるのを見ることができます。
テストが完了したら、任意のウィンドウで [クリーンアップ] ボタンでサーバーを閉じます。これで、すべてのサーバーとクライアントウィンドウが閉じられ、通常の Studio ウィンドウに戻ります。
トラブルシュートのヒント
この時点で、意図した印刷文が表示されない場合は、以下のいずれかを試してください。
- prepareGame() のような機能が while true ループのスコープ内にあるかどうかをチェックします。
- MatchManager からの印刷が機能しない場合は、ゲームマネージャーに MatchManager スクリプトが必要であるか、そのモジュールのテーブルに prepareGame() が追加されているかなど、モジュールスクリプトによる一般的なトラブルシューティングをチェックしてください。
完了したスクリプト
以下は、作業を確認するための完了したスクリプトです。
ゲームマネージャースクリプト
-- サービスlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- モジュールスクリプトlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- メインゲームループwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
MatchManager スクリプト
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
ゲーム設定スクリプト
local GameSettings = {}-- ゲーム変数GameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings