🙆

【Roblox】character SpawnLocationについて

2024/09/25に公開

はじめに

プロジェクトで調査したキャラクターのSpawnLocationの情報をまとめました。

下記はPlayer.Characterのリファレンス説明欄です。

Players.CharacterAutoLoadstrueの場合は自動的に読み込まれ、それ以外の場合はPlayer:LoadCharacter()を使用して手動で読み込むことができます。

ゲームに入室した際やキャラクター死亡後に適応され、キャラクターをスポーンさせることができます。

この際にスポーンする領域となるのがSpawnLocationオブジェクトとなります。
https://create.roblox.com/docs/reference/engine/classes/SpawnLocation

バージョン:0.641.0.6410737

SpawnLocationが複数ある場合の選定条件について

下記はSpawnLocationのリファレンスからの引用です。

プレイヤーがリスポーンするときに、特定のSpawnLocationに対して適用されるルールがいくつかあります。

  • SpawnLocation.Neutralfalseに設定されている 場合、Player.TeamColorSpawnLocation.TeamColorと一致する プレイヤーのみがその上に再出現します。

  • SpawnLocation.Neutraltrueに設定されている場合、SpawnLocation.TeamColorに関係なく、どのプレイヤーもその上にスポーンできます。

  • プレイヤーが複数のSpawnLocationを利用できる場合、ランダムに1つが選択されます。

  • プレイヤーはSpawnLocationの上の異なる地点に出現しますが、現在のところ、あるプレイヤーの直後に出現し、他のプレイヤーの直後に出現した場合、プレイヤー同士が重なって出現することがあります。

上記引用内容をもとに、再調査した結果は以下の通りです。

  1. SpawnLocation.EnabledfalseSpawnLocationは除外される
  2. 残ったものの内、SpawnLocation.Neutraltrueの場合は選考対象に加わる
  3. Player.Neutralfalseである場合、更に残ったものの内、Player.TeamColorSpawnLocation.TeamColorが一致しているものも選考対象に加わる
  • 上記の条件から残ったものから一つランダムに選ばれたSpawnLocationから出現します。
  • 上記の条件から残ったものの中にPlayer.RespawnLocationのプロパティと一致するものがあれば、ランダムではなく、そのSpawnLocationから出現します。
  • 上記の条件で該当するSpawnLocationが存在しない場合はおおよそ{ 0, 100, 0 }の座標に出現します。

TeamColorでリスポーン位置を管理する

上記の条件の最中にあるTeamColorはRoblox側が特定のカラーに名称を付け、同一性を保ちやすくしたBrickColorのプロパティです。
https://create.roblox.com/docs/reference/engine/datatypes/BrickColor
このTeamColorPlayerSpawnLocationで比較することで、一致しているかを確認しています。

TaG! ~Take away & Glean~の開発の際に、時間内に無限にリスポーンできる仕様の為、可能な限りRoblox側の機能に管理を任せた復活のシステムである、SpawnLocationを活用する流れになりました。

例えばロビー環境に居るプレイヤーはWhite,戦闘中のプレイヤーはRed等の進行度に応じたTeamColorPlayerに付与することで、プレイヤーは各自のゲームの進行状況に応じたTeamColorを持つSpawnLocationからランダムに出現するようになります。

問題点

ここで問題になってくるのが、入室時のスポーンも同一の条件で選定していることです。

SpawnLocation.NeutraltrueSpawnLocationが一つでも存在する場合、各プレイヤーのTeamColor(ゲーム進行状況)と関係なくそこに生成される可能性があります。 これはゲームの進行に問題が起こる為、除かなければいけません。

しかし、入室したばかりのプレイヤーのプロパティはPlayer.Neutral = true Player.TeamColor = whiteであり、特にPlayer.NeutraltrueのプレイヤーはSpawnLocation.NeutraltrueSpawnLocationにしか、生成されることが出来ずに、両立させることができません。

解決策 1:入室時のプロパティ直接設定

スクリプトでプレイヤーの入室時にチーム情報を直接与えることで単純に解決することができます。

local Players = game:GetService("Players")
local function PlayerAdded(pl)
  pl.TeamColor = BrickColor.White()
  pl.Neutral = false
end
Players.PlayerAdded:Connect(PlayerAdded)

解決策 2:Team機能の利用

エクスプローラー上のTeamsの直下にTeamインスタンスを配置する事で、TeamColorを特定のTeamとして管理することができます。

下記はTeamのリファレンスからの引用です

プレイヤーがゲームに参加すると、Team.AutoAssignabletrueに設定されている、プレイヤーが最も少ないチームに割り当てられます。自動割り当て可能なチームがない場合は、Player.Neutraltrueに設定されます。

ゲームループなく両陣営が戦い続けるゲーム等で利用できる機能で、このプロパティがtrueteamが一つしかない場合、そのチームに所属することになり、プレイヤーの初期進行度を一意のTeamColorに設定できます。

TaG! ~Take away & Glean~の開発ではこちらを利用しました。

進行度としてのTeamColor管理をする事とその際にTeamインスタンスを配置する利点と欠点

進行度としてのTeamColor管理

利点

  • SpawnLocationの機能を有効に利用できる

欠点

  • メインゲーム上でも対立型等でTeamColorの機能を使用したい場合混同してしまう。
  • 他のプレイヤーの頭上にある名前表示の色が進行度によって変化する(管理できるという点では利点でもある)

Teamインスタンスを配置する

利点

  • 入室時の処理をRoblox側のシステムに持たせることができる。
  • TeamColorの参照元として活用できるため、途中でのColorの変更がスムーズに行える
  • Team:GetPlayers()関数や、Team.PlayerAdded Team.PlayerRemovedのイベントが存在する為、進行状況別のプレイヤーの管理はサーバー、クライアント問わず行いやすい。

欠点

  • 進行度を切り替える度に”あなたは現在「XXX」チームに所属しています。”というシステムチャットが届く
  • チャットの発言者の名前の色が発言時の進行度によって変化する

TextChat関連の欠点の解決策については、別の機会に改めてご紹介できればと思います。

まとめ

  • SpawnLocationはキャラクターがスポーンする際の領域を示すインスタンスである。
  • SpawnLocationが複数ある場合は主に各SpawnLocationと復活するPlayerそれぞれにあるTeamColorNeutralのプロパティからスポーン領域となるSpawnLocationが選定される
  • 入室時のスポーンにも同じ条件が使われている為、注意が必要である。
  • Teamインスタンスを使用することでTeamColorを管理することができる。

参考

https://create.roblox.com/docs/reference/engine/classes/SpawnLocation
https://create.roblox.com/docs/reference/engine/classes/Player
https://create.roblox.com/docs/reference/engine/datatypes/BrickColor
https://create.roblox.com/docs/reference/engine/classes/Teams
https://create.roblox.com/docs/reference/engine/classes/Team

ランド・ホー Roblox開発チーム

Discussion