プレーヤーを管理する

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

ゲームループをコード化した状態で、機能の一致加を開始します。マッチ中、プレイヤーは来行くりできます。これにより、コードはプレイヤーをマッチに追加するために必要になります。これらのタスクを管理するためには、 PlayerManager という名前のモジュールスクリプトを作成します。

このスクリプトは、武器を持ったプレイヤーをアリーナに送り、シリーズの後半で拡張されます。

スクリプトのセットアップ

プレイヤーマネージャーには、他のスクリプトに使用されている機能が含まれているため、モジュールスクリプトになります。

  1. In ServerStorage > ModuleScripts で、PlayerManager という名前の新しいモジュールスクリプトを追加します。次に、モジュールテーブルをスクリプト名に合わせて変更し、コメントをローカルおよびモジュール機能に追加します。


    local PlayerManager = {}
    -- ローカル関数
    -- モジュール機能
    return PlayerManager
  2. フォロー中の変数にローカル変数を追加します:

    サービス:

    • プレイヤー - プレイヤーが参加したかどうか、またはゲームから退出したかを知ります。
    • ServerStorage - プレイヤーの武器の保管庫。

    マップとプレイヤー変数:

    • ロビースポーン、アリーナフォルダ、アリーナスポーンフォルダ - プレイヤーを異なるエリアにテレポートします。
    • アクティブなプレイヤーのアレイ - 現在ゲームにいるプレイヤーを追跡します。

    local PlayerManager = {}
    -- サービス
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- マップ変数
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- プレイヤー変数
    local activePlayers = {}
    -- ローカル関数
    -- モジュール機能
    return PlayerManager
  3. テストプリントを含むモジュール関数を sendPlayersToMatch() という名前で作成します。


    -- ローカル関数
    -- モジュール機能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

ロビーにプレイヤーをスポーンする

現在、複数のスポーン場所があり、つまりプレイヤーがゲームに参加するとランダムな場所でスポーンします。プレイヤーがロビーに生成されることを確認するには、プレイヤーの RespawnLocation プロパティを変更します。

  1. 新しいローカル関数を作成し、 onPlayerJoin() パラメータの player で、ロビースポーンバリアントにプレイヤーのリスポーン場所を設定します。その関数で、以前に作成した 1> ロビースポーンバリアント1> にプレイヤーのリスポーン場所を設定します。


    -- ローカル関数
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. モジュール機能の下にイベントセクションを追加します。次に、onPlayerJoin() を PlayerService の PlayerAdded イベントに接続します。


    -- モジュール機能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- イベント
    Players.PlayerAdded:Connect(onPlayerJoin)

接続とテスト

モジュールを接続してテストできるようになりました。PlayerManager を作成したら、そのモジュールスクリプトのコードを実行し、ロビーにプレイヤーを送信するために必要な情報を提供してください。

  1. マッチマネージャー に戻り、フォロー中の変数を作成してください:

    • ServerStorage サービス。
    • ModuleScripts フォルダ、ServerStorage の子。
    • PlayerManager モジュールスクリプト、 moduleScripts の子。

    local MatchManager = {}
    -- サービス
    local ServerStorage = game:GetService("ServerStorage")
    -- モジュールスクリプト
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. 最小プレイヤーを含むローカルサーバーを使用してテストしてください。フォロー中のことを確認してください:

    • すべてのプレイヤーはロビーでスポーンします。
    • PlayerManager からの印刷声明は、出力ウィンドウに表示されます。
  3. 完了したら、[クリーンアップ] をクリックしてサーバーをシャットダウンします。

トラブルシューティングのヒント

この時点で、スクリプトの部分が期待通りに機能しない場合があります。以下の 1つを試してください。

  • アリーナ、ロビー > StartSpawn の場所など、パーツの名前を確認してください。
  • 必須equire() 関数を使用してスクリプトにモジュールが必要であることを確認し、正しくスペルされていることを確認してください。

プレイヤーをアリーナに送信する

さあ、プレイヤーがロビーにスポーンすると、休憩が終わった後にマッチにテレポートします。プレイヤーの RespawnLocation をアリーナのスポーン場所に変更するための関数を使用して、ReloadCharacter() という名前のプレイヤーオブジェクトの機能を使用します。

  1. PlayerManager スクリプト、onPlayerJoin() の下にある、新しいローカル関数を名前付けて preparePlayer() を追加します。2つのパラメータを含みます:1> プレイヤーlayer1> と 4> whichSpawn4> 、スポーン場所を送信するスポーン場所を含みます。


    local activePlayers = {}
    -- ローカル関数
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- モジュール機能
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. プレイヤーのリスポーン場所を whichSpawn に設定します。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. LoadCharacter() を使用してキャラクターを再読み込み、PlayCharacter() を使用してプレイヤーをその新しく割り当てられた場所にリスポーンさせます。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    end

プレイヤーをスポーンに送信

アリーナで各プレイヤーがアクティブなプレイヤーマトリックスを使用して別のスポーン場所にテレポートされるようにするには、for ループを使用してアクティブなプレイヤーマトリックスを反復します。for ループを使用すると、プレイヤーマトリックスのすべての値を通過できますので、スクリプトがさま

  1. In the sendPlayersToMatch() 関数で、アリーナスポーン場所の子を取得することで、アリーナ > スポーン場所の配列を作成する変数を使用します。


    --モジュール機能
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. 以下の for ループを追加して、すべてのプレイヤーのアレイを取得し、その後それらの中からイテレートします。プレイヤーを取得するには、Players:GetPlayers() を入力します。


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    end
    end

トラッキングとスポーン

ゲームが実行されると、アリーナにスポーンするユーザーを識別する必要があります。ラウンドの開始につき、すべてのプレイヤーはアクティブなプレイヤーのアレイで追跡されます。そのアレイは、テレポートや武器の割り当てなど、さまざまな機能を実装します。ラウンド中にロビーにいるプレイヤーを含めることを確認す

  1. for ループで、table.insert() を使用して、activePlayers 配列とプレイヤーを追加するための 2つのパラメータを使用してください。


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. アリーナからスポーン場所を取得するには、 spawnLocation という変数を作成し、 最初 のインデックスに設定する arenaSpawns テーブル。


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. player1 を呼び出し、whichPlayerspawnLocation をパスします。その後、そのスポーン場所が使用されたため、1>削除1> をテーブルから削除して、次のプレイヤーが異なるスポーン場所を得るようにします。


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. プレイヤーがアリーナに送信されるローカルサーバーでテストしてください。プレイヤーはロビーに再び送信されるまで、同じ場所で再スポーンします。コードをロビーに送信するためのプロセスはまだ完プレースしていません。

トラブルシューティングのヒント

この時点で、予想される結果を見ていないようです。次の 1つを試してください。

  • In GetPlayers() で、 二つの閉じる親切子があることを確認してください。例えば、 Class.Players.GetPlayers() のように。
  • モジュールスクリプトの機能コールのシリーズを確認します。たとえば、 matchManager.prepareGame()playerManager.sendPlayersToMatch() を呼び出す必要があります。

プレイヤーに武器を与える

ラウンドが開始すると、アリーナにいるすべてのプレイヤーに使用する武器が提供されます。

ツールの追加

プレイヤーの武器はツールになります。 Roblox の任意のツールを使用できますが、サンプルの剣を提供しました。

  1. ツールボックスから武器をインポートするか、自分の (see Tools ) を作成します。

  2. 武器をServerStorageに置きます。自分のツールを作成する場合は、武器という名前のツールを作成してください。これは後のスクリプトで使用されるためです。

プレイヤーにツールを与える

ツールがストレージに保存されたので、スクリプトを作業してアクティブなプレイヤーのマトリックスを通過し、それぞれのユーザーにツールを提供します。

  1. PlayerManager で、 playerWeapon という名前の武器をサーバーストレージの武器に追加します。


    -- マップ変数
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- プレイヤー変数
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. In preparePlayer() で、次のコードを貼り付けてプレイヤーのキャラクターを取得します。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. 新しい変数を作成し、「剣」という名前の変数を作成し、Clone() 機能を使用して、サーバーストレージの武器のコピーを作成します。その後、武器をプレイヤーのキャラクターに親にします。


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. ローカルサーバーで テスト して、アリーナに送信されたすべてのプレイヤーがツールを取得することを確認します。注意、テストを続けると、インターミッションが再起動し、プレイヤーが数秒ごとにリスポーンすることになります。これは次のレッスンで解決されます。

完了したスクリプト

以下は、作業を確認するために完了したスクリプトです。

GameManager スクリプト


-- サービス
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
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

MatchManager スクリプト


local MatchManager = {}
-- サービス
local ServerStorage = game:GetService("ServerStorage")
-- モジュールスクリプト
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

PlayerManager モジュールスクリプト


local PlayerManager = {}
-- サービス
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- マップ変数
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- プレイヤー変数
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- ローカル関数
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
local sword = playerWeapon:Clone()
sword.Parent = character
end
-- モジュール機能
function PlayerManager.sendPlayersToMatch()
print("Sending players to match")
local arenaSpawns = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers, whichPlayer)
local spawnLocation = table.remove(arenaSpawns, 1)
preparePlayer(whichPlayer, spawnLocation)
end
end
--イベント
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager