Advertisement
BrainSlugs83

XRSetup.cs

Jan 31st, 2020
1,172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.17 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. using UnityEngine.XR;
  7.  
  8. public class XRSetup : MonoBehaviour
  9. {
  10.     public TrackingOriginModeFlags TrackingOriginMode = TrackingOriginModeFlags.Floor;
  11.  
  12.     public static bool IsVrSetup { get; private set; } = false;
  13.  
  14.     private bool FirstRun = true;
  15.     private List<XRInputSubsystem> XrInputSubsystems = new List<XRInputSubsystem>();
  16.  
  17.     void Start()
  18.     {
  19.         XrInputSubsystems.Clear();
  20.         SubsystemManager.GetInstances(XrInputSubsystems);
  21.  
  22.         Debug.Log("XRINPUT SUBSYSTEM COUNT (TOTAL):   " + XrInputSubsystems.Count);
  23.         Debug.Log("XRINPUT SUBSYSTEM COUNT (RUNNING): " + XrInputSubsystems.Where(xris => xris.running).Count());
  24.  
  25.         if (XrInputSubsystems.Any())
  26.         {
  27.             FirstRun = true;
  28.             StartCoroutine(Coroutine());
  29.         }
  30.         else
  31.         {
  32.             IsVrSetup = false;
  33.         }
  34.     }
  35.  
  36.     IEnumerator Coroutine()
  37.     {
  38.         yield return null;
  39.         yield return null;
  40.  
  41.         float delay = 0;
  42.         while (true)
  43.         {
  44.             var currentTrackingSpace = GetTrackingSpaceType();
  45.  
  46.             if (FirstRun || !currentTrackingSpace.HasValue || currentTrackingSpace.Value != TrackingOriginMode)
  47.             {
  48.                 Debug.LogWarning("CURRENT TRACKING SPACE TYPE: " + currentTrackingSpace);
  49.                 SetTrackingSpaceType(TrackingOriginMode);
  50.                 FirstRun = false;
  51.             }
  52.  
  53.             IncreaseDelay(ref delay);
  54.             foreach (var d in Delay(delay)) { yield return d; }
  55.         }
  56.     }
  57.  
  58.     TrackingOriginModeFlags? GetTrackingSpaceType()
  59.     {
  60.         try
  61.         {
  62.             bool any = false;
  63.             TrackingOriginModeFlags flags = 0;
  64.             foreach (var xri in XrInputSubsystems.Where(xris => xris.running))
  65.             {
  66.                 flags |= xri.GetTrackingOriginMode();
  67.                 any = true;
  68.             }
  69.  
  70.             if (any)
  71.             {
  72.                 return flags;
  73.             }
  74.             else
  75.             {
  76.                 IsVrSetup = false;
  77.                 Debug.LogError("UNABLE TO DETERMINE CURRENT TRACKING SPACE TYPE (0 SUBSYSTEMS).");
  78.                 return null;
  79.             }
  80.         }
  81.         catch (Exception ex)
  82.         {
  83.             IsVrSetup = false;
  84.             Debug.LogError("UNABLE TO DETERMINE CURRENT TRACKING SPACE TYPE: " + ex.ToString());
  85.             return null;
  86.         }
  87.     }
  88.  
  89.     bool SetTrackingSpaceType(TrackingOriginModeFlags? flags)
  90.     {
  91.         if (flags == null) { return false; }
  92.  
  93.         try
  94.         {
  95.             bool any = false;
  96.             foreach (var xri in XrInputSubsystems)
  97.             {
  98.                 any = true;
  99.                 if (!xri.TrySetTrackingOriginMode(flags.Value))
  100.                 {
  101.                     Debug.LogError("UNABLE TO SET TRACKING SPACE TYPE (NO EXCEPTION).");
  102.                     IsVrSetup = false;
  103.                     return false;
  104.                 }
  105.             }
  106.  
  107.             if (any)
  108.             {
  109.                 IsVrSetup = true;
  110.                 return true;
  111.             }
  112.             else
  113.             {
  114.                 Debug.LogError("UNABLE TO SET TRACKING SPACE TYPE (0 SUBSYSTEMS).");
  115.             }
  116.         }
  117.         catch (Exception ex)
  118.         {
  119.             Debug.LogError("UNABLE TO SET TRACKING SPACE TYPE: " + ex.ToString());
  120.         }
  121.  
  122.         IsVrSetup = false;
  123.         return false;
  124.     }
  125.  
  126.     private IEnumerable Delay(float delay)
  127.     {
  128.         if (delay < 30)
  129.         {
  130.             for (int i = 0; i <= delay; i++)
  131.             {
  132.                 yield return null;
  133.             }
  134.         }
  135.         else
  136.         {
  137.             yield return new WaitForSecondsRealtime(delay / 1000f);
  138.         }
  139.     }
  140.  
  141.     private void IncreaseDelay(ref float delay)
  142.     {
  143.         if (delay < 30)
  144.         {
  145.             delay++;
  146.         }
  147.         else
  148.         {
  149.             delay *= 2f;
  150.         }
  151.  
  152.         if (IsVrSetup)
  153.         {
  154.             if (delay > 5000) { delay = 5000; }
  155.         }
  156.         else
  157.         {
  158.             if (delay > 1000) { delay = 1000; }
  159.         }
  160.     }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement