You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
14 KiB
C#
351 lines
14 KiB
C#
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
|
|
//
|
|
// Purpose: Prompt developers to use settings most compatible with SteamVR.
|
|
//
|
|
//=============================================================================
|
|
|
|
//2019 will use some of this
|
|
#if (UNITY_2018_1_OR_NEWER && !UNITY_2020_1_OR_NEWER)
|
|
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.IO;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System;
|
|
using System.Reflection;
|
|
|
|
using Valve.VR.InteractionSystem;
|
|
using UnityEditor.Callbacks;
|
|
|
|
#pragma warning disable CS0618
|
|
#pragma warning disable CS0219
|
|
#pragma warning disable CS0414
|
|
|
|
|
|
namespace Valve.VR
|
|
{
|
|
#if (UNITY_2018_1_OR_NEWER && !UNITY_2019_1_OR_NEWER)
|
|
public class SteamVR_AutoEnableVR_2018to2019
|
|
{
|
|
[DidReloadScripts]
|
|
private static void OnReload()
|
|
{
|
|
SteamVR_AutoEnableVR_UnityPackage.InstallAndEnableUnityVR();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
public class SteamVR_AutoEnableVR_UnityPackage
|
|
{
|
|
private static bool? _forceInstall;
|
|
private const string forceInstallKey = "steamvr.autoenablevr.forceInstall";
|
|
private static bool? _forceEnable;
|
|
private const string forceEnableKey = "steamvr.autoenablevr.forceEnable";
|
|
private static PackageStates? _updateState;
|
|
private const string updateStateKey = "steamvr.autoenablevr.updateState";
|
|
|
|
private static bool forceInstall
|
|
{
|
|
get
|
|
{
|
|
if (_forceInstall.HasValue == false)
|
|
{
|
|
if (EditorPrefs.HasKey(forceInstallKey))
|
|
_forceInstall = EditorPrefs.GetBool(forceInstallKey);
|
|
else
|
|
_forceInstall = false;
|
|
}
|
|
|
|
return _forceInstall.Value;
|
|
}
|
|
set
|
|
{
|
|
_forceInstall = value;
|
|
EditorPrefs.SetBool(forceInstallKey, value);
|
|
}
|
|
}
|
|
private static bool forceEnable
|
|
{
|
|
get
|
|
{
|
|
if (_forceEnable.HasValue == false)
|
|
{
|
|
if (EditorPrefs.HasKey(forceEnableKey))
|
|
_forceEnable = EditorPrefs.GetBool(forceEnableKey);
|
|
else
|
|
_forceEnable = false;
|
|
}
|
|
|
|
return _forceEnable.Value;
|
|
}
|
|
set
|
|
{
|
|
_forceEnable = value;
|
|
EditorPrefs.SetBool(forceEnableKey, value);
|
|
}
|
|
}
|
|
|
|
private static void UpdateUpdateStateFromPrefs()
|
|
{
|
|
if (_updateState.HasValue == false)
|
|
{
|
|
if (EditorPrefs.HasKey(updateStateKey))
|
|
_updateState = (PackageStates)EditorPrefs.GetInt(updateStateKey);
|
|
else
|
|
_updateState = PackageStates.None;
|
|
}
|
|
}
|
|
|
|
private static PackageStates updateState
|
|
{
|
|
get
|
|
{
|
|
if (_updateState.HasValue == false)
|
|
UpdateUpdateStateFromPrefs();
|
|
return _updateState.Value;
|
|
}
|
|
set
|
|
{
|
|
_updateState = value;
|
|
EditorPrefs.SetInt(updateStateKey, (int)value);
|
|
}
|
|
}
|
|
|
|
public static void InstallAndEnableUnityVR(bool forceInstall = false, bool forceEnable = false)
|
|
{
|
|
_forceInstall = forceInstall;
|
|
_forceEnable = forceEnable;
|
|
EditorApplication.update += Update;
|
|
}
|
|
|
|
protected const string openVRString = "OpenVR";
|
|
protected const string unityOpenVRPackageString = "com.unity.xr.openvr.standalone";
|
|
protected const string valveOpenVRPackageString = "com.valvesoftware.unity.openvr";
|
|
|
|
private enum PackageStates
|
|
{
|
|
None,
|
|
WaitingForList,
|
|
WaitingForAdd,
|
|
WaitingForAddConfirm,
|
|
Installed,
|
|
Failed,
|
|
}
|
|
|
|
private static UnityEditor.PackageManager.Requests.ListRequest listRequest;
|
|
private static UnityEditor.PackageManager.Requests.AddRequest addRequest;
|
|
private static System.Diagnostics.Stopwatch addingPackageTime = new System.Diagnostics.Stopwatch();
|
|
private static System.Diagnostics.Stopwatch addingPackageTimeTotal = new System.Diagnostics.Stopwatch();
|
|
private static float estimatedTimeToInstall = 80;
|
|
private static int addTryCount = 0;
|
|
|
|
private static void End()
|
|
{
|
|
updateState = PackageStates.None;
|
|
addingPackageTime.Stop();
|
|
addingPackageTimeTotal.Stop();
|
|
UnityEditor.EditorUtility.ClearProgressBar();
|
|
EditorApplication.update -= Update;
|
|
}
|
|
|
|
public static void Update()
|
|
{
|
|
if (!SteamVR_Settings.instance.autoEnableVR || Application.isPlaying)
|
|
End();
|
|
|
|
if (UnityEditor.PlayerSettings.virtualRealitySupported == false)
|
|
{
|
|
if (forceInstall == false)
|
|
{
|
|
int shouldInstall = UnityEditor.EditorUtility.DisplayDialogComplex("SteamVR", "Would you like to enable Virtual Reality mode?\n\nThis will install the OpenVR for Desktop package and enable it in Player Settings.", "Yes", "No, and don't ask again", "No");
|
|
|
|
switch (shouldInstall)
|
|
{
|
|
case 0: //yes
|
|
UnityEditor.PlayerSettings.virtualRealitySupported = true;
|
|
break;
|
|
case 1: //no
|
|
End();
|
|
return;
|
|
case 2: //no, don't ask
|
|
SteamVR_Settings.instance.autoEnableVR = false;
|
|
SteamVR_Settings.Save();
|
|
End();
|
|
return;
|
|
}
|
|
}
|
|
|
|
Debug.Log("<b>[SteamVR Setup]</b> Enabled virtual reality support in Player Settings. (you can disable this by unchecking Assets/SteamVR/SteamVR_Settings.autoEnableVR)");
|
|
}
|
|
|
|
switch (updateState)
|
|
{
|
|
case PackageStates.None:
|
|
//see if we have the package
|
|
listRequest = UnityEditor.PackageManager.Client.List(true);
|
|
updateState = PackageStates.WaitingForList;
|
|
break;
|
|
|
|
case PackageStates.WaitingForList:
|
|
if (listRequest == null)
|
|
{
|
|
listRequest = UnityEditor.PackageManager.Client.List(true);
|
|
updateState = PackageStates.WaitingForList;
|
|
}
|
|
else if (listRequest.IsCompleted)
|
|
{
|
|
if (listRequest.Error != null || listRequest.Status == UnityEditor.PackageManager.StatusCode.Failure)
|
|
{
|
|
updateState = PackageStates.Failed;
|
|
break;
|
|
}
|
|
|
|
string packageName = unityOpenVRPackageString;
|
|
|
|
bool hasPackage = listRequest.Result.Any(package => package.name == packageName);
|
|
|
|
if (hasPackage == false)
|
|
{
|
|
//if we don't have the package - then install it
|
|
addRequest = UnityEditor.PackageManager.Client.Add(packageName);
|
|
updateState = PackageStates.WaitingForAdd;
|
|
addTryCount++;
|
|
|
|
Debug.Log("<b>[SteamVR Setup]</b> Installing OpenVR package...");
|
|
addingPackageTime.Start();
|
|
addingPackageTimeTotal.Start();
|
|
}
|
|
else
|
|
{
|
|
//if we do have the package, make sure it's enabled.
|
|
updateState = PackageStates.Installed; //already installed
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PackageStates.WaitingForAdd:
|
|
if (addRequest.IsCompleted)
|
|
{
|
|
if (addRequest.Error != null || addRequest.Status == UnityEditor.PackageManager.StatusCode.Failure)
|
|
{
|
|
updateState = PackageStates.Failed;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
//if the package manager says we added it then confirm that with the list
|
|
listRequest = UnityEditor.PackageManager.Client.List(true);
|
|
updateState = PackageStates.WaitingForAddConfirm;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (addingPackageTimeTotal.Elapsed.TotalSeconds > estimatedTimeToInstall)
|
|
{
|
|
if (addTryCount == 1)
|
|
estimatedTimeToInstall *= 2; //give us more time to retry
|
|
else
|
|
updateState = PackageStates.Failed;
|
|
}
|
|
|
|
string dialogText;
|
|
if (addTryCount == 1)
|
|
dialogText = "Installing OpenVR from Unity Package Manager...";
|
|
else
|
|
dialogText = "Retrying OpenVR install from Unity Package Manager...";
|
|
|
|
bool cancel = UnityEditor.EditorUtility.DisplayCancelableProgressBar("SteamVR", dialogText, (float)addingPackageTimeTotal.Elapsed.TotalSeconds / estimatedTimeToInstall);
|
|
if (cancel)
|
|
updateState = PackageStates.Failed;
|
|
|
|
if (addingPackageTime.Elapsed.TotalSeconds > 10)
|
|
{
|
|
Debug.Log("<b>[SteamVR Setup]</b> Waiting for package manager to install OpenVR package...");
|
|
addingPackageTime.Stop();
|
|
addingPackageTime.Reset();
|
|
addingPackageTime.Start();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PackageStates.WaitingForAddConfirm:
|
|
if (listRequest.IsCompleted)
|
|
{
|
|
if (listRequest.Error != null)
|
|
{
|
|
updateState = PackageStates.Failed;
|
|
break;
|
|
}
|
|
string packageName = unityOpenVRPackageString;
|
|
|
|
bool hasPackage = listRequest.Result.Any(package => package.name == packageName);
|
|
|
|
if (hasPackage == false)
|
|
{
|
|
if (addTryCount == 1)
|
|
{
|
|
addRequest = UnityEditor.PackageManager.Client.Add(packageName);
|
|
updateState = PackageStates.WaitingForAdd;
|
|
addTryCount++;
|
|
|
|
Debug.Log("<b>[SteamVR Setup]</b> Retrying OpenVR package install...");
|
|
}
|
|
else
|
|
{
|
|
updateState = PackageStates.Failed;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
updateState = PackageStates.Installed; //installed successfully
|
|
|
|
Debug.Log("<b>[SteamVR Setup]</b> Successfully installed OpenVR Desktop package.");
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PackageStates.Installed:
|
|
UnityEditor.BuildTargetGroup currentTarget = UnityEditor.EditorUserBuildSettings.selectedBuildTargetGroup;
|
|
|
|
string[] devices = UnityEditorInternal.VR.VREditor.GetVREnabledDevicesOnTargetGroup(currentTarget);
|
|
|
|
bool hasOpenVR = false;
|
|
bool isFirst = false;
|
|
|
|
if (devices.Length != 0)
|
|
{
|
|
int index = Array.FindIndex(devices, device => string.Equals(device, openVRString, System.StringComparison.CurrentCultureIgnoreCase));
|
|
hasOpenVR = index != -1;
|
|
isFirst = index == 0;
|
|
}
|
|
|
|
//list openvr as the first option if it was in the list already
|
|
List<string> devicesList = new List<string>(devices);
|
|
if (isFirst == false)
|
|
{
|
|
if (hasOpenVR == true)
|
|
devicesList.Remove(openVRString);
|
|
|
|
devicesList.Insert(0, openVRString);
|
|
string[] newDevices = devicesList.ToArray();
|
|
|
|
UnityEditorInternal.VR.VREditor.SetVREnabledDevicesOnTargetGroup(currentTarget, newDevices);
|
|
Debug.Log("<b>[SteamVR Setup]</b> Added OpenVR to supported VR SDKs list.");
|
|
}
|
|
|
|
End();
|
|
break;
|
|
|
|
case PackageStates.Failed:
|
|
End();
|
|
|
|
string failtext = "The Unity Package Manager failed to automatically install the OpenVR Desktop package. Please open the Package Manager Window and try to install it manually.";
|
|
UnityEditor.EditorUtility.DisplayDialog("SteamVR", failtext, "Ok");
|
|
Debug.Log("<b>[SteamVR Setup]</b> " + failtext);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif |