using System; using System.Linq; using System.Reflection; using System.Text; using UnityEditor; using UnityEditorInternal; using UnityEditorInternal.VR; using UnityEngine; namespace VRTK { public sealed class VRTK_SupportInfoWindow : EditorWindow { private const string Separator = " "; private readonly StringBuilder stringBuilder = new StringBuilder(); private int section; private Vector2 scrollPosition; [MenuItem("Window/VRTK/Support Info")] public static void ShowWindow() { GetWindow(true, "VRTK Support Info").RefreshData(); } private void OnGUI() { GUIContent buttonContent = new GUIContent("Copy to clipboard"); minSize = Vector2.Max(minSize, GUI.skin.button.CalcSize(buttonContent) + new Vector2(10, 0)); using (EditorGUILayout.ScrollViewScope scrollViewScope = new EditorGUILayout.ScrollViewScope(scrollPosition)) { scrollPosition = scrollViewScope.scrollPosition; using (new EditorGUILayout.VerticalScope(EditorStyles.textArea)) { EditorGUILayout.LabelField( stringBuilder.ToString(), new GUIStyle(EditorStyles.label) { wordWrap = true }, GUILayout.ExpandHeight(true) ); } } if (GUILayout.Button(buttonContent)) { EditorGUIUtility.systemCopyBuffer = stringBuilder.ToString(); } } private void RefreshData() { stringBuilder.Length = 0; Assembly editorAssembly = typeof(VRTK_SDKManagerEditor).Assembly; Assembly assembly = typeof(VRTK_SDKManager).Assembly; Append( "Versions", () => { Append("Unity", InternalEditorUtility.GetFullUnityVersion()); Append("VRTK", VRTK_Defines.CurrentVersion + " (may not be correct if source is GitHub)"); Type steamVRUpdateType = editorAssembly.GetType("SteamVR_Update"); if (steamVRUpdateType != null) { FieldInfo currentVersionField = steamVRUpdateType.GetField("currentVersion", BindingFlags.NonPublic | BindingFlags.Static); if (currentVersionField != null) { string currentVersion = (string)currentVersionField.GetValue(null); Append("SteamVR", currentVersion); } } Type ovrPluginType = assembly.GetType("OVRPlugin"); if (ovrPluginType != null) { Append( "OVRPlugin (Oculus Utilities)", () => { FieldInfo wrapperVersionField = ovrPluginType.GetField("wrapperVersion", BindingFlags.Public | BindingFlags.Static); if (wrapperVersionField != null) { Version wrapperVersion = (Version)wrapperVersionField.GetValue(null); Append("wrapperVersion", wrapperVersion); } PropertyInfo versionField = ovrPluginType.GetProperty("version", BindingFlags.Public | BindingFlags.Static); if (versionField != null) { Version version = (Version)versionField.GetGetMethod().Invoke(null, null); Append("version", version); } PropertyInfo nativeSDKVersionField = ovrPluginType.GetProperty("nativeSDKVersion", BindingFlags.Public | BindingFlags.Static); if (nativeSDKVersionField != null) { Version nativeSDKVersion = (Version)nativeSDKVersionField.GetGetMethod().Invoke(null, null); Append("nativeSDKVersion", nativeSDKVersion); } } ); } } ); Append( "VR Settings", () => { foreach (BuildTargetGroup targetGroup in VRTK_SharedMethods.GetValidBuildTargetGroups()) { bool isVREnabled; #if UNITY_5_5_OR_NEWER isVREnabled = VREditor.GetVREnabledOnTargetGroup(targetGroup); #else isVREnabled = VREditor.GetVREnabled(targetGroup); #endif if (!isVREnabled) { continue; } string[] vrEnabledDevices; #if UNITY_5_5_OR_NEWER vrEnabledDevices = VREditor.GetVREnabledDevicesOnTargetGroup(targetGroup); #else vrEnabledDevices = VREditor.GetVREnabledDevices(targetGroup); #endif Append(targetGroup, string.Join(", ", vrEnabledDevices)); } } ); Append( "Scripting Define Symbols", () => { foreach (BuildTargetGroup targetGroup in VRTK_SharedMethods.GetValidBuildTargetGroups()) { string symbols = string.Join( ";", PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup) .Split(';') .Where(symbol => !symbol.StartsWith(VRTK_Defines.VersionScriptingDefineSymbolPrefix, StringComparison.Ordinal)) .ToArray()); if (!string.IsNullOrEmpty(symbols)) { Append(targetGroup, symbols); } } } ); stringBuilder.Length--; } private void Append(string value, Action sectionContentAction = null) { for (int index = 0; index < section; index++) { stringBuilder.Append(Separator); } stringBuilder.AppendLine(value); if (sectionContentAction != null) { section++; sectionContentAction(); section--; } } private void Append(object tag, object value) { Append(string.Format("{0}: {1}", tag, value)); } } }