2021년 4학년 1학기 기업연계프로젝트2 컴퓨터소프트웨어공학과 <원광투어팀> 팀장 : 송유진 팀원 : 김나영, 이경희, 한유진
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
10 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using System.IO;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEditor;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text.RegularExpressions;
  9. using System.Reflection;
  10. #if VIU_XR_GENERAL_SETTINGS
  11. using UnityEditor.XR.Management;
  12. using UnityEngine.XR.Management;
  13. #endif
  14. namespace HTC.UnityPlugin.Vive
  15. {
  16. public static class XRPluginManagementUtils
  17. {
  18. public static bool IsXRLoaderEnabled(string loaderName, BuildTargetGroup buildTargetGroup)
  19. {
  20. #if VIU_XR_GENERAL_SETTINGS
  21. XRGeneralSettings xrSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup);
  22. if (!xrSettings)
  23. {
  24. return false;
  25. }
  26. if (!xrSettings.AssignedSettings)
  27. {
  28. return false;
  29. }
  30. foreach (XRLoader loader in xrSettings.AssignedSettings.loaders)
  31. {
  32. if (loader.name == loaderName)
  33. {
  34. return true;
  35. }
  36. }
  37. #endif
  38. return false;
  39. }
  40. public static bool IsAnyXRLoaderEnabled(BuildTargetGroup buildTargetGroup)
  41. {
  42. #if VIU_XR_GENERAL_SETTINGS
  43. XRGeneralSettings xrSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup);
  44. if (!xrSettings)
  45. {
  46. return false;
  47. }
  48. if (!xrSettings.AssignedSettings)
  49. {
  50. return false;
  51. }
  52. return xrSettings.AssignedSettings.loaders.Count > 0;
  53. #else
  54. return false;
  55. #endif
  56. }
  57. public static void SetXRLoaderEnabled(string loaderClassName, BuildTargetGroup buildTargetGroup, bool enabled)
  58. {
  59. #if VIU_XR_GENERAL_SETTINGS
  60. MethodInfo method = Type.GetType("UnityEditor.XR.Management.XRSettingsManager, Unity.XR.Management.Editor")
  61. .GetProperty("currentSettings", BindingFlags.NonPublic | BindingFlags.Static).GetGetMethod(true);
  62. XRGeneralSettingsPerBuildTarget generalSettings = (XRGeneralSettingsPerBuildTarget)method.Invoke(null, new object[]{});
  63. XRGeneralSettings xrSettings = generalSettings.SettingsForBuildTarget(buildTargetGroup);
  64. if (xrSettings == null)
  65. {
  66. xrSettings = ScriptableObject.CreateInstance<XRGeneralSettings>() as XRGeneralSettings;
  67. generalSettings.SetSettingsForBuildTarget(buildTargetGroup, xrSettings);
  68. xrSettings.name = $"{buildTargetGroup.ToString()} Settings";
  69. AssetDatabase.AddObjectToAsset(xrSettings, AssetDatabase.GetAssetOrScenePath(generalSettings));
  70. }
  71. var serializedSettingsObject = new SerializedObject(xrSettings);
  72. SerializedProperty loaderProp = serializedSettingsObject.FindProperty("m_LoaderManagerInstance");
  73. if (loaderProp.objectReferenceValue == null)
  74. {
  75. var xrManagerSettings = ScriptableObject.CreateInstance<XRManagerSettings>() as XRManagerSettings;
  76. xrManagerSettings.name = $"{buildTargetGroup.ToString()} Providers";
  77. AssetDatabase.AddObjectToAsset(xrManagerSettings, AssetDatabase.GetAssetOrScenePath(generalSettings));
  78. loaderProp.objectReferenceValue = xrManagerSettings;
  79. serializedSettingsObject.ApplyModifiedProperties();
  80. }
  81. if (enabled)
  82. {
  83. #if VIU_XR_PACKAGE_METADATA_STORE
  84. if (!UnityEditor.XR.Management.Metadata.XRPackageMetadataStore.AssignLoader(xrSettings.AssignedSettings, loaderClassName, buildTargetGroup))
  85. {
  86. Debug.LogWarning("Failed to assign XR loader: " + loaderClassName);
  87. }
  88. #else
  89. if (!AssignLoader(xrSettings.AssignedSettings, loaderClassName))
  90. {
  91. Debug.LogWarning("Failed to assign XR loader: " + loaderClassName);
  92. }
  93. #endif
  94. }
  95. else
  96. {
  97. #if VIU_XR_PACKAGE_METADATA_STORE
  98. if (!UnityEditor.XR.Management.Metadata.XRPackageMetadataStore.RemoveLoader(xrSettings.AssignedSettings, loaderClassName, buildTargetGroup))
  99. {
  100. Debug.LogWarning("Failed to remove XR loader: " + loaderClassName);
  101. }
  102. #else
  103. if (!RemoveLoader(xrSettings.AssignedSettings, loaderClassName))
  104. {
  105. Debug.LogWarning("Failed to remove XR loader: " + loaderClassName);
  106. }
  107. #endif
  108. }
  109. #endif
  110. }
  111. #if VIU_XR_GENERAL_SETTINGS
  112. private static readonly string[] s_loaderBlockList = { "DummyLoader", "SampleLoader", "XRLoaderHelper" };
  113. private static bool AssignLoader(XRManagerSettings settings, string loaderTypeName)
  114. {
  115. var instance = GetInstanceOfTypeWithNameFromAssetDatabase(loaderTypeName);
  116. if (instance == null || !(instance is XRLoader))
  117. {
  118. instance = CreateScriptableObjectInstance(loaderTypeName, GetAssetPathForComponents(new string[] {"XR", "Loaders"}));
  119. if (instance == null)
  120. return false;
  121. }
  122. List<XRLoader> assignedLoaders = new List<XRLoader>(settings.loaders);
  123. XRLoader newLoader = instance as XRLoader;
  124. if (!assignedLoaders.Contains(newLoader))
  125. {
  126. assignedLoaders.Add(newLoader);
  127. settings.loaders.Clear();
  128. List<string> allLoaderTypeNames = GetAllLoaderTypeNames();
  129. foreach (var typeName in allLoaderTypeNames)
  130. {
  131. var newInstance = GetInstanceOfTypeWithNameFromAssetDatabase(typeName) as XRLoader;
  132. if (newInstance != null && assignedLoaders.Contains(newInstance))
  133. {
  134. settings.loaders.Add(newInstance);
  135. }
  136. }
  137. EditorUtility.SetDirty(settings);
  138. AssetDatabase.SaveAssets();
  139. }
  140. return true;
  141. }
  142. private static bool RemoveLoader(XRManagerSettings settings, string loaderTypeName)
  143. {
  144. var instance = GetInstanceOfTypeWithNameFromAssetDatabase(loaderTypeName);
  145. if (instance == null || !(instance is XRLoader))
  146. return false;
  147. XRLoader loader = instance as XRLoader;
  148. if (settings.loaders.Contains(loader))
  149. {
  150. settings.loaders.Remove(loader);
  151. EditorUtility.SetDirty(settings);
  152. AssetDatabase.SaveAssets();
  153. }
  154. return true;
  155. }
  156. private static ScriptableObject GetInstanceOfTypeWithNameFromAssetDatabase(string typeName)
  157. {
  158. string[] assetGUIDs = AssetDatabase.FindAssets(string.Format("t:{0}", typeName));
  159. if (assetGUIDs.Any())
  160. {
  161. string assetPath = AssetDatabase.GUIDToAssetPath(assetGUIDs[0]);
  162. UnityEngine.Object asset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(ScriptableObject));
  163. return asset as ScriptableObject;
  164. }
  165. return null;
  166. }
  167. private static ScriptableObject CreateScriptableObjectInstance(string typeName, string path)
  168. {
  169. ScriptableObject obj = ScriptableObject.CreateInstance(typeName) as ScriptableObject;
  170. if (obj != null)
  171. {
  172. if (!string.IsNullOrEmpty(path))
  173. {
  174. string fileName = string.Format("{0}.asset", TypeNameToString(typeName));
  175. string targetPath = Path.Combine(path, fileName);
  176. AssetDatabase.CreateAsset(obj, targetPath);
  177. return obj;
  178. }
  179. }
  180. Debug.LogError($"We were unable to create an instance of the requested type {typeName}. Please make sure that all packages are updated to support this version of XR Plug-In Management. See the Unity documentation for XR Plug-In Management for information on resolving this issue.");
  181. return null;
  182. }
  183. private static string GetAssetPathForComponents(string[] pathComponents, string root = "Assets")
  184. {
  185. if (pathComponents.Length <= 0)
  186. return null;
  187. string path = root;
  188. foreach( var pc in pathComponents)
  189. {
  190. string subFolder = Path.Combine(path, pc);
  191. bool shouldCreate = true;
  192. foreach (var f in AssetDatabase.GetSubFolders(path))
  193. {
  194. if (string.Compare(Path.GetFullPath(f), Path.GetFullPath(subFolder), true) == 0)
  195. {
  196. shouldCreate = false;
  197. break;
  198. }
  199. }
  200. if (shouldCreate)
  201. AssetDatabase.CreateFolder(path, pc);
  202. path = subFolder;
  203. }
  204. return path;
  205. }
  206. private static string TypeNameToString(Type type)
  207. {
  208. return type == null ? "" : TypeNameToString(type.FullName);
  209. }
  210. private static string TypeNameToString(string type)
  211. {
  212. string[] typeParts = type.Split(new char[] { '.' });
  213. if (!typeParts.Any())
  214. return String.Empty;
  215. string[] words = Regex.Matches(typeParts.Last(), "(^[a-z]+|[A-Z]+(?![a-z])|[A-Z][a-z]+)")
  216. .OfType<Match>()
  217. .Select(m => m.Value)
  218. .ToArray();
  219. return string.Join(" ", words);
  220. }
  221. private static List<string> GetAllLoaderTypeNames()
  222. {
  223. List<string> loaderTypeNames = new List<string>();
  224. var loaderTypes = TypeCache.GetTypesDerivedFrom(typeof(XRLoader));
  225. foreach (Type loaderType in loaderTypes)
  226. {
  227. if (loaderType.IsAbstract)
  228. continue;
  229. if (s_loaderBlockList.Contains(loaderType.Name))
  230. continue;
  231. loaderTypeNames.Add(loaderType.Name);
  232. }
  233. return loaderTypeNames;
  234. }
  235. #endif
  236. }
  237. }