using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.PackageManager.Requests; using UnityEditor.PackageManager; [InitializeOnLoad] public class PluginsEditor : EditorWindow { static ListRequest ListRequest; static AddRequest AddRequest; static bool LoadingData = false; static bool UsingOculusXR = false; static bool UsingOculusAndroid = false; static bool UsingOculusDesktop = false; static bool UsingOpenVRDesktop = false; static bool UsingOpenXR = false; static bool UsingXRManagement = false; static bool UsingURP = false; static bool UsingHDRP = false; static bool IsUnity2019 = false; static bool IsUnity2020 = false; static bool IsUnity2021 = false; static bool InstallingOpenXR = false; public static PluginsEditor Instance { get; private set; } public static bool IsOpen { get { return Instance != null; } } static bool DoCheckFirstRun = true; static bool FirstRun = true; static bool ShowedFirstRunWindow = false; static Texture logo; static GUIStyle rt; static PluginsEditor() { if(DoCheckFirstRun) { EditorApplication.update += CheckFirstRun; } } static void CheckFirstRun() { // Only call this once EditorApplication.update -= CheckFirstRun; // Open Window on first load FirstRun = !EditorPrefs.HasKey("FirstRun"); if (FirstRun) { DoFirstRun(); } } void OnEnable() { Instance = this; logo = Resources.Load("v_64") as Texture; #if UNITY_2019_4_OR_NEWER IsUnity2019 = true; #endif #if UNITY_2020_0_OR_NEWER IsUnity2019 = false; IsUnity2020 = true; #endif #if UNITY_2021_0_OR_NEWER IsUnity2020 = false; IsUnity2021 = true; #endif } public static void DoFirstRun() { EditorPrefs.SetBool("FirstRun", true); ShowedFirstRunWindow = true; PluginsEditor window = (PluginsEditor)GetWindow(typeof(PluginsEditor)); window.Show(); FirstRun = false; } [MenuItem("VRIF/VRIF XR Plugins Helper")] public static void ShowWindow() { const int width = 600; const int height = 440; var x = (Screen.currentResolution.width - width) / 2; var y = (Screen.currentResolution.height - height) / 2; GetWindow("Plugins Helper").position = new Rect(x, y, width, height); RefreshWindow(); } [UnityEditor.Callbacks.DidReloadScripts] static void OnScriptsReloaded() { if(IsOpen) { RefreshWindow(); } } void OnGUI() { // Sanity check on rich text style if(rt == null) { rt = new GUIStyle(EditorStyles.label); rt.richText = true; } // Logo / Info GUILayout.BeginHorizontal(); if (logo) { GUILayout.Label(logo); } GUILayout.Label("\nWelcome to the VR Interaction Framework! \nBelow is a list of XR-related packages and their current installation status. \n", rt); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); if (LoadingData) { EditorGUILayout.LabelField("Loading plugin info...", rt); return; } // First Time Check if(ShowedFirstRunWindow) { EditorGUILayout.HelpBox("This appears to be your fist time installing VRIF - awesome! Be sure to check out the Wiki link listed below for installation instructions and documentation.", MessageType.Info); EditorGUILayout.Separator(); } CheckNoPluginsInstalled(); GUILayout.Label("Installed XR Plugin Packages : ", EditorStyles.boldLabel); EditorGUILayout.LabelField("Oculus XR Plugin : " + GetLabel(UsingOculusXR), rt); AddOpenXRContent(); // XR Management EditorGUILayout.LabelField("XR Management : " + GetLabel(UsingXRManagement), rt); EditorGUILayout.Separator(); GUILayout.Label("Installed Legacy Packages : ", EditorStyles.boldLabel); EditorGUILayout.LabelField("Oculus Android Package : " + GetLabel(UsingOculusAndroid), rt); EditorGUILayout.LabelField("Oculus Desktop Package : " + GetLabel(UsingOculusDesktop), rt); EditorGUILayout.LabelField("OpenVR Desktop Package : " + GetLabel(UsingOpenVRDesktop), rt); EditorGUILayout.Separator(); // Warning about not having Render Pipeline set if ((UsingURP || UsingHDRP) && UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset == null) { GUILayout.Label("Additional Info : ", EditorStyles.boldLabel); EditorGUILayout.HelpBox("WARNING! No Render Pipeline has been set, but you have a Render Pipeline plugin installed. Go to Project Settings -> Graphics and verify your settings.", MessageType.Warning); EditorGUILayout.LabelField("URP : " + GetLabel(UsingURP), rt); EditorGUILayout.LabelField("HDRP : " + GetLabel(UsingHDRP), rt); } EditorGUILayout.Separator(); // Useful Links GUILayout.Label("Useful Links : ", EditorStyles.boldLabel); AddLink("VRIF Wiki", "https://wiki.beardedninjagames.com"); AddLink("VRIF Asset", "http://u3d.as/1JpA"); AddLink("VRIF Discord", "https://discord.gg/BFauBCj"); EditorGUILayout.Separator(); AddLink("Pico SDK", "https://developer.pico-interactive.com/sdk"); AddLink("Oculus Integration Asset", "https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022"); AddLink("SteamVR SDK", "https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647"); } static void AddLink(string label, string url) { if (GUILayout.Button(label, EditorStyles.linkLabel)) { Application.OpenURL(url); } } static string OpenXRMessage; public static void DrawUILine(Color color, int thickness = 1, int padding = 10) { Rect r = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness)); r.height = thickness; r.y += padding / 2; r.x -= 2; r.width += 6; EditorGUI.DrawRect(r, color); } static void CheckNoPluginsInstalled() { // Not using any plugins bool noPluginsInstalled = !UsingOculusXR && !UsingOculusAndroid && !UsingOculusDesktop && !UsingOpenVRDesktop && !UsingOpenXR; if (noPluginsInstalled) { EditorGUILayout.HelpBox("WARNING! No XR plugin packages have been detected. You need at least one XR Plugin installed for your device to function properly. You can disregard this message if you are using a plugin not listed below.", MessageType.Warning); EditorGUILayout.Separator(); } } static void AddOpenXRContent() { GUIStyle rt = new GUIStyle(EditorStyles.label); rt.richText = true; // 2019 Open XR if (IsUnity2019) { GUILayout.BeginHorizontal(); EditorGUILayout.LabelField("OpenXR : " + GetLabel(UsingOpenXR) + " (Unity 2020+)", rt); if (InstallingOpenXR) { EditorGUILayout.LabelField(" Installing OpenXR...", rt); } // OpenXR is built-in to Unity in 2021. Removing this for now as the user can just install from the package manager. //else if (UsingOpenXR == false && GUILayout.Button("Install OpenXR Plugin", EditorStyles.miniButton)) { // InstallOpenXR(); //} GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); if (!string.IsNullOrEmpty(OpenXRMessage)) { EditorGUILayout.HelpBox(OpenXRMessage, MessageType.Warning); } } else { if (UsingOpenXR) { EditorGUILayout.LabelField("OpenXR : " + GetLabel(UsingOpenXR), rt); } else { // Add install button if (IsUnity2020) { EditorGUILayout.LabelField("OpenXR : " + GetLabel(UsingOpenXR), rt); if (GUILayout.Button("Install OpenXR Plugin")) { InstallOpenXR(); } } else if (IsUnity2021) { // 2021 is handled internally EditorGUILayout.LabelField("OpenXR : (install from within XR-Management)", rt); } } } } static void RefreshWindow() { if (!LoadingData) { LoadingData = true; // Get Currently installed packages ListRequest = Client.List(); EditorApplication.update += ListProgress; } } static string GetLabel(bool active) { if(active) { return "True"; } return "False"; } static void ListProgress() { if (ListRequest.IsCompleted) { if (ListRequest.Status == StatusCode.Success) { foreach (var package in ListRequest.Result) { if(package.name == "com.unity.xr.oculus") { UsingOculusXR = true; } else if (package.name == "com.unity.xr.openxr") { UsingOpenXR = true; } else if (package.name == "com.unity.xr.oculus.android") { UsingOculusAndroid = true; } else if (package.name == "com.unity.xr.oculus.standalone") { UsingOculusDesktop = true; } else if (package.name == "com.unity.xr.openvr.standalone") { UsingOpenVRDesktop = true; } else if (package.name == "com.unity.xr.management") { UsingXRManagement = true; } else if(package.name.Contains("render-pipelines.universal")) { UsingURP = true; } else if (package.name.Contains("render-pipelines.high-definition")) { UsingHDRP = true; } } } else if (ListRequest.Status >= StatusCode.Failure) { Debug.Log(ListRequest.Error.message); } LoadingData = false; EditorApplication.update -= ListProgress; } } static void AddProgress() { if (AddRequest.IsCompleted) { if (AddRequest.Status == StatusCode.Success) { OpenXRMessage = "Successfully Installed"; } else if (AddRequest.Status >= StatusCode.Failure) { OpenXRMessage = AddRequest.Error.message; } InstallingOpenXR = false; EditorApplication.update -= AddProgress; } } static void InstallOpenXR() { InstallingOpenXR = true; AddRequest = Client.Add("com.unity.xr.openxr"); EditorApplication.update += AddProgress; } }