30 public class Player : Singleton<Player>
32 #region Private Fields
34 private Dictionary<PlayerIndex, PlayerCore> players =
new Dictionary<PlayerIndex, PlayerCore>();
36 internal static bool scanningForPlayers =
false;
41 #region Public Functions
50 return playerIndex != PlayerIndex.None && Instance.players.TryGetValue(playerIndex, out var playerCore);
62 if (playerIndex ==
PlayerIndex.None || !Instance.players.TryGetValue(playerIndex, out var playerCore))
68 friendlyName = playerCore.FriendlyName;
83 if (playerIndex ==
PlayerIndex.None || !TiltFiveSingletonHelper.TryGetISceneInfo(out var sceneInfo))
85 playerSettings =
null;
92 playerSettings = resultingPlayerSettings;
99 playerSettings = tiltFiveManager.playerSettings;
103 playerSettings =
null;
110 #region Internal Functions
118 if (scanningForPlayers)
123 if (playerSettings !=
null && Instance.players.TryGetValue(playerSettings.PlayerIndex, out var playerCore))
125 var playerIndex = playerSettings.PlayerIndex;
131 Log.
Info($
"Player {playerIndex} was removed due to their glasses (handle: {playerCore.GlassesHandle}) being disconnected.");
132 Instance.players.Remove(playerIndex);
136 playerCore.Update(playerSettings, spectatorSettings);
144 internal static void Reset(PlayerSettings playerSettings, SpectatorSettings spectatorSettings)
146 var playerIndex = playerSettings.PlayerIndex;
148 if (playerSettings !=
null && Instance.players.TryGetValue(playerIndex, out var playerCore))
150 if (Glasses.IsConnected(playerCore.GlassesHandle))
152 playerCore.Reset(playerSettings, spectatorSettings);
156 Validate(playerSettings);
165 internal static void Validate(PlayerSettings playerSettings)
167 if (playerSettings ==
null)
172 var scaleSettings = playerSettings.scaleSettings;
173 scaleSettings.contentScaleRatio = Mathf.Clamp(scaleSettings.contentScaleRatio, ScaleSettings.MIN_CONTENT_SCALE_RATIO,
float.MaxValue);
175 playerSettings.Validate();
182 internal static void ScanForNewPlayers()
184 if (scanningForPlayers)
188 scanningForPlayers =
true;
194 scanningForPlayers =
false;
197 internal static bool TryGetGlassesHandle(
PlayerIndex playerIndex, out GlassesHandle glassesHandle)
201 glassesHandle =
new GlassesHandle();
204 var playerAvailable = Instance.players.TryGetValue(playerIndex, out var playerCore);
205 glassesHandle = playerCore?.GlassesHandle ??
new GlassesHandle();
206 return playerAvailable;
209 internal static bool TryGetPlayerIndex(GlassesHandle glassesHandle, out
PlayerIndex playerIndex)
211 foreach (var keyValuePair
in Instance.players)
213 var currentPlayerIndex = keyValuePair.Key;
214 var currentPlayerCore = keyValuePair.Value;
215 if (currentPlayerCore.GlassesHandle == glassesHandle)
217 playerIndex = currentPlayerIndex;
225 internal static bool AllSupportedPlayersConnected()
227 if(!TiltFiveSingletonHelper.TryGetISceneInfo(out var sceneInfo))
231 var supportedPlayers = sceneInfo.GetSupportedPlayerCount();
249 internal static bool TryAddPlayer(GlassesHandle glassesHandle, out
PlayerIndex playerIndex)
251 var players = Instance.players;
252 if (players.Count >= GlassesSettings.MAX_SUPPORTED_GLASSES_COUNT)
258 if(TryGetPlayerIndex(glassesHandle, out var existingPlayerIndex))
274 if (!players.ContainsKey(currentPlayerIndex))
276 Glasses.TryGetFriendlyName(glassesHandle, out var friendlyName);
277 players[currentPlayerIndex] =
new PlayerCore(glassesHandle, friendlyName);
279 Log.Info($
"Player {currentPlayerIndex} created. Glasses: {glassesHandle} (\"{friendlyName}\")");
286 bool lowestPlayerIndex =
false;
291 if (lowestPlayerIndex)
293 Glasses.SetDefaultGlassesHandle(glassesHandle);
296 playerIndex = currentPlayerIndex;
306 internal static void OnDisable()
309 GameBoard.OnDisable();
313 internal static bool TryGetFirstConnectedPlayer(out
PlayerIndex playerIndex)
334 internal static void DrawGizmos(PlayerSettings playerSettings)
336 if (playerSettings ==
null)
341 var gameBoardSettings = playerSettings.gameboardSettings;
343 if (gameBoardSettings.currentGameBoard !=
null)
345 gameBoardSettings.currentGameBoard.DrawGizmo(playerSettings.scaleSettings, gameBoardSettings);
353 #region Private Classes
355 private class PlayerCore
357 public readonly GlassesHandle GlassesHandle;
358 public readonly
string FriendlyName;
360 public PlayerCore(GlassesHandle glassesHandle,
string friendlyName)
362 GlassesHandle = glassesHandle;
363 FriendlyName = friendlyName;
366 internal void Update(PlayerSettings playerSettings, SpectatorSettings spectatorSettings)
368 if (!Glasses.Validate(playerSettings.glassesSettings, spectatorSettings, GlassesHandle))
370 Glasses.Reset(playerSettings.glassesSettings, spectatorSettings, GlassesHandle);
372 GetLatestPoseData(playerSettings, spectatorSettings);
375 internal void Reset(PlayerSettings playerSettings, SpectatorSettings spectatorSettings)
377 Glasses.Reset(playerSettings.glassesSettings, spectatorSettings, GlassesHandle);
384 private void GetLatestPoseData(PlayerSettings playerSettings, SpectatorSettings spectatorSettings)
386 var glassesSettings = playerSettings.glassesSettings;
387 var rightWandSettings = playerSettings.rightWandSettings;
388 var leftWandSettings = playerSettings.leftWandSettings;
389 var scaleSettings = playerSettings.scaleSettings;
390 var gameboardSettings = playerSettings.gameboardSettings;
392 Glasses.Update(GlassesHandle, glassesSettings, scaleSettings, gameboardSettings, spectatorSettings);
393 GameBoard.Update(GlassesHandle, gameboardSettings, scaleSettings);
394 Wand.Update(GlassesHandle, rightWandSettings, scaleSettings, gameboardSettings);
395 Wand.Update(GlassesHandle, leftWandSettings, scaleSettings, gameboardSettings);
402 #region Public Classes
431 public class WaitUntilPlayerConnected : CustomYieldInstruction
436 public WaitUntilPlayerConnected(
PlayerIndex playerIndex)
438 this.playerIndex = playerIndex;