/// <summary> /// Searches through all ScriptableObject instances and refreshes any SceneInfo fields found. /// </summary> private static void RefreshSceneInfoFieldsInScriptableObjects() { if (Time.frameCount == frameScriptableObjectsLastUpdated && !BuildPipeline.isBuildingPlayer) { // Don't update more than once per frame unless we're building return; } try { foreach (ScriptableObject source in ScriptableObjectExtensions.GetAllInstances <ScriptableObject>()) { foreach (FieldInfo fieldInfo in source.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (fieldTypesToSearch.Contains(fieldInfo.FieldType)) { CheckForChangesInField(source, fieldInfo); } } } frameScriptableObjectsLastUpdated = Time.frameCount; } catch (Exception) { Debug.LogWarning("Error when attempting to update scene info fields. Scene info data may be stale."); } }
/// <summary> /// Searches through all ScriptableObject instances and refreshes any SceneInfo fields found. /// </summary> private static void RefreshSceneInfoFieldsInScriptableObjects() { if (Time.frameCount == frameScriptableObjectsLastUpdated) { // Don't udpate more than once per frame return; } try { foreach (ScriptableObject source in ScriptableObjectExtensions.GetAllInstances <ScriptableObject>()) { foreach (FieldInfo fieldInfo in source.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (fieldInfo.FieldType == typeof(SceneInfo)) { SerializedObject serializedObject = new SerializedObject(source); SerializedProperty property = serializedObject.FindProperty(fieldInfo.Name); SerializedProperty assetProperty, nameProperty, pathProperty, buildIndexProperty, includedProperty, tagProperty; GetSceneInfoRelativeProperties(property, out assetProperty, out nameProperty, out pathProperty, out buildIndexProperty, out includedProperty, out tagProperty); if (RefreshSceneInfo(source, nameProperty, pathProperty, buildIndexProperty, includedProperty, tagProperty)) { serializedObject.ApplyModifiedProperties(); } } } } frameScriptableObjectsLastUpdated = Time.frameCount; } catch (Exception) { Debug.LogWarning("Error when attempting to update scene info fields. Scene info data may be stale."); } }
/// <summary> /// Given a service type, finds all sub-classes of BaseMixedRealityProfile that are /// designed to configure that service. /// </summary> private static IReadOnlyCollection <Type> GetProfileTypesForService(Type serviceType) { if (serviceType == null) { return(Array.Empty <Type>()); } // This is a little inefficient in that it has to enumerate all of the mixed reality // profiles in order to make this enumeration. It would be possible to cache the results // of this, but then it would be necessary to listen to file/asset creation/destruction // events in order to refresh the cache. If this ends up being a perf bottleneck // in inspectors this would be one possible way to alleviate the issue. HashSet <Type> allTypes = new HashSet <Type>(); BaseMixedRealityProfile[] allProfiles = ScriptableObjectExtensions.GetAllInstances <BaseMixedRealityProfile>(); for (int i = 0; i < allProfiles.Length; i++) { BaseMixedRealityProfile profile = allProfiles[i]; if (IsProfileForService(profile.GetType(), serviceType)) { allTypes.Add(profile.GetType()); } } return(allTypes.ToReadOnlyCollection()); }
public override void OnInspectorGUI() { MixedRealityToolkit instance = (MixedRealityToolkit)target; if (MixedRealityToolkit.Instance == null && instance.isActiveAndEnabled) { // See if an active instance exists at all. If it doesn't register this instance preemptively. MixedRealityToolkit.SetActiveInstance(instance); } if (!instance.IsActiveInstance) { EditorGUILayout.HelpBox("This instance of the toolkit is inactive. There can only be one active instance loaded at any time.", MessageType.Warning); using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Select Active Instance")) { UnityEditor.Selection.activeGameObject = MixedRealityToolkit.Instance.gameObject; } if (GUILayout.Button("Make this the Active Instance")) { MixedRealityToolkit.SetActiveInstance(instance); } } return; } serializedObject.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(activeProfile); bool changed = EditorGUI.EndChangeCheck(); string commandName = Event.current.commandName; // If not profile is assigned, then warn user if (activeProfile.objectReferenceValue == null) { EditorGUILayout.HelpBox("MixedRealityToolkit cannot initialize unless an Active Profile is assigned!", MessageType.Error); if (GUILayout.Button("Assign MixedRealityToolkit Profile") || forceShowProfilePicker) { forceShowProfilePicker = false; var allConfigProfiles = ScriptableObjectExtensions.GetAllInstances <MixedRealityToolkitConfigurationProfile>(); // Shows the list of MixedRealityToolkitConfigurationProfiles in our project, // selecting the default profile by default (if it exists). if (allConfigProfiles.Length > 0) { currentPickerWindow = GUIUtility.GetControlID(FocusType.Passive); var defaultMRTKProfile = MixedRealityInspectorUtility.GetDefaultConfigProfile(allConfigProfiles); activeProfile.objectReferenceValue = defaultMRTKProfile; EditorGUIUtility.ShowObjectPicker <MixedRealityToolkitConfigurationProfile>(defaultMRTKProfile, false, string.Empty, currentPickerWindow); } else { if (EditorUtility.DisplayDialog("Attention!", "No profiles were found for the Mixed Reality Toolkit.\n\n" + "Would you like to create one now?", "OK", "Later")) { ScriptableObject profile = CreateInstance(nameof(MixedRealityToolkitConfigurationProfile)); profile.CreateAsset("Assets/MixedRealityToolkit.Generated/CustomProfiles"); activeProfile.objectReferenceValue = profile; EditorGUIUtility.PingObject(profile); } } } } // If user selects a new MRTK Active Profile, then update configuration if (EditorGUIUtility.GetObjectPickerControlID() == currentPickerWindow) { switch (commandName) { case "ObjectSelectorUpdated": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); changed = true; break; case "ObjectSelectorClosed": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); currentPickerWindow = -1; changed = true; break; } } serializedObject.ApplyModifiedProperties(); if (changed) { MixedRealityToolkit.Instance.ResetConfiguration((MixedRealityToolkitConfigurationProfile)activeProfile.objectReferenceValue); } if (activeProfile.objectReferenceValue != null) { UnityEditor.Editor activeProfileEditor = CreateEditor(activeProfile.objectReferenceValue); activeProfileEditor.OnInspectorGUI(); } }
public override void OnInspectorGUI() { serializedObject.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(activeProfile); bool changed = EditorGUI.EndChangeCheck(); string commandName = Event.current.commandName; var allConfigProfiles = ScriptableObjectExtensions.GetAllInstances <MixedRealityToolkitConfigurationProfile>(); if (activeProfile.objectReferenceValue == null && currentPickerWindow == -1 && checkChange) { if (allConfigProfiles.Length > 1) { EditorUtility.DisplayDialog("Attention!", "You must choose a profile for the Mixed Reality Toolkit.", "OK"); currentPickerWindow = GUIUtility.GetControlID(FocusType.Passive); EditorGUIUtility.ShowObjectPicker <MixedRealityToolkitConfigurationProfile>(null, false, string.Empty, currentPickerWindow); } else if (allConfigProfiles.Length == 1) { activeProfile.objectReferenceValue = allConfigProfiles[0]; changed = true; Selection.activeObject = allConfigProfiles[0]; EditorGUIUtility.PingObject(allConfigProfiles[0]); } else { if (EditorUtility.DisplayDialog("Attention!", "No profiles were found for the Mixed Reality Toolkit.\n\n" + "Would you like to create one now?", "OK", "Later")) { ScriptableObject profile = CreateInstance(nameof(MixedRealityToolkitConfigurationProfile)); profile.CreateAsset("Assets/MixedRealityToolkit.Generated/CustomProfiles"); activeProfile.objectReferenceValue = profile; Selection.activeObject = profile; EditorGUIUtility.PingObject(profile); } } checkChange = false; } if (EditorGUIUtility.GetObjectPickerControlID() == currentPickerWindow) { switch (commandName) { case "ObjectSelectorUpdated": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); changed = true; break; case "ObjectSelectorClosed": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); currentPickerWindow = -1; changed = true; Selection.activeObject = activeProfile.objectReferenceValue; EditorGUIUtility.PingObject(activeProfile.objectReferenceValue); break; } } serializedObject.ApplyModifiedProperties(); if (changed) { MixedRealityToolkit.Instance.ResetConfiguration((MixedRealityToolkitConfigurationProfile)activeProfile.objectReferenceValue); } if (activeProfile.objectReferenceValue != null) { UnityEditor.Editor activeProfileEditor = CreateEditor(activeProfile.objectReferenceValue); activeProfileEditor.OnInspectorGUI(); } }
public override void OnInspectorGUI() { MixedRealityToolkit instance = (MixedRealityToolkit)target; if (MixedRealityToolkit.Instance == null) { // See if an active instance exists at all. If it doesn't register this instance pre-emptively. MixedRealityToolkit.SetActiveInstance(instance); } if (!instance.IsActiveInstance) { EditorGUILayout.HelpBox("This instance of the toolkt is inactive. There can only be one active instance loaded at any time.", MessageType.Warning); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Select Active Instance")) { UnityEditor.Selection.activeGameObject = MixedRealityToolkit.Instance.gameObject; } if (GUILayout.Button("Make this the Active Instance")) { MixedRealityToolkit.SetActiveInstance(instance); } EditorGUILayout.EndHorizontal(); return; } serializedObject.Update(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(activeProfile); bool changed = EditorGUI.EndChangeCheck(); string commandName = Event.current.commandName; var allConfigProfiles = ScriptableObjectExtensions.GetAllInstances <MixedRealityToolkitConfigurationProfile>(); if (activeProfile.objectReferenceValue == null && currentPickerWindow == -1 && checkChange && !BuildPipeline.isBuildingPlayer) { if (allConfigProfiles.Length > 1) { EditorUtility.DisplayDialog("Attention!", "You must choose a profile for the Mixed Reality Toolkit.", "OK"); currentPickerWindow = GUIUtility.GetControlID(FocusType.Passive); // Shows the list of MixedRealityToolkitConfigurationProfiles in our project, // selecting the default profile by default (if it exists). EditorGUIUtility.ShowObjectPicker <MixedRealityToolkitConfigurationProfile>(GetDefaultProfile(allConfigProfiles), false, string.Empty, currentPickerWindow); } else if (allConfigProfiles.Length == 1) { activeProfile.objectReferenceValue = allConfigProfiles[0]; changed = true; Selection.activeObject = allConfigProfiles[0]; EditorGUIUtility.PingObject(allConfigProfiles[0]); } else { if (EditorUtility.DisplayDialog("Attention!", "No profiles were found for the Mixed Reality Toolkit.\n\n" + "Would you like to create one now?", "OK", "Later")) { ScriptableObject profile = CreateInstance(nameof(MixedRealityToolkitConfigurationProfile)); profile.CreateAsset("Assets/MixedRealityToolkit.Generated/CustomProfiles"); activeProfile.objectReferenceValue = profile; Selection.activeObject = profile; EditorGUIUtility.PingObject(profile); } } checkChange = false; } if (EditorGUIUtility.GetObjectPickerControlID() == currentPickerWindow) { switch (commandName) { case "ObjectSelectorUpdated": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); changed = true; break; case "ObjectSelectorClosed": activeProfile.objectReferenceValue = EditorGUIUtility.GetObjectPickerObject(); currentPickerWindow = -1; changed = true; Selection.activeObject = activeProfile.objectReferenceValue; EditorGUIUtility.PingObject(activeProfile.objectReferenceValue); break; } } serializedObject.ApplyModifiedProperties(); if (changed) { MixedRealityToolkit.Instance.ResetConfiguration((MixedRealityToolkitConfigurationProfile)activeProfile.objectReferenceValue); } if (activeProfile.objectReferenceValue != null) { UnityEditor.Editor activeProfileEditor = CreateEditor(activeProfile.objectReferenceValue); activeProfileEditor.OnInspectorGUI(); } }