【Roblox】character SpawnLocationについて
はじめに
プロジェクトで調査したキャラクターのSpawnLocationの情報をまとめました。
下記はPlayer.Character
のリファレンス説明欄です。
Players.CharacterAutoLoads
がtrue
の場合は自動的に読み込まれ、それ以外の場合はPlayer:LoadCharacter()
を使用して手動で読み込むことができます。
ゲームに入室した際やキャラクター死亡後に適応され、キャラクターをスポーンさせることができます。
この際にスポーンする領域となるのがSpawnLocation
オブジェクトとなります。
バージョン:0.641.0.6410737
SpawnLocationが複数ある場合の選定条件について
下記はSpawnLocation
のリファレンスからの引用です。
プレイヤーがリスポーンするときに、特定の
SpawnLocation
に対して適用されるルールがいくつかあります。
SpawnLocation.Neutral
がfalse
に設定されている 場合、Player.TeamColor
がSpawnLocation.TeamColor
と一致する プレイヤーのみがその上に再出現します。
SpawnLocation.Neutral
がtrue
に設定されている場合、SpawnLocation.TeamColor
に関係なく、どのプレイヤーもその上にスポーンできます。プレイヤーが複数の
SpawnLocation
を利用できる場合、ランダムに1つが選択されます。プレイヤーは
SpawnLocation
の上の異なる地点に出現しますが、現在のところ、あるプレイヤーの直後に出現し、他のプレイヤーの直後に出現した場合、プレイヤー同士が重なって出現することがあります。
上記引用内容をもとに、再調査した結果は以下の通りです。
-
SpawnLocation.Enabled
がfalse
のSpawnLocation
は除外される - 残ったものの内、
SpawnLocation.Neutral
がtrue
の場合は選考対象に加わる -
Player.Neutral
がfalse
である場合、更に残ったものの内、Player.TeamColor
とSpawnLocation.TeamColor
が一致しているものも選考対象に加わる
- 上記の条件から残ったものから一つランダムに選ばれた
SpawnLocation
から出現します。 - 上記の条件から残ったものの中に
Player.RespawnLocation
のプロパティと一致するものがあれば、ランダムではなく、そのSpawnLocation
から出現します。 - 上記の条件で該当する
SpawnLocation
が存在しない場合はおおよそ{ 0, 100, 0 }の座標に出現します。
TeamColorでリスポーン位置を管理する
上記の条件の最中にあるTeamColor
はRoblox側が特定のカラーに名称を付け、同一性を保ちやすくしたBrickColor
のプロパティです。
このTeamColor
をPlayer
とSpawnLocation
で比較することで、一致しているかを確認しています。
TaG! ~Take away & Glean~の開発の際に、時間内に無限にリスポーンできる仕様の為、可能な限りRoblox側の機能に管理を任せた復活のシステムである、SpawnLocation
を活用する流れになりました。
例えばロビー環境に居るプレイヤーはWhite
,戦闘中のプレイヤーはRed
等の進行度に応じたTeamColor
をPlayer
に付与することで、プレイヤーは各自のゲームの進行状況に応じたTeamColor
を持つSpawnLocation
からランダムに出現するようになります。
問題点
ここで問題になってくるのが、入室時のスポーンも同一の条件で選定していることです。
SpawnLocation.Neutral
がtrue
のSpawnLocation
が一つでも存在する場合、各プレイヤーのTeamColor
(ゲーム進行状況)と関係なくそこに生成される可能性があります。 これはゲームの進行に問題が起こる為、除かなければいけません。
しかし、入室したばかりのプレイヤーのプロパティはPlayer.Neutral = true
Player.TeamColor = white
であり、特にPlayer.Neutral
がtrue
のプレイヤーはSpawnLocation.Neutral
がtrue
のSpawnLocation
にしか、生成されることが出来ずに、両立させることができません。
解決策 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.AutoAssignable
がtrue
に設定されている、プレイヤーが最も少ないチームに割り当てられます。自動割り当て可能なチームがない場合は、Player.Neutral
がtrue
に設定されます。
ゲームループなく両陣営が戦い続けるゲーム等で利用できる機能で、このプロパティがtrue
の team
が一つしかない場合、そのチームに所属することになり、プレイヤーの初期進行度を一意の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
それぞれにあるTeamColor
とNeutral
のプロパティからスポーン領域となるSpawnLocation
が選定される - 入室時のスポーンにも同じ条件が使われている為、注意が必要である。
-
Team
インスタンスを使用することでTeamColor
を管理することができる。
参考
当社ではRobloxを活用したゲームの開発、 また企業の商品やサービスの認知度拡大に寄与する3Dワールドの制作など、 Robloxにおける様々な活用支援を行っております。 Robloxのコンテンツ開発をご検討されている企業様は、お気軽にご相談ください。 landho.co.jp/
Discussion