ゲームループをコード化した状態で、機能の一致加を開始します。マッチ中、プレイヤーは来行くりできます。これにより、コードはプレイヤーをマッチに追加するために必要になります。これらのタスクを管理するためには、 PlayerManager という名前のモジュールスクリプトを作成します。
このスクリプトは、武器を持ったプレイヤーをアリーナに送り、シリーズの後半で拡張されます。
スクリプトのセットアップ
プレイヤーマネージャーには、他のスクリプトに使用されている機能が含まれているため、モジュールスクリプトになります。
In 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 で、ロビースポーンバリアントにプレイヤーのリスポーン場所を設定します。その関数で、以前に作成した 1> ロビースポーンバリアント1> にプレイヤーのリスポーン場所を設定します。
-- ローカル関数local function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendモジュール機能の下にイベントセクションを追加します。次に、onPlayerJoin() を PlayerService の PlayerAdded イベントに接続します。
-- モジュール機能function PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- イベントPlayers.PlayerAdded:Connect(onPlayerJoin)
接続とテスト
モジュールを接続してテストできるようになりました。PlayerManager を作成したら、そのモジュールスクリプトのコードを実行し、ロビーにプレイヤーを送信するために必要な情報を提供してください。
マッチマネージャー に戻り、フォロー中の変数を作成してください:
- 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()endreturn MatchManager最小プレイヤーを含むローカルサーバーを使用してテストしてください。フォロー中のことを確認してください:
- すべてのプレイヤーはロビーでスポーンします。
- PlayerManager からの印刷声明は、出力ウィンドウに表示されます。
完了したら、[クリーンアップ] をクリックしてサーバーをシャットダウンします。
トラブルシューティングのヒント
この時点で、スクリプトの部分が期待通りに機能しない場合があります。以下の 1つを試してください。
- アリーナ、ロビー > StartSpawn の場所など、パーツの名前を確認してください。
- 必須equire() 関数を使用してスクリプトにモジュールが必要であることを確認し、正しくスペルされていることを確認してください。
プレイヤーをアリーナに送信する
さあ、プレイヤーがロビーにスポーンすると、休憩が終わった後にマッチにテレポートします。プレイヤーの RespawnLocation をアリーナのスポーン場所に変更するための関数を使用して、ReloadCharacter() という名前のプレイヤーオブジェクトの機能を使用します。
PlayerManager スクリプト、onPlayerJoin() の下にある、新しいローカル関数を名前付けて preparePlayer() を追加します。2つのパラメータを含みます:1> プレイヤーlayer1> と 4> whichSpawn4> 、スポーン場所を送信するスポーン場所を含みます。
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() を使用してキャラクターを再読み込み、PlayCharacter() を使用してプレイヤーをその新しく割り当てられた場所にリスポーンさせます。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
プレイヤーをスポーンに送信
アリーナで各プレイヤーがアクティブなプレイヤーマトリックスを使用して別のスポーン場所にテレポートされるようにするには、for ループを使用してアクティブなプレイヤーマトリックスを反復します。for ループを使用すると、プレイヤーマトリックスのすべての値を通過できますので、スクリプトがさま
In the sendPlayersToMatch() 関数で、アリーナスポーン場所の子を取得することで、アリーナ > スポーン場所の配列を作成する変数を使用します。
--モジュール機能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]endplayer1 を呼び出し、whichPlayer と spawnLocation をパスします。その後、そのスポーン場所が使用されたため、1>削除1> をテーブルから削除して、次のプレイヤーが異なるスポーン場所を得るようにします。
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endプレイヤーがアリーナに送信されるローカルサーバーでテストしてください。プレイヤーはロビーに再び送信されるまで、同じ場所で再スポーンします。コードをロビーに送信するためのプロセスはまだ完プレースしていません。
トラブルシューティングのヒント
この時点で、予想される結果を見ていないようです。次の 1つを試してください。
- In GetPlayers() で、 二つの閉じる親切子があることを確認してください。例えば、 Class.Players.GetPlayers() のように。
- モジュールスクリプトの機能コールのシリーズを確認します。たとえば、 matchManager.prepareGame() は playerManager.sendPlayersToMatch() を呼び出す必要があります。
プレイヤーに武器を与える
ラウンドが開始すると、アリーナにいるすべてのプレイヤーに使用する武器が提供されます。
ツールの追加
プレイヤーの武器はツールになります。 Roblox の任意のツールを使用できますが、サンプルの剣を提供しました。
ツールボックスから武器をインポートするか、自分の (see Tools ) を作成します。
武器をServerStorageに置きます。自分のツールを作成する場合は、武器という名前のツールを作成してください。これは後のスクリプトで使用されるためです。
プレイヤーにツールを与える
ツールがストレージに保存されたので、スクリプトを作業してアクティブなプレイヤーのマトリックスを通過し、それぞれのユーザーにツールを提供します。
PlayerManager で、 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新しい変数を作成し、「剣」という名前の変数を作成し、Clone() 機能を使用して、サーバーストレージの武器のコピーを作成します。その後、武器をプレイヤーのキャラクターに親にします。
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendローカルサーバーで テスト して、アリーナに送信されたすべてのプレイヤーがツールを取得することを確認します。注意、テストを続けると、インターミッションが再起動し、プレイヤーが数秒ごとにリスポーンすることになります。これは次のレッスンで解決されます。
完了したスクリプト
以下は、作業を確認するために完了したスクリプトです。
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 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