ゲームループをコードする

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

マップが作成されたので、スクリプトの構築を開始する時間です。このコースの残りの部分では、ゲームループの異なる要素全体をスクリプトすることに重点が置かれます。

スクリプトを設定する

バトルロイヤルは、モジュールスクリプトとノーマルスクリプトの組み合わせを使用します。以下はスクリプトとその機能です。

ゲームマネージャスクリプト。ゲーム設定の変数を使用してマッチマネージャから機能を実行します
マッチマネージャモジュールスクリプト。プレイヤーをアリーナに送るなどの機能を実行したり、マッチで時間を追跡したりします。
ゲーム設定モジュールスクリプト。他のスクリプトによく使用される変数を保存します。

ゲーム設定スクリプト

ゲーム設定という名前のモジュールスクリプトを作成して、マッチやインターミッションの期間など、他のスクリプトに使用される変数を保存します。これらの変数は後で GameManager スクリプトで使用されます。

  1. In ServerStorage で、ModuleScripts という名前のフォルダを作成します。そのフォルダで、GameSettings という新しいモジュールスクリプトを作成します。

  2. ゲーム設定を開き、モジュールテーブルの名前をスクリプトの名前に合わせて変更します。


    local GameSettings = {}
    return GameSettings
  3. モジュールテーブルでは、次の使用のための変数を追加します。それぞれの値について、テストするときに後でいつでも変更できます。

    • インターミッション期間 - プレイヤーが一致合前に待つ秒数
    • マッチ期間 - 秒ごとのマッチの長さ。
    • 最小プレイヤー - 開始に必要な最小プレイヤー数。
    • 移行時間 - 秒でマッチの前と後の時間。ゲームループのパーツ間の移行をより急がなくします。

    local GameSettings = {}
    -- ゲーム変数
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

MatchManager スクリプト

ゲームマネージャーに接続された 2番目のスクリプトは、マッチマネージャーです。このスクリプトは、タイマーの起動や試合終了後のプレイヤーのリセットなどのタスクを管理します。

マッチマネージャ内には、prepareGame() という名前の機能があり、プレイヤーを一致合に移行させることでゲームを開始します。

  1. In ServerStorage > ModuleScripts > マッチマネージャーという名前のモジュールスクリプトを追加します。モジュールテーブルの名前を変更します。


    local MatchManager = {}
    return MatchManager
  2. 新しいモジュール機能を MatchManager に名前 prepareGame() として追加します。後でスクリプトをテストするための印字文を含めます。


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

ゲームループをコードする

メインのゲームループは、作成したばかりの変数を使用して GameManager スクリプトにコード化されます。ゲームループには、インターミッション、競争、そしてクリーンアップとリセットが 3 つあることを覚えておいてください:インターミッション、競争、そしてクリーンアップとリセット。

ゲームマネージャースクリプト

このスクリプトは通常のサーバースクリプトであるため、モジュールスクリプトフォルダではなく ServerScriptService に置きます。実際のゲームループは、while true do ループになります。

  1. ServerScriptService で、ゲームマネージャーという新しいスクリプトを作成します。

  2. モジュールスクリプトがある場所である「ServerStorage」サービスの変数を追加します。次に、インターミッション中にプレイヤー数をチェックするために必要な「プレイヤー」サービスの変数を追加します。


    -- サービス
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. 以前に作成されたモジュールを使用するには:

    • 変数 moduleScripts をモジュールスクリプトフォルダの場所に設定します。
    • 変数 matchManagergameSettings の名前を追加します。それぞれの変数に、それぞれのスクリプトが必要であるように設定します。

    -- サービス
    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"))
  4. 変数の後、while true do ループを追加します。ゲームループのすべてのフェーズが内部に入り、無期限に繰り返されます。


    -- モジュールスクリプト
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- メインゲームループ
    while true do
    end

休憩をコードする

ゲームループが無期限で実行されている間、インターミッションはループを一時停止し、マッチに十分なプレイヤーがいる場合にのみ再開する必要があります。この一時停止をコードするには、 while ループ内のネストされた繰り返しループを介入に含めます。そのネストループは、十分なプレイヤーがいるまで繰り返され、メインループを一時停止します。プレイヤーが十分にいると、終了してプレイヤーをマッ一致に移行します。 繰り返しループ では、ループ内のコードが少なくとも 1回実行されます。 whileループとは異なり、ループが終了するまで条件をチェックしません。これにより、プレイヤーは常に一致合前にロビーに行きます。

  1. while true doで、repeatを入力し、Enterを押して、キーワード untilで自動完了させます。


    while true do
    repeat
    until
    end
  2. 現在のプレイヤー数 (#Players:GetPlayers()) がゲーム設定モジュールで以前に作成された minimumPlayers 変数と大きく異なるか等しいかをチェックします。


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. 繰り返しループで、インターミッションが開始しているという印刷文を追加します。使用 task.wait() を使用して、ゲーム設定から intermissionDuration を介して休憩を一時停止します。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. プレイテストし、印刷文章 "Starting intermission" が少なくとも 2 回表示されるかどうかをチェックします。メッセージを 2 回見ると、繰り返しループが十分なプレイヤーを見つけられず、再度実行したことが証明されます。メッセージを 2 回目に見るまで、休憩の長さを待たなければなりません。

トラブルシュートのヒント

この時点で、意図した通りにスポーンしていない場合は、以下のいずれかを試してください。

  • task.wait() は繰り返しループ内にあるべきです。待機せずに、スクリプトは 1 秒で複数回実行され、Roblox Studio をオーバーロードしてエラーを発生させます。
  • ゲーム設定モジュールでは、変数 intermissionDuration が 1 より大きくなければなりません。低ければ、スクリプトが頻繁に繰り返され、遅延の問題が発生します。

休憩を終わらせる

プレイヤーが十分にいると、短い移行時間を待たせます。次に、MatchManager の prepareGame() 機能を呼び出して、マッチに送信します。覚えておいてください、その機能は単に行を印刷しますが、後でもっとコードを追加します。

  1. 繰り返しループの終わりに、インターミッションが終了してコードをテストするという印刷文を追加します。次に、GameSetting の 変数を使用してそれに続きます。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. 待機の後、MatchManager モジュールから prepareGame() を呼び出します。コードが実行されると、これは単に出力ウィンドウにテキストを印刷します。次のセクションまで待って、このコードをテストします。


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

マルチプレイヤーゲームをテスト

現在、コードを実行するには prepareGame() , 繰り返しループから退出する必要があります。しかし、それを行うには、1人以上のプレイヤーが必要です。つまり、プレイテストボタンを使用すると、ゲームに唯一のプレイヤーしかいないため、機能は決して実行されません (最低プレイヤーが 1 人である場合を除きます)。これをテストするには、マルチプレイヤーゲームをシミュレートする必要があります。

ローカルサーバーを開始

1人以上のプレイヤーが必要なコードをテストするには、ローカルサーバーを作成します。公開されたゲームは通常 Roblox サーバーにありますが、 ローカルサーバー はシミュレーションされたプレイヤーでコンピュータ上のマルチプレイヤーゲームをシミュレートします。

  1. ローカルサーバーを開始するには、 テスト タブ > クライアントとサーバー セクション > playerドロップダウンを GameSetting の変数 minimumPlayers のプレイヤー数に設定します。このレッスンは 2 人のプレイヤーを使用します。

  2. 開始をクリックして、サーバーを開始します。

  3. サーバーが設定されるまで数秒待ちます。オリジナルの Studio ウィンドウに加えて、複数のウィンドウが開きます。ファイアウォールまたは他のオンラインセキュリティソフトウェアから Roblox Studio へのアクセスを許可する必要があるかもしれません。

トラブルシュートのヒント

この時点で、テストサーバーを見ることはできません。以下のいずれかを試してください。

  • サーバーの開始に問題がある場合は、ファイアウォールとルーターの問題 の記事を再確認してください。
  • プレイヤーの数を 2 または 3 のような小さな値に設定します。
  • 問題が解決しない場合は、Studio を再起動するか、コンピュータを再起動してみてください。

ローカルサーバーでテスト

サーバーが開始すると、複数のウィンドウが表示されます。それぞれがサーバー/クライアント関係の異なる部分を表しています。

  • サーバー (緑の境界) がゲームを実行します。
  • クライアント (青いボーダー) はプレイヤーの経験をシミュレートします。

グリーンボーダー付きサーバー
>

ブルーボーダーのクライアント
>

サーバーが稼働していると、コードが機能しているかどうかをチェックできます。

  1. 緑の境界の サーバー ウィンドウを見つけるMatchManager スクリプトから呼び出された印刷文をチェックします。繰り返しループがあるため、同じ印刷文が繰り返されるのを見ることができます。

  2. テストが完了したら、任意のウィンドウで [クリーンアップ] ボタンでサーバーを閉じます。これで、すべてのサーバーとクライアントウィンドウが閉じられ、通常の 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 do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("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 = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings