-
-
Save Kroporo/f7201d7c9ce6dd015a461992c62cb946 to your computer and use it in GitHub Desktop.
| using UnityEngine; | |
| using UnityEditor; | |
| using System.Reflection; | |
| using System; | |
| // This class finds and kills a coroutine that throws errors inside the editor every 5 seconds if no headset is connected | |
| // The coroutine was introduced in the OpenXR Plugin [1.5.1] - 2022-08-11 | |
| // There absolutely has to be a better way, and this code should NOT be maintained incase the issue is resolved | |
| public class OpenXRRestarterKiller : MonoBehaviour { | |
| private static bool isHookedIntoUpdate = false; | |
| private static object restarterInstance = null; | |
| private static Type restarterType = null; | |
| private static FieldInfo singletonInstanceField = null; | |
| private static FieldInfo restarterCoroutine = null; | |
| private static MethodInfo stopMethod = null; | |
| [InitializeOnLoadMethod] | |
| [ExecuteInEditMode] | |
| private static void Init() { | |
| EditorApplication.playModeStateChanged += OnPlayModeStateChanged; | |
| } | |
| private static void OnPlayModeStateChanged(PlayModeStateChange change) { | |
| switch (change) { | |
| case PlayModeStateChange.EnteredPlayMode: | |
| GatherReflectionData(); | |
| SetHooked(true); | |
| break; | |
| case PlayModeStateChange.ExitingPlayMode: | |
| SetHooked(false); | |
| break; | |
| } | |
| } | |
| private static void GatherReflectionData() { | |
| restarterType = Type.GetType("UnityEngine.XR.OpenXR.OpenXRRestarter, Unity.XR.OpenXR, Version=0.0.0.0, Culture=neutral, PublicKeyToken=nul", true); | |
| singletonInstanceField = restarterType.GetField("s_Instance", BindingFlags.NonPublic | BindingFlags.Static); | |
| restarterCoroutine = restarterType.GetField("m_pauseAndRestartCoroutine", BindingFlags.NonPublic | BindingFlags.Instance); | |
| stopMethod = typeof(MonoBehaviour).GetMethod("StopCoroutine", new Type[] { typeof(Coroutine) }); | |
| } | |
| // Enables/Disables looking for the restarter coroutine | |
| private static void SetHooked(bool isHooked) { | |
| if (isHookedIntoUpdate == isHooked) | |
| return; // Already have the desired state | |
| isHookedIntoUpdate = isHooked; | |
| if (isHooked) { | |
| EditorApplication.update += OnUpdate; | |
| } else { | |
| EditorApplication.update -= OnUpdate; | |
| } | |
| } | |
| private static void OnUpdate() { | |
| // Search for the singleton instance, we run before it initializes | |
| if (restarterInstance == null && singletonInstanceField.GetValue(null) != null) { | |
| restarterInstance = singletonInstanceField.GetValue(null); | |
| } | |
| // Check if we have an instance with an active restarter coroutine. | |
| if (restarterInstance != null && restarterCoroutine.GetValue(singletonInstanceField.GetValue(null)) != null) { | |
| Debug.Log("Killing internal OpenXR restart coroutine after connection failure! This is an editor hack to avoid reoccuring reconnection errors!"); | |
| stopMethod.Invoke(restarterInstance, new object[] { restarterCoroutine.GetValue(restarterInstance) }); | |
| restarterCoroutine.SetValue(restarterInstance, null); | |
| // Our job is done, no reason to linger anymore | |
| SetHooked(false); | |
| } | |
| } | |
| } |
Warning:: Copy this code to the Assset/Editor folder
As you should with every editor script! Though the issue this solves has been resolved in a recent update to the OpenXR package, so this shouldn't be needed anymore.
Warning:: Copy this code to the Assset/Editor folder
As you should with every editor script! Though the issue this solves has been resolved in a recent update to the OpenXR package, so this shouldn't be needed anymore.
I still have the problem with Version 4.3.3 - February 16, 2023 Unity 2021.3.15f1 Personal. I could not build without your script
I still have the problem with Version 4.3.3 - February 16, 2023 Unity 2021.3.15f1 Personal. I could not build without your script
According to the OpenXR 1.6.0 (2022-11-29) changelog, this has been fixed. We personally don't use this workaround anymore, but I am glad to hear that the script helps!
Warning:: Copy this code to the Assset/Editor folder