56 if(allPlayerSettings[0] ==
null)
60 return allPlayerSettings[0];
71 if (allPlayerSettings[1] ==
null)
75 return allPlayerSettings[1];
86 if (allPlayerSettings[2] ==
null)
90 return allPlayerSettings[2];
101 if (allPlayerSettings[3] ==
null)
105 return allPlayerSettings[3];
111 public uint supportedPlayerCount = 3;
132 public EditorSettings2 editorSettings =
new EditorSettings2();
133 public PlayerIndex selectedPlayer => editorSettings.selectedPlayer;
135 private HashSet<GameBoard> renderedGameboards =
new HashSet<GameBoard>();
138 private bool needsDriverUpdateNotifiedOnce =
false;
139 private bool needsDriverUpdateErroredOnce =
false;
141 private static bool upgradeInProgress =
false;
143#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
149 private int[] playerIndexMapping = {0,1,2,3};
164 graphicsSettings.applicationTargetFramerate = Application.targetFrameRate;
165 graphicsSettings.applicationVSyncCount = QualitySettings.vSyncCount;
167 if (!SystemControl.SetPlatformContext())
169 Log.
Warn(
"Failed to set application context.");
173 if (!SystemControl.SetApplicationInfo())
175 Log.
Warn(
"Failed to send application info to the T5 Service.");
180 for (
int i = 0; i < allPlayerSettings.Length; i++)
182 var currentPlayerSettings = allPlayerSettings[i];
183 if(currentPlayerSettings ==
null)
191#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
195 private void OnBeforeUpdate()
198 if (UnityEditor.EditorApplication.isPaused)
203 if (
Player.scanningForPlayers)
209 Player.ScanForNewPlayers();
210 Wand.GetLatestInputs();
215 if (UnityEngine.InputSystem.LowLevel.InputState.currentUpdateType != UnityEngine.InputSystem.LowLevel.InputUpdateType.BeforeRender)
227#if !UNITY_2019_1_OR_NEWER || !INPUTSYSTEM_AVAILABLE
229 Player.ScanForNewPlayers();
230 Wand.GetLatestInputs();
232 RefreshSpectatorSettings();
235 for (
int i = 0; i < supportedPlayerCount; i++)
237 var playerSettings = allPlayerSettings[i];
238 if (playerSettings !=
null)
245 if (Glasses.TryGetPreviewPose(spectatedPlayer, out var spectatedPlayerPose))
248 spectatedPlayerPose.position,
249 spectatedPlayerPose.rotation);
252#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
253 var devices = InputUser.GetUnpairedInputDevices();
254 if (devices.Count > 0)
256 foreach (InputDevice dev
in devices)
258 if (dev is WandDevice)
260 var headPoseRoot = Glasses.GetPoseRoot(((WandDevice)dev).playerIndex);
262 if (headPoseRoot !=
null)
264 var playerInput = headPoseRoot.GetComponentInChildren<PlayerInput>();
266 if (playerInput !=
null && playerInput.user.valid)
268 Log.Warn($
"Unpaired Wand Device [{((WandDevice)dev).ControllerIndex}] found and paired to Player [{((WandDevice)dev).playerIndex}].");
269 InputUser.PerformPairingWithDevice(dev, playerInput.user);
270 playerInput.user.ActivateControlScheme(
"XR");
289 for (
int i = 0; i < supportedPlayerCount; i++)
291 var playerSettings = allPlayerSettings[i];
292 if (playerSettings !=
null)
312 if (!needsDriverUpdateErroredOnce)
321 if (!needsDriverUpdateNotifiedOnce)
323 Log.
Warn(
"Incompatible Tilt Five service. Please update driver package.");
324 needsDriverUpdateNotifiedOnce =
true;
330 needsDriverUpdateNotifiedOnce =
false;
334 catch (System.DllNotFoundException e)
337 "Could not connect to Tilt Five plugin for compatibility check: {0}",
339 needsDriverUpdateErroredOnce =
true;
341 catch (System.Exception e)
344 needsDriverUpdateErroredOnce =
true;
376 playerSettings =
null;
381#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
382 internal void RefreshInputDevicePairings()
384 foreach (WandDevice wand
in Input.wandDevices)
386 PlayerInput playerInput =
null;
389 playerInput = PlayerInput.GetPlayerByIndex(playerIndexMapping[(
int)wand.playerIndex - 1]);
390 if (playerInput !=
null)
392 InputUser.PerformPairingWithDevice(wand, playerInput.user);
396 foreach (GlassesDevice glasses
in Input.glassesDevices)
398 PlayerInput playerInput =
null;
401 playerInput = PlayerInput.GetPlayerByIndex(playerIndexMapping[(
int)glasses.PlayerIndex - 1]);
402 if (playerInput !=
null)
404 InputUser.PerformPairingWithDevice(glasses, playerInput.user);
410 internal void ReassignPlayerIndexMapping(
int[] mapping)
412 if(mapping.Length != 4)
414 throw new System.ArgumentException(
"Invalid player index mapping argument - mapping should be 4 values long");
416 for (var i = 0; i < mapping.Length; i++)
420 throw new System.ArgumentException(
"Invalid player index mapping argument - mapping should contain positive values only");
422 for (var j = 0; j < i; j++)
424 if (mapping[i] == mapping[j])
426 throw new System.ArgumentException(
"Invalid player index mapping argument - mapping should contain no duplicates");
430 playerIndexMapping = mapping;
431 RefreshInputDevicePairings();
440 private void OnEnable()
445 NativePlugin.SetMaxDesiredGlasses((
byte)GlassesSettings.MAX_SUPPORTED_GLASSES_COUNT);
447 catch (System.DllNotFoundException e)
450 "Could not connect to Tilt Five plugin for setting max glasses: {0}",
453 catch (System.Exception e)
455 Log.Error(e.Message);
459 for (
int i = 0; i < allPlayerSettings.Length; i++)
461 var currentPlayerSettings = allPlayerSettings[i];
462 if (currentPlayerSettings ==
null)
468 for (
int i = 0; i < supportedPlayerCount; i++)
470 var playerSettings = allPlayerSettings[i];
471 if (playerSettings !=
null)
477#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
478 InputSystem.onBeforeUpdate += OnBeforeUpdate;
482 private void OnDisable()
484#if UNITY_2019_1_OR_NEWER && INPUTSYSTEM_AVAILABLE
485 InputSystem.onBeforeUpdate -= OnBeforeUpdate;
491 private void OnDestroy()
496 private void OnApplicationQuit()
506 private static void Quit()
510 NativePlugin.UnloadWorkaround();
512 catch (System.DllNotFoundException)
516 catch (System.Exception e)
518 Log.Error(e.Message);
522 [RuntimeInitializeOnLoadMethod]
523 private static void RunOnStart()
525 Application.quitting += Quit;
528 private void RefreshSpectatorSettings()
534 Log.Warn(
"No spectator camera detected in TiltFiveManager2's spectator settings. A spectator camera is required.");
538 var highestSupportedPlayer = (
PlayerIndex)supportedPlayerCount;
541 Log.Warn($
"Invalid spectatorSettings.spectatedPlayer [{spectatorSettings.spectatedPlayer}]. TiltFiveManager2 currently only supports up to Player {highestSupportedPlayer}.");
542 spectatorSettings.spectatedPlayer = highestSupportedPlayer;
554 if(upgradeInProgress)
564 playerThreeSettings.PlayerIndex =
PlayerIndex.Three;
567 supportedPlayerCount = (uint) Mathf.Clamp(supportedPlayerCount, 1, PlayerSettings.MAX_SUPPORTED_PLAYERS);
569 for (
int i = 0; i < allPlayerSettings.Length; i++)
571 var playerSettings = allPlayerSettings[i];
572 if (playerSettings !=
null)
574 Player.Validate(playerSettings);
575 playerSettings.glassesSettings.glassesMirrorMode =
spectatorSettings.glassesMirrorMode;
578 RefreshSpectatorSettings();
591 renderedGameboards.Clear();
593 for (
int i = 0; i < supportedPlayerCount; i++)
595 var playerSettings = allPlayerSettings[i];
596 if (playerSettings !=
null)
598 var currentGameboard = playerSettings.gameboardSettings.currentGameBoard;
599 if (!renderedGameboards.Contains(currentGameboard))
601 renderedGameboards.Add(currentGameboard);
602 Player.DrawGizmos(playerSettings);
608 public static void CreateFromTiltFiveManager(TiltFiveManager tiltFiveManager)
610 var parentGameObject = tiltFiveManager.gameObject;
616 var isTiltFiveManager2AlreadyPresent = parentGameObject.TryGetComponent<TiltFiveManager2>(out var existingTiltFiveManager2);
617 var confirmationDialogTitle =
"Existing TiltFiveManager2 detected";
618 var confirmationDialogText = $
"The GameObject \"{parentGameObject.name}\" already has a TiltFiveManager2 component." +
619 System.Environment.NewLine + System.Environment.NewLine +
620 "Overwrite the existing TiltFiveManager2 component values?" +
621 System.Environment.NewLine + System.Environment.NewLine +
622 "Warning: This cannot be undone via Edit > Undo (Ctrl+Z)";
623 var confirmButtonLabel =
"Overwrite";
624 var cancelButtonLabel =
"Cancel";
625 var overwriteExistingTiltFiveManager2 = isTiltFiveManager2AlreadyPresent
626 && UnityEditor.EditorUtility.DisplayDialog(confirmationDialogTitle, confirmationDialogText, confirmButtonLabel, cancelButtonLabel);
628 if(isTiltFiveManager2AlreadyPresent && !overwriteExistingTiltFiveManager2)
630 Debug.Log($
"Aborted attempt to upgrade TiltFiveManager.");
634 upgradeInProgress =
true;
636 TiltFiveManager2 tiltFiveManager2 = overwriteExistingTiltFiveManager2
637 ? existingTiltFiveManager2
638 : parentGameObject.AddComponent<TiltFiveManager2>();
641 tiltFiveManager.enabled =
false;
644 tiltFiveManager2.supportedPlayerCount = 1;
647 tiltFiveManager2.playerOneSettings.glassesSettings = tiltFiveManager.
glassesSettings.Copy();
649 tiltFiveManager2.playerOneSettings.scaleSettings = tiltFiveManager.
scaleSettings.Copy();
651 tiltFiveManager2.playerOneSettings.gameboardSettings = tiltFiveManager.
gameBoardSettings.Copy();
653 tiltFiveManager2.playerOneSettings.leftWandSettings = tiltFiveManager.
leftWandSettings.Copy();
654 tiltFiveManager2.playerOneSettings.rightWandSettings = tiltFiveManager.
rightWandSettings.Copy();
660 tiltFiveManager2.spectatorSettings.glassesMirrorMode = tiltFiveManager.
glassesSettings.glassesMirrorMode;
663 tiltFiveManager2.logSettings = tiltFiveManager.
logSettings.Copy();
665 upgradeInProgress =
false;
667 var resultText = overwriteExistingTiltFiveManager2
668 ? $
"Successfully overwrote component values on the existing TiltFiveManager2 component attached to \"{parentGameObject.name}\" using the old TiltFiveManager component values."
669 : $
"Successfully attached a new TiltFiveManager2 component to \"{parentGameObject.name}\" and imported the old TiltFiveManager component values.";
670 Debug.Log($
"{resultText}{System.Environment.NewLine}The old TiltFiveManager has been disabled - it can safely be removed.");
675 #region ISceneInfo Implementation
677 [Obsolete(
"TiltFiveManager2.GetScaleToUWRLD_UGBD is deprecated. Please use TiltFiveManager2.GetScaleToWorldSpaceFromGameboardSpace instead.")]
678 public float GetScaleToUWRLD_UGBD() {
return GetScaleToWorldSpaceFromGameboardSpace(); }
680 public float GetScaleToWorldSpaceFromGameboardSpace()
685 public Pose GetGameboardPose()
690 public Camera GetEyeCamera()
695 public uint GetSupportedPlayerCount()
697 return supportedPlayerCount;
700 public bool IsActiveAndEnabled()
702 return isActiveAndEnabled;
705 #endregion ISceneInfo Implementation