プレイヤーを管理する

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

ゲームループがコード化されたので、それに機能を追加する時が来ました。試一致中、プレイヤーは行く入りすることができます。このため、プレイヤーをマッチに送信したり、アクティブなプレイヤーを追跡するなどのタスクにはコードが必要です。これらのタスクを管理するには、 PlayerManager という名前のモジュールスクリプトを作成します。

このスクリプトは、武器を持ってアリーナにプレイヤーを送る機能を開始し、シリーズの後で拡張されます。

スクリプトを設定する

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

  1. 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 を作成します。その機能では、プレイヤーのリスポーン場所を、以前作成したロビースポーン変数に設定します。


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


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

接続してテスト

今、モジュールは接続してテストできます。PlayerManager が作成されたので、そのモジュールスクリプトのコードが実行され、ロビーにプレイヤーを送信できるようにします。

  1. マッチマネージャー に戻り、フォロー中の変数を作成します:

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

    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. 完了したら、[クリーンアップ] をクリックしてサーバーをシャットダウンします。

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

この時点で、スクリプトの一部が意図した通りに機能していません。以下のいずれかを試してください。

  • アリーナなどのパーツの名前やロビー > StartSpawnの場所をチェックしてください、特にレッスンで指示されたと異なる名前で名前付けた場合。
  • モジュールが各スクリプトで必要であることを確認し、require() 関数を使用して正しくスペルします。

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

プレイヤーがロビーに出現したので、インターミッションが終わったら、試合にテレポートします。プレイヤーの RespawnLocationReloadCharacter() という名前のプレイヤーオブジェクト内のスポーン場所に変更する機能を使用して、アリーナ内のスポーン場所に変更します。

  1. 下の PlayerManager スクリプトに移動し、 という新しいローカル関数を追加します。二つのパラメータを含める: playerwhichSpawn 、送信先のスポーン場所。


    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() を使用してキャラクターを再読み込み、プレイヤーは新しく割り当てられた場所で再生します。


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

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

各プレイヤーがアリーナ内の異なるスポーン場所にテレポートされるように、for ループを使用してアクティブなプレイヤー配列を反復して確認します。for ループを使用すると、プレイヤーアレイのすべての値を通過でき、スクリプトがさまざまなプレイヤー数に適応できます。

  1. sendPlayersToMatch() 関数では、変数を使用して、アリーナ > SpawnLocations フォルダの子を取得して、すべてのアリーナスポーン場所の配列を作成します。


    --モジュール機能
    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. 呼び出し preparePlayer()whichPlayerspawnLocation をパスします。次に、そのスポーン場所が使用されたので、 削除 それをテーブルから削除して、次のプレイヤーが異なるスポーンを得るようにします。


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. プレイヤーがアリーナに送られる ローカル サーバーでテスト。プレイヤーは同じ場所で再スポーンし続けることになりますが、ロビーに戻すコードがまだ準プレースができていないためです。

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

この時点で、予定された結果が見えなかったので、以下のいずれかを試してください。

  • In GetPlayers() , make sure there are two 閉じる括弧があることを確認してください, such as Class.Players.GetPlayers(|Players:GetPlayers()) in the statement.
  • モジュールスクリプトの機能呼び出しのシリーズをチェックします。たとえば、 matchManager.prepareGame()playerManager.sendPlayersToMatch() を呼び出す必要があります。

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

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

ツールを追加

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

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

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

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

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

  1. PlayerManager で、ServerStorage の武器の変数 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. 新しい変数 sword を作成し、Clone() 関数を使用して、ServerStorage に武器のコピーを作成します。次に、剣をプレイヤーのキャラクターに親属させます。


    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. ローカルサーバーで テスト して、すべてのプレイヤーがアリーナに送信されるときにツールを取得することを確認します。テストを続けると、インターミッションが再起動し続けるため、プレイヤーが数秒ごとにリスポーンします。次のレッスンで解決されます。

完了したスクリプト

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

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


-- サービス
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