ゲームループがコード化されたので、それに機能を追加する時が来ました。試一致中、プレイヤーは行く入りすることができます。このため、プレイヤーをマッチに送信したり、アクティブなプレイヤーを追跡するなどのタスクにはコードが必要です。これらのタスクを管理するには、 PlayerManager という名前のモジュールスクリプトを作成します。
このスクリプトは、武器を持ってアリーナにプレイヤーを送る機能を開始し、シリーズの後で拡張されます。
スクリプトを設定する
プレイヤーマネージャーには、他のスクリプトで使用される機能が含まれているため、モジュールスクリプトになります。
ServerStorage > ModuleScripts で、PlayerManager という新しいモジュールスクリプトを追加します。次に、スクリプト名に合わせてモジュールテーブルの名前を変更し、ローカルおよびモジュール機能のコメントを追加します。
local PlayerManager = {}-- ローカル機能-- モジュール機能return PlayerManagerフォロー中のためのローカル変数を追加:
サービス:
- プレイヤー - プレイヤーがゲームに参加したか、退出したかを知る。
- ServerStorage - プレイヤーの武器のストレージ。
マップとプレイヤー変数:
- ロビースポーン、アリーナフォルダ、アリーナスポーンフォルダ - プレイヤーを異なる領域にテレポートするために使用されます。
- アクティブなプレイヤーのアレイ - 現在ゲーム中のプレイヤーを追跡します。
local PlayerManager = {}-- サービスlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- マップ変数local lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- プレイヤー変数local activePlayers = {}-- ローカル機能-- モジュール機能return PlayerManager内部にテスト印刷を含むモジュール機能名 sendPlayersToMatch() を作成
-- ローカル機能-- モジュール機能function PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
ロビーでプレイヤーをスポーンさせる
現在、複数のスポーン場所があるため、プレイヤーはゲームに参加するとランダムな場所でスポーンします。プレイヤーがロビーにスポーンするようにするには、プレイヤーの RespawnLocation プロパティを変更します。
パラメータ onPlayerJoin() を持つ新しいローカル関数 player を作成します。その機能では、プレイヤーのリスポーン場所を、以前作成したロビースポーン変数に設定します。
-- ローカル機能local function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendモジュール機能の下にイベントセクションを追加します。次に、onPlayerJoin() をプレイヤーサービスのPlayerAddedイベントに接続します。
-- モジュール機能function PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- イベントPlayers.PlayerAdded:Connect(onPlayerJoin)
接続してテスト
今、モジュールは接続してテストできます。PlayerManager が作成されたので、そのモジュールスクリプトのコードが実行され、ロビーにプレイヤーを送信できるようにします。
マッチマネージャー に戻り、フォロー中の変数を作成します:
- 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()endreturn MatchManager最低限のプレイヤーでテストするための ローカルサーバー を使用します。フォロー中のことが見えるかどうかを確認します:
- すべてのプレイヤーがロビーにスポーンします。
- PlayerManager からの印刷文が出力ウィンドウに表示されます。
完了したら、[クリーンアップ] をクリックしてサーバーをシャットダウンします。
トラブルシュートのヒント
この時点で、スクリプトの一部が意図した通りに機能していません。以下のいずれかを試してください。
- アリーナなどのパーツの名前やロビー > StartSpawnの場所をチェックしてください、特にレッスンで指示されたと異なる名前で名前付けた場合。
- モジュールが各スクリプトで必要であることを確認し、require() 関数を使用して正しくスペルします。
プレイヤーをアリーナに送る
プレイヤーがロビーに出現したので、インターミッションが終わったら、試合にテレポートします。プレイヤーの RespawnLocation を ReloadCharacter() という名前のプレイヤーオブジェクト内のスポーン場所に変更する機能を使用して、アリーナ内のスポーン場所に変更します。
下の PlayerManager スクリプトに移動し、 という新しいローカル関数を追加します。二つのパラメータを含める: player と whichSpawn 、送信先のスポーン場所。
local activePlayers = {}-- ローカル機能local function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- モジュール機能function PlayerManager.sendPlayersToMatch()print("Sending players to match")endプレイヤーのリスポーン場所を whichSpawn に設定します。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendLoadCharacter() を使用してキャラクターを再読み込み、プレイヤーは新しく割り当てられた場所で再生します。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
プレイヤーをスポーンに送る
各プレイヤーがアリーナ内の異なるスポーン場所にテレポートされるように、for ループを使用してアクティブなプレイヤー配列を反復して確認します。for ループを使用すると、プレイヤーアレイのすべての値を通過でき、スクリプトがさまざまなプレイヤー数に適応できます。
sendPlayersToMatch() 関数では、変数を使用して、アリーナ > SpawnLocations フォルダの子を取得して、すべてのアリーナスポーン場所の配列を作成します。
--モジュール機能function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()end下の for ループを追加して、すべてのプレイヤーのアレイを取得し、それらのそれぞれを順に繰り返します。プレイヤーを取得するに入力、タイプ: Players:GetPlayers() 。
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
トラックとスポーン
ゲームが実行されると、どのユーザーがプレイしているかを識別して、アリーナにスポーンできるようにする必要があります。ラウンドの始まりには、すべてのプレイヤーがアクティブなプレイヤーの配列で追跡されます。その配列は、テレポートや武器の割り当てなど、異なる機能に使用され、ラウンド中にロビーに残っているプレイヤーが影響を受けないようにします。
for ループでは、table.insert() を使用し、activePlayers 配列とプレイヤーを追加するための 2つのパラメータを使用します。
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendアリーナからスポーン場所を取得するには、spawnLocation という名前の変数を作成し、 最初の インデックスに設定し、arenaSpawns テーブルに配置します。
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]end呼び出し preparePlayer() と whichPlayer と spawnLocation をパスします。次に、そのスポーン場所が使用されたので、 削除 それをテーブルから削除して、次のプレイヤーが異なるスポーンを得るようにします。
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endプレイヤーがアリーナに送られる ローカル サーバーでテスト。プレイヤーは同じ場所で再スポーンし続けることになりますが、ロビーに戻すコードがまだ準プレースができていないためです。
トラブルシュートのヒント
この時点で、予定された結果が見えなかったので、以下のいずれかを試してください。
- In GetPlayers() , make sure there are two 閉じる括弧があることを確認してください, such as Class.Players.GetPlayers(|Players:GetPlayers()) in the statement.
- モジュールスクリプトの機能呼び出しのシリーズをチェックします。たとえば、 matchManager.prepareGame() は playerManager.sendPlayersToMatch() を呼び出す必要があります。
プレイヤーに武器を与える
ラウンドが開始すると、アリーナの各プレイヤーに使用する武器が提供されます。
ツールを追加
プレイヤーの武器はツールになります。Roblox のどのツールも使用できますが、開始めるためにサンプル剣を提供しました。
ツールボックスから武器をインポートするか、独自のものを作成します(Tools)。
武器を ServerStorage に配置します。自分のツールを作成している場合は、後のスクリプトで使用されるため、ツールの名前が武器であることを確認してください。
プレイヤーにツールを与える
ツールがストレージにあるので、アクティブなプレイヤーアレイを通過し、それぞれのユーザーにそのツールを提供するスクリプトを作業します。
PlayerManager で、ServerStorage の武器の変数 playerWeapon を追加します。
-- マップ変数local lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- プレイヤー変数local activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer() で、次のコードを貼り付けてプレイヤーのキャラクターを取得します。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()end新しい変数 sword を作成し、Clone() 関数を使用して、ServerStorage に武器のコピーを作成します。次に、剣をプレイヤーのキャラクターに親属させます。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendローカルサーバーで テスト して、すべてのプレイヤーがアリーナに送信されるときにツールを取得することを確認します。テストを続けると、インターミッションが再起動し続けるため、プレイヤーが数秒ごとにリスポーンします。次のレッスンで解決されます。
完了したスクリプト
以下は、作業を確認するための完了したスクリプトです。
ゲームマネージャースクリプト
-- サービス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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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