Skip to content

Commit 193c0a7

Browse files
Troy-Ferrellkeveleigh
authored andcommitted
Merge pull request #7199 from Troy-Ferrell/users/trferrel/configurator-buildtarget-fix
Harden MRTK Project Configurator
1 parent c3127d8 commit 193c0a7

File tree

2 files changed

+96
-27
lines changed

2 files changed

+96
-27
lines changed

Assets/MixedRealityToolkit/Inspectors/Setup/MixedRealityProjectConfiguratorWindow.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,32 @@ private void OnGUI()
9292
{
9393
MixedRealityInspectorUtility.RenderMixedRealityToolkitLogo();
9494

95-
RenderChoiceDialog();
95+
if (!MixedRealityProjectConfigurator.IsProjectConfigured())
96+
{
97+
RenderChoiceDialog();
9698

97-
EditorGUILayout.Space();
99+
EditorGUILayout.Space();
98100

99-
showConfigurations = EditorGUILayout.Foldout(showConfigurations, "Modify Configurations", true);
100-
if (showConfigurations)
101+
showConfigurations = EditorGUILayout.Foldout(showConfigurations, "Modify Configurations", true);
102+
if (showConfigurations)
103+
{
104+
RenderConfigurations();
105+
}
106+
}
107+
else
101108
{
102-
RenderConfigurations();
109+
RenderConfiguredConfirmation();
103110
}
104111
}
105112

113+
private void RenderConfiguredConfirmation()
114+
{
115+
const string dialogTitle = "Project Configuration Complete";
116+
const string dialogContent = "This Unity project is properly configured for the Mixed Reality Toolkit.";
117+
EditorGUILayout.LabelField(dialogTitle, EditorStyles.boldLabel);
118+
EditorGUILayout.LabelField(dialogContent);
119+
}
120+
106121
private void RenderChoiceDialog()
107122
{
108123
const string dialogTitle = "Apply Default Settings?";

Assets/MixedRealityToolkit/Utilities/Editor/Setup/MixedRealityProjectConfigurator.cs

Lines changed: 76 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,46 +52,91 @@ public enum Configurations
5252
IOSCameraUsageDescription,
5353
};
5454

55+
private class ConfigGetter
56+
{
57+
/// <summary>
58+
/// Array of build targets where the get action is valid
59+
/// </summary>
60+
public BuildTarget[] ValidTargets;
61+
62+
/// <summary>
63+
/// Action to perform to determine if the current configuration is correctly enabled
64+
/// </summary>
65+
public Func<bool> GetAction;
66+
67+
public ConfigGetter(Func<bool> get, BuildTarget target = BuildTarget.NoTarget)
68+
{
69+
GetAction = get;
70+
ValidTargets = new BuildTarget[] { target };
71+
}
72+
73+
public ConfigGetter(Func<bool> get, BuildTarget[] targets)
74+
{
75+
GetAction = get;
76+
ValidTargets = targets;
77+
}
78+
79+
/// <summary>
80+
/// Returns true if the active build target is contained in the ValidTargets list or the list contains a BuildTarget.NoTarget entry, false otherwise
81+
/// </summary>
82+
public bool IsActiveBuildTargetValid()
83+
{
84+
foreach (var buildTarget in ValidTargets)
85+
{
86+
if (buildTarget == BuildTarget.NoTarget || buildTarget == EditorUserBuildSettings.activeBuildTarget)
87+
{
88+
return true;
89+
}
90+
}
91+
92+
return false;
93+
}
94+
}
95+
5596
// The check functions for each type of setting
56-
private static readonly Dictionary<Configurations, Func<bool>> ConfigurationGetters = new Dictionary<Configurations, Func<bool>>()
97+
private static readonly Dictionary<Configurations, ConfigGetter> ConfigurationGetters = new Dictionary<Configurations, ConfigGetter>()
5798
{
58-
{ Configurations.LatestScriptingRuntime, () => { return IsLatestScriptingRuntime(); } },
59-
{ Configurations.ForceTextSerialization, () => { return IsForceTextSerialization(); } },
60-
{ Configurations.VisibleMetaFiles, () => { return IsVisibleMetaFiles(); } },
99+
{ Configurations.LatestScriptingRuntime, new ConfigGetter(() => { return IsLatestScriptingRuntime(); }) },
100+
{ Configurations.ForceTextSerialization, new ConfigGetter(() => { return IsForceTextSerialization(); }) },
101+
{ Configurations.VisibleMetaFiles, new ConfigGetter(() => { return IsVisibleMetaFiles(); }) },
61102
// Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms
62103
// with legacy requirements.
63104
#pragma warning disable 0618
64-
{ Configurations.VirtualRealitySupported, () => { return PlayerSettings.virtualRealitySupported; } },
105+
{ Configurations.VirtualRealitySupported, new ConfigGetter(() => { return PlayerSettings.virtualRealitySupported; }) },
65106
#pragma warning restore 0618
66-
{ Configurations.SinglePassInstancing, () => { return MixedRealityOptimizeUtils.IsSinglePassInstanced(); } },
67-
{ Configurations.SpatialAwarenessLayer, () => { return HasSpatialAwarenessLayer(); } },
68-
{ Configurations.EnableMSBuildForUnity, () => { return IsMSBuildForUnityEnabled(); } },
107+
{ Configurations.SinglePassInstancing, new ConfigGetter(() => { return MixedRealityOptimizeUtils.IsSinglePassInstanced(); }) },
108+
{ Configurations.SpatialAwarenessLayer, new ConfigGetter(() => { return HasSpatialAwarenessLayer(); }) },
109+
{ Configurations.EnableMSBuildForUnity, new ConfigGetter(() => { return IsMSBuildForUnityEnabled(); }) },
69110

70111
// UWP Capabilities
71-
{ Configurations.SpatialPerceptionCapability, () => { return PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.SpatialPerception); } },
72-
{ Configurations.MicrophoneCapability, () => { return PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.Microphone); } },
73-
{ Configurations.InternetClientCapability, () => { return PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.InternetClient); } },
112+
{ Configurations.SpatialPerceptionCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.SpatialPerception); }, BuildTarget.WSAPlayer) },
113+
{ Configurations.MicrophoneCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.Microphone); }, BuildTarget.WSAPlayer) },
114+
{ Configurations.InternetClientCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.InternetClient); }, BuildTarget.WSAPlayer) },
74115
#if UNITY_2019_3_OR_NEWER
75-
{ Configurations.EyeTrackingCapability, () => { return PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.GazeInput); } },
116+
{ Configurations.EyeTrackingCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.GazeInput); }, BuildTarget.WSAPlayer) },
76117
#endif // UNITY_2019_3_OR_NEWER
77118

78119
// Android Settings
79-
{ Configurations.AndroidMultiThreadedRendering, () => { return PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android) == false; } },
80-
{ Configurations.AndroidMinSdkVersion, () => { return PlayerSettings.Android.minSdkVersion >= MinAndroidSdk; } },
120+
{ Configurations.AndroidMultiThreadedRendering,
121+
new ConfigGetter(() => { return PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android) == false; }, BuildTarget.Android) },
122+
{ Configurations.AndroidMinSdkVersion,
123+
new ConfigGetter(() => { return PlayerSettings.Android.minSdkVersion >= MinAndroidSdk; }, BuildTarget.Android) },
81124

82125
// iOS Settings
83-
{ Configurations.IOSMinOSVersion, () => {
126+
{ Configurations.IOSMinOSVersion, new ConfigGetter(() => {
84127
float version;
85128
if (!float.TryParse(PlayerSettings.iOS.targetOSVersionString, out version)) { return false; }
86-
return version >= iOSMinOsVersion; } },
87-
{ Configurations.IOSArchitecture, () => { return PlayerSettings.GetArchitecture(BuildTargetGroup.iOS) == RequirediOSArchitecture; } },
88-
{ Configurations.IOSCameraUsageDescription, () => { return !string.IsNullOrWhiteSpace(PlayerSettings.iOS.cameraUsageDescription); } },
129+
return version >= iOSMinOsVersion; }, BuildTarget.iOS) },
130+
{ Configurations.IOSArchitecture,
131+
new ConfigGetter(() => { return PlayerSettings.GetArchitecture(BuildTargetGroup.iOS) == RequirediOSArchitecture; }, BuildTarget.iOS) },
132+
{ Configurations.IOSCameraUsageDescription,
133+
new ConfigGetter(() => { return !string.IsNullOrWhiteSpace(PlayerSettings.iOS.cameraUsageDescription); }, BuildTarget.iOS) },
89134
};
90135

91136
// The configure functions for each type of setting
92137
private static Dictionary<Configurations, Action> ConfigurationSetters = new Dictionary<Configurations, Action>()
93138
{
94-
{ Configurations.LatestScriptingRuntime, () => { SetLatestScriptingRuntime(); } },
139+
{ Configurations.LatestScriptingRuntime, () => { SetLatestScriptingRuntime(); } },
95140
{ Configurations.ForceTextSerialization, () => { SetForceTextSerialization(); } },
96141
{ Configurations.VisibleMetaFiles, () => { SetVisibleMetaFiles(); } },
97142
// Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms
@@ -130,7 +175,11 @@ public static bool IsConfigured(Configurations config)
130175
{
131176
if (ConfigurationGetters.ContainsKey(config))
132177
{
133-
return ConfigurationGetters[config].Invoke();
178+
var configGetter = ConfigurationGetters[config];
179+
if (configGetter.IsActiveBuildTargetValid())
180+
{
181+
return configGetter.GetAction.Invoke();
182+
}
134183
}
135184

136185
return false;
@@ -154,9 +203,9 @@ public static void Configure(Configurations config)
154203
/// <returns>true if entire project is configured as recommended, false otherwise</returns>
155204
public static bool IsProjectConfigured()
156205
{
157-
foreach (var getter in ConfigurationGetters)
206+
foreach (var configGetter in ConfigurationGetters)
158207
{
159-
if (!getter.Value.Invoke())
208+
if (configGetter.Value.IsActiveBuildTargetValid() && !configGetter.Value.GetAction.Invoke())
160209
{
161210
return false;
162211
}
@@ -326,5 +375,10 @@ public static void ApplyXRSettings()
326375
}
327376
#pragma warning restore 0618
328377
}
378+
379+
private static bool GetCapability(PlayerSettings.WSACapability capability)
380+
{
381+
return MixedRealityOptimizeUtils.IsBuildTargetUWP() ? PlayerSettings.WSA.GetCapability(capability) : true;
382+
}
329383
}
330384
}

0 commit comments

Comments
 (0)