Skip to content

Commit e81738c

Browse files
authored
Merge pull request #7203 from keveleigh/cherrypick-#7199
Cherrypick #7199 and mark MSBuildForUnity as WSA-only
2 parents c3127d8 + 4eda5a1 commit e81738c

File tree

2 files changed

+148
-78
lines changed

2 files changed

+148
-78
lines changed

Assets/MixedRealityToolkit/Inspectors/Setup/MixedRealityProjectConfiguratorWindow.cs

Lines changed: 70 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static void ShowWindow()
6262
}
6363
else
6464
{
65-
var window = ScriptableObject.CreateInstance<MixedRealityProjectConfiguratorWindow>();
65+
var window = CreateInstance<MixedRealityProjectConfiguratorWindow>();
6666
window.titleContent = new GUIContent("MRTK Project Configurator", EditorGUIUtility.IconContent("_Popup").image);
6767
window.position = new Rect(Screen.width / 2.0f, Screen.height / 2.0f, Default_Window_Height, Default_Window_Width);
6868
window.ShowUtility();
@@ -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?";
@@ -132,65 +147,74 @@ private void RenderChoiceDialog()
132147
}
133148
}
134149

150+
private Vector2 scrollPosition = Vector2.zero;
151+
135152
private void RenderConfigurations()
136153
{
137154
EditorGUILayout.LabelField("Enabled options will be applied to the project. Disabled items are already properly configured.");
138155
EditorGUILayout.Space();
139156

140-
EditorGUILayout.LabelField("Project Settings", EditorStyles.boldLabel);
141-
RenderToggle(MRConfig.ForceTextSerialization, "Enable Force Text Serialization");
142-
RenderToggle(MRConfig.VisibleMetaFiles, "Enable Visible meta files");
143-
if (!MixedRealityOptimizeUtils.IsBuildTargetAndroid() && !MixedRealityOptimizeUtils.IsBuildTargetIOS())
157+
using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPosition))
144158
{
159+
scrollPosition = scrollView.scrollPosition;
160+
EditorGUILayout.LabelField("Project Settings", EditorStyles.boldLabel);
161+
RenderToggle(MRConfig.ForceTextSerialization, "Enable Force Text Serialization");
162+
RenderToggle(MRConfig.VisibleMetaFiles, "Enable Visible meta files");
163+
if (!MixedRealityOptimizeUtils.IsBuildTargetAndroid() && !MixedRealityOptimizeUtils.IsBuildTargetIOS())
164+
{
145165
#if UNITY_2019_3_OR_NEWER
146-
RenderToggle(MRConfig.VirtualRealitySupported, "Enable Legacy XR");
166+
RenderToggle(MRConfig.VirtualRealitySupported, "Enable Legacy XR");
147167
#else
148-
RenderToggle(MRConfig.VirtualRealitySupported, "Enable VR Supported");
168+
RenderToggle(MRConfig.VirtualRealitySupported, "Enable VR Supported");
149169
#endif // UNITY_2019_3_OR_NEWER
150-
}
170+
}
151171
#if UNITY_2019_3_OR_NEWER
152-
RenderToggle(MRConfig.SinglePassInstancing, "Set Single Pass Instanced rendering path (legacy XR API)");
172+
RenderToggle(MRConfig.SinglePassInstancing, "Set Single Pass Instanced rendering path (legacy XR API)");
153173
#else
154-
RenderToggle(MRConfig.SinglePassInstancing, "Set Single Pass Instanced rendering path");
174+
RenderToggle(MRConfig.SinglePassInstancing, "Set Single Pass Instanced rendering path");
155175
#endif // UNITY_2019_3_OR_NEWER
156-
RenderToggle(MRConfig.SpatialAwarenessLayer, "Set Default Spatial Awareness Layer");
157-
RenderToggle(MRConfig.EnableMSBuildForUnity, "Enable MSBuild for Unity");
158-
EditorGUILayout.Space();
159-
160-
if (MixedRealityOptimizeUtils.IsBuildTargetUWP())
161-
{
162-
EditorGUILayout.LabelField("UWP Capabilities", EditorStyles.boldLabel);
176+
RenderToggle(MRConfig.SpatialAwarenessLayer, "Set default Spatial Awareness layer");
177+
EditorGUILayout.Space();
163178

164-
RenderToggle(MRConfig.MicrophoneCapability, "Enable Microphone Capability");
165-
RenderToggle(MRConfig.InternetClientCapability, "Enable Internet Client Capability");
166-
RenderToggle(MRConfig.SpatialPerceptionCapability, "Enable Spatial Perception Capability");
179+
if (MixedRealityOptimizeUtils.IsBuildTargetUWP())
180+
{
181+
EditorGUILayout.LabelField("MSBuild for Unity Support", EditorStyles.boldLabel);
182+
EditorGUILayout.HelpBox("Enable this for additional HoloLens 2 features, like hand joint remoting and depth LSR mode.", MessageType.Info);
183+
RenderToggle(MRConfig.EnableMSBuildForUnity, "Enable MSBuild for Unity");
184+
EditorGUILayout.Space();
185+
186+
EditorGUILayout.LabelField("UWP Capabilities", EditorStyles.boldLabel);
187+
RenderToggle(MRConfig.MicrophoneCapability, "Enable Microphone Capability");
188+
RenderToggle(MRConfig.InternetClientCapability, "Enable Internet Client Capability");
189+
RenderToggle(MRConfig.SpatialPerceptionCapability, "Enable Spatial Perception Capability");
167190
#if UNITY_2019_3_OR_NEWER
168-
RenderToggle(MRConfig.EyeTrackingCapability, "Enable Eye Gaze Input Capability");
191+
RenderToggle(MRConfig.EyeTrackingCapability, "Enable Eye Gaze Input Capability");
169192
#endif
170-
}
171-
else
172-
{
173-
trackToggles[MRConfig.MicrophoneCapability] = false;
174-
trackToggles[MRConfig.InternetClientCapability] = false;
175-
trackToggles[MRConfig.SpatialPerceptionCapability] = false;
193+
}
194+
else
195+
{
196+
trackToggles[MRConfig.MicrophoneCapability] = false;
197+
trackToggles[MRConfig.InternetClientCapability] = false;
198+
trackToggles[MRConfig.SpatialPerceptionCapability] = false;
176199
#if UNITY_2019_3_OR_NEWER
177-
trackToggles[MRConfig.EyeTrackingCapability] = false;
200+
trackToggles[MRConfig.EyeTrackingCapability] = false;
178201
#endif
179-
}
202+
}
180203

181-
if (MixedRealityOptimizeUtils.IsBuildTargetAndroid())
182-
{
183-
EditorGUILayout.LabelField("Android Settings", EditorStyles.boldLabel);
184-
RenderToggle(MRConfig.AndroidMultiThreadedRendering, "Disable Multi-Threaded Rendering");
185-
RenderToggle(MRConfig.AndroidMinSdkVersion, "Set Minimum API Level");
186-
}
204+
if (MixedRealityOptimizeUtils.IsBuildTargetAndroid())
205+
{
206+
EditorGUILayout.LabelField("Android Settings", EditorStyles.boldLabel);
207+
RenderToggle(MRConfig.AndroidMultiThreadedRendering, "Disable Multi-Threaded Rendering");
208+
RenderToggle(MRConfig.AndroidMinSdkVersion, "Set Minimum API Level");
209+
}
187210

188-
if (MixedRealityOptimizeUtils.IsBuildTargetIOS())
189-
{
190-
EditorGUILayout.LabelField("iOS Settings", EditorStyles.boldLabel);
191-
RenderToggle(MRConfig.IOSMinOSVersion, "Set Required OS Version");
192-
RenderToggle(MRConfig.IOSArchitecture, "Set Required Architecture");
193-
RenderToggle(MRConfig.IOSCameraUsageDescription, "Set Camera Usage Descriptions");
211+
if (MixedRealityOptimizeUtils.IsBuildTargetIOS())
212+
{
213+
EditorGUILayout.LabelField("iOS Settings", EditorStyles.boldLabel);
214+
RenderToggle(MRConfig.IOSMinOSVersion, "Set Required OS Version");
215+
RenderToggle(MRConfig.IOSArchitecture, "Set Required Architecture");
216+
RenderToggle(MRConfig.IOSCameraUsageDescription, "Set Camera Usage Descriptions");
217+
}
194218
}
195219
}
196220

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

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,53 +52,90 @@ 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(); } },
61-
// Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms
62-
// with legacy requirements.
63-
#pragma warning disable 0618
64-
{ Configurations.VirtualRealitySupported, () => { return PlayerSettings.virtualRealitySupported; } },
65-
#pragma warning restore 0618
66-
{ Configurations.SinglePassInstancing, () => { return MixedRealityOptimizeUtils.IsSinglePassInstanced(); } },
67-
{ Configurations.SpatialAwarenessLayer, () => { return HasSpatialAwarenessLayer(); } },
68-
{ Configurations.EnableMSBuildForUnity, () => { return IsMSBuildForUnityEnabled(); } },
99+
{ Configurations.LatestScriptingRuntime, new ConfigGetter(() => { return IsLatestScriptingRuntime(); }) },
100+
{ Configurations.ForceTextSerialization, new ConfigGetter(() => { return IsForceTextSerialization(); }) },
101+
{ Configurations.VisibleMetaFiles, new ConfigGetter(() => { return IsVisibleMetaFiles(); }) },
102+
{ Configurations.VirtualRealitySupported, new ConfigGetter(() => { return XRSettingsUtilities.LegacyXREnabled; }) },
103+
{ Configurations.SinglePassInstancing, new ConfigGetter(() => { return MixedRealityOptimizeUtils.IsSinglePassInstanced(); }) },
104+
{ Configurations.SpatialAwarenessLayer, new ConfigGetter(() => { return HasSpatialAwarenessLayer(); }) },
105+
{ Configurations.EnableMSBuildForUnity, new ConfigGetter(() => { return IsMSBuildForUnityEnabled(); }, BuildTarget.WSAPlayer) },
69106

70107
// 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); } },
108+
{ Configurations.SpatialPerceptionCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.SpatialPerception); }, BuildTarget.WSAPlayer) },
109+
{ Configurations.MicrophoneCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.Microphone); }, BuildTarget.WSAPlayer) },
110+
{ Configurations.InternetClientCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.InternetClient); }, BuildTarget.WSAPlayer) },
74111
#if UNITY_2019_3_OR_NEWER
75-
{ Configurations.EyeTrackingCapability, () => { return PlayerSettings.WSA.GetCapability(PlayerSettings.WSACapability.GazeInput); } },
112+
{ Configurations.EyeTrackingCapability, new ConfigGetter(() => { return GetCapability(PlayerSettings.WSACapability.GazeInput); }, BuildTarget.WSAPlayer) },
76113
#endif // UNITY_2019_3_OR_NEWER
77114

78115
// Android Settings
79-
{ Configurations.AndroidMultiThreadedRendering, () => { return PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android) == false; } },
80-
{ Configurations.AndroidMinSdkVersion, () => { return PlayerSettings.Android.minSdkVersion >= MinAndroidSdk; } },
116+
{ Configurations.AndroidMultiThreadedRendering,
117+
new ConfigGetter(() => { return PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android) == false; }, BuildTarget.Android) },
118+
{ Configurations.AndroidMinSdkVersion,
119+
new ConfigGetter(() => { return PlayerSettings.Android.minSdkVersion >= MinAndroidSdk; }, BuildTarget.Android) },
81120

82121
// iOS Settings
83-
{ Configurations.IOSMinOSVersion, () => {
122+
{ Configurations.IOSMinOSVersion, new ConfigGetter(() => {
84123
float version;
85124
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); } },
125+
return version >= iOSMinOsVersion; }, BuildTarget.iOS) },
126+
{ Configurations.IOSArchitecture,
127+
new ConfigGetter(() => { return PlayerSettings.GetArchitecture(BuildTargetGroup.iOS) == RequirediOSArchitecture; }, BuildTarget.iOS) },
128+
{ Configurations.IOSCameraUsageDescription,
129+
new ConfigGetter(() => { return !string.IsNullOrWhiteSpace(PlayerSettings.iOS.cameraUsageDescription); }, BuildTarget.iOS) },
89130
};
90131

91132
// The configure functions for each type of setting
92-
private static Dictionary<Configurations, Action> ConfigurationSetters = new Dictionary<Configurations, Action>()
133+
private static readonly Dictionary<Configurations, Action> ConfigurationSetters = new Dictionary<Configurations, Action>()
93134
{
94-
{ Configurations.LatestScriptingRuntime, () => { SetLatestScriptingRuntime(); } },
135+
{ Configurations.LatestScriptingRuntime, () => { SetLatestScriptingRuntime(); } },
95136
{ Configurations.ForceTextSerialization, () => { SetForceTextSerialization(); } },
96137
{ Configurations.VisibleMetaFiles, () => { SetVisibleMetaFiles(); } },
97-
// Ensure compatibility with the pre-2019.3 XR architecture for customers / platforms
98-
// with legacy requirements.
99-
#pragma warning disable 0618
100-
{ Configurations.VirtualRealitySupported, () => { PlayerSettings.virtualRealitySupported = true; } },
101-
#pragma warning restore 0618
138+
{ Configurations.VirtualRealitySupported, () => { XRSettingsUtilities.LegacyXREnabled = true; } },
102139
{ Configurations.SinglePassInstancing, () => { MixedRealityOptimizeUtils.SetSinglePassInstanced(); } },
103140
{ Configurations.SpatialAwarenessLayer, () => { SetSpatialAwarenessLayer(); } },
104141
{ Configurations.EnableMSBuildForUnity, () => { PackageManifestUpdater.EnsureMSBuildForUnity(); } },
@@ -130,7 +167,11 @@ public static bool IsConfigured(Configurations config)
130167
{
131168
if (ConfigurationGetters.ContainsKey(config))
132169
{
133-
return ConfigurationGetters[config].Invoke();
170+
var configGetter = ConfigurationGetters[config];
171+
if (configGetter.IsActiveBuildTargetValid())
172+
{
173+
return configGetter.GetAction.Invoke();
174+
}
134175
}
135176

136177
return false;
@@ -154,9 +195,9 @@ public static void Configure(Configurations config)
154195
/// <returns>true if entire project is configured as recommended, false otherwise</returns>
155196
public static bool IsProjectConfigured()
156197
{
157-
foreach (var getter in ConfigurationGetters)
198+
foreach (var configGetter in ConfigurationGetters)
158199
{
159-
if (!getter.Value.Invoke())
200+
if (configGetter.Value.IsActiveBuildTargetValid() && !configGetter.Value.GetAction.Invoke())
160201
{
161202
return false;
162203
}
@@ -326,5 +367,10 @@ public static void ApplyXRSettings()
326367
}
327368
#pragma warning restore 0618
328369
}
370+
371+
private static bool GetCapability(PlayerSettings.WSACapability capability)
372+
{
373+
return MixedRealityOptimizeUtils.IsBuildTargetUWP() ? PlayerSettings.WSA.GetCapability(capability) : true;
374+
}
329375
}
330376
}

0 commit comments

Comments
 (0)