112 lines
4.1 KiB
C#
112 lines
4.1 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using Microsoft.MixedReality.Toolkit.Utilities.Editor;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Microsoft.MixedReality.Toolkit.Editor
|
|
{
|
|
[CustomEditor(typeof(MixedRealityToolkit))]
|
|
public class MixedRealityToolkitInspector : UnityEditor.Editor
|
|
{
|
|
private SerializedProperty activeProfile;
|
|
private UnityEditor.Editor activeProfileEditor;
|
|
private Object cachedProfile;
|
|
|
|
private void OnEnable()
|
|
{
|
|
activeProfile = serializedObject.FindProperty("activeProfile");
|
|
cachedProfile = activeProfile.objectReferenceValue;
|
|
}
|
|
|
|
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"))
|
|
{
|
|
Selection.activeGameObject = MixedRealityToolkit.Instance.gameObject;
|
|
}
|
|
|
|
if (GUILayout.Button("Make this the Active Instance"))
|
|
{
|
|
MixedRealityToolkit.SetActiveInstance(instance);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
serializedObject.Update();
|
|
|
|
// If no profile is assigned, then warn user
|
|
if (activeProfile.objectReferenceValue == null)
|
|
{
|
|
EditorGUILayout.HelpBox("MixedRealityToolkit cannot initialize unless an Active Profile is assigned!", MessageType.Error);
|
|
}
|
|
|
|
bool changed = MixedRealityInspectorUtility.DrawProfileDropDownList(activeProfile, null, activeProfile.objectReferenceValue, typeof(MixedRealityToolkitConfigurationProfile), false, false) ||
|
|
cachedProfile != activeProfile.objectReferenceValue;
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
if (changed)
|
|
{
|
|
TryResetConfiguration();
|
|
}
|
|
|
|
if (activeProfile.objectReferenceValue != null && activeProfileEditor == null)
|
|
{
|
|
// For the configuration profile, show the default inspector GUI
|
|
activeProfileEditor = CreateEditor(activeProfile.objectReferenceValue);
|
|
}
|
|
|
|
if (activeProfileEditor != null)
|
|
{
|
|
activeProfileEditor.OnInspectorGUI();
|
|
}
|
|
}
|
|
|
|
private void TryResetConfiguration()
|
|
{
|
|
var newProfile = (MixedRealityToolkitConfigurationProfile)activeProfile.objectReferenceValue;
|
|
try
|
|
{
|
|
if (!Application.isPlaying)
|
|
{
|
|
MixedRealityToolkit.Instance.ResetConfiguration(newProfile);
|
|
}
|
|
else
|
|
{
|
|
MixedRealityToolkit.Instance.ActiveProfile = newProfile;
|
|
}
|
|
|
|
activeProfileEditor = null;
|
|
cachedProfile = activeProfile.objectReferenceValue;
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
Debug.LogError($"Failed to switch MRTK profile to {newProfile?.name}:\n{e}");
|
|
}
|
|
}
|
|
|
|
[MenuItem("Mixed Reality/Toolkit/Add to Scene and Configure...")]
|
|
public static void CreateMixedRealityToolkitGameObject()
|
|
{
|
|
MixedRealityInspectorUtility.AddMixedRealityToolkitToScene();
|
|
Selection.activeObject = MixedRealityToolkit.Instance;
|
|
EditorGUIUtility.PingObject(MixedRealityToolkit.Instance);
|
|
}
|
|
}
|
|
}
|