//======= Copyright (c) Stereolabs Corporation, All rights reserved. =============== using UnityEngine; using UnityEditor; using System.Collections; /// /// Checks your system for the required ZED SDK version, and displays an error window with instructions if it's missing. /// Runs automatically when Unity loads. Remove the [InitializeOnLoad] tag to disable this. /// [InitializeOnLoad] public class ZEDPluginInspector : EditorWindow { /// /// ZED unity logo /// static Texture2D image = null; private static EditorWindow window; private static bool showErrorMode = false; private static bool showSettingsMode = false; private static string errorMessage = ""; const bool forceSettingsShow = false; bool showErrorPlugin = false; const string ignore = "ignore."; const string useRecommended = "Use recommended ({0})"; const string currentValue = " (current = {0})"; const string buildTarget = "Build Target"; const string showUnitySplashScreen = "Show Unity Splashscreen"; const string displayResolutionDialog = "Display Resolution Dialog"; const string resizableWindow = "Resizable Window"; const string colorSpace = "Color Space"; const string gpuSkinning = "GPU Skinning"; const string MSAAValue = "Anti Aliasing"; const string runInBackground = "Run In Background"; const string visibleInBackground = "Visible In Background"; const BuildTarget needed_BuildTarget = BuildTarget.StandaloneWindows64; const bool needed_ShowUnitySplashScreen = false; const bool needed_ResizableWindow = true; const ColorSpace needed_ColorSpace = ColorSpace.Linear; const bool needed_GPUSkinning = true; const int needed_MSAAValue = 4; const bool needed_RunInBackground = true; const bool needed_VisibleInBackground = true; static ZEDPluginInspector() { EditorApplication.update += OnInit; } static void OnInit() { EditorApplication.update -= OnInit; if (!EditorApplication.isPlayingOrWillChangePlaymode && !EditorApplication.isCompiling && !EditorApplication.isUpdating) { if (!EditorPrefs.HasKey("ZED_NoWarning_Plugin")) EditorApplication.update += UpdateWnd; } else EditorApplication.update += UpdateLog; EditorApplication.update += UpdateSettingsWnd; } void OnEnable() { addMissingTag(); } /// /// Makes sure the project's tags are loaded, as they are used in some samples but may get deleted on import or /// if shared via source control. /// static public void addMissingTag() { // Open tag manager SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]); SerializedProperty tagsProp = tagManager.FindProperty("tags"); // Adding a Tag string s = "HelpObject"; // Check if not here already bool found = false; for (int i = 0; i < tagsProp.arraySize; i++) { SerializedProperty t = tagsProp.GetArrayElementAtIndex(i); if (t.stringValue.Equals(s)) { found = true; break; } } //If not found, add it since we use it in GreenScreen. //This tag may be used anywhere, since it tags helper object that may have a specific behavior if (!found) { tagsProp.InsertArrayElementAtIndex(0); SerializedProperty n = tagsProp.GetArrayElementAtIndex(0); n.stringValue = s; } // and to save the changes tagManager.ApplyModifiedProperties(); } static void UpdateLog() { if (!sl.ZEDCamera.CheckPlugin()) { Debug.Log("ZED SDK is not installed or needs to be updated"); } EditorApplication.update -= UpdateLog; } static void UpdateSettingsWnd() { showSettingsMode = (!EditorPrefs.HasKey(ignore + buildTarget) && EditorUserBuildSettings.activeBuildTarget != needed_BuildTarget) || (!EditorPrefs.HasKey(ignore + showUnitySplashScreen) && PlayerSettings.SplashScreen.show != needed_ShowUnitySplashScreen) || (!EditorPrefs.HasKey(ignore + resizableWindow) && PlayerSettings.resizableWindow != needed_ResizableWindow) || (!EditorPrefs.HasKey(ignore + colorSpace) && PlayerSettings.colorSpace != needed_ColorSpace) || (!EditorPrefs.HasKey(ignore + gpuSkinning) && PlayerSettings.gpuSkinning != needed_GPUSkinning) || (!EditorPrefs.HasKey(ignore + runInBackground) && PlayerSettings.runInBackground != needed_RunInBackground) || (!EditorPrefs.HasKey(ignore + visibleInBackground) && PlayerSettings.visibleInBackground != needed_VisibleInBackground) || (!EditorPrefs.HasKey(ignore + MSAAValue) && QualitySettings.antiAliasing != needed_MSAAValue) || forceSettingsShow; if (showSettingsMode) { window = GetWindow(true); window.maxSize = new Vector2(400, 400); window.minSize = window.maxSize; window.Show(true); } EditorApplication.update -= UpdateSettingsWnd; } static void UpdateWnd() { if (!sl.ZEDCamera.CheckPlugin()) { errorMessage = ZEDLogMessage.Error2Str(ZEDLogMessage.ERROR.SDK_DEPENDENCIES_ISSUE); showErrorMode = true; window = GetWindow(true); window.maxSize = new Vector2(400, 600); window.minSize = window.maxSize; window.Show(true); } EditorApplication.update -= UpdateWnd; } void OnGUI() { if (showErrorMode) { showErrorWindow(); } else if (showSettingsMode) { showSettingsWindow(); } } /// /// Displays a popup window when the correct ZED SDK version isn't installed. /// public void showErrorWindow() { if (image == null) { image = Resources.Load("Textures/logo", typeof(Texture2D)) as Texture2D; } var rect = GUILayoutUtility.GetRect(position.width, 150, GUI.skin.box); if (image) { GUI.DrawTexture(rect, image, ScaleMode.ScaleToFit); } GUIStyle myStyle = new GUIStyle(GUI.skin.label); myStyle.normal.textColor = Color.red; myStyle.fontStyle = FontStyle.Bold; GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.Label("ZED SDK is not installed or needs to be updated", myStyle); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); myStyle = new GUIStyle(GUI.skin.box); myStyle.normal.textColor = Color.red; GUI.Box(new Rect(0, position.height / 2, position.width, 100), errorMessage, myStyle); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); myStyle.normal.textColor = Color.black; myStyle.fontStyle = FontStyle.Bold; GUILayout.Label("Do not ask me again..."); showErrorPlugin = EditorGUILayout.Toggle("", showErrorPlugin); GUILayout.EndHorizontal(); GUILayout.Space(10); if (GUILayout.Button("Close")) { if (showErrorPlugin) { EditorPrefs.SetBool("ZED_NoWarning_Plugin", true); } this.Close(); } } Vector2 scrollPosition; /// /// Shows a window prompting the user to change project settings to recommended settings, with /// buttons to automatically do so. /// public void showSettingsWindow() { if (image == null) { image = Resources.Load("Textures/logo", typeof(Texture2D)) as Texture2D; } var rect = GUILayoutUtility.GetRect(position.width, 150, GUI.skin.box); if (image) { GUI.DrawTexture(rect, image, ScaleMode.ScaleToFit); } EditorGUILayout.HelpBox("Recommended project settings for ZED Unity Plugin", MessageType.Warning); scrollPosition = GUILayout.BeginScrollView(scrollPosition); int numItems = 0; if (!EditorPrefs.HasKey(ignore + buildTarget) && EditorUserBuildSettings.activeBuildTarget != needed_BuildTarget) { ++numItems; GUILayout.Label(buildTarget + string.Format(currentValue, EditorUserBuildSettings.activeBuildTarget)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_BuildTarget))) { EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, needed_BuildTarget); } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + buildTarget, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + showUnitySplashScreen) && PlayerSettings.SplashScreen.show != needed_ShowUnitySplashScreen) { ++numItems; GUILayout.Label(showUnitySplashScreen + string.Format(currentValue, PlayerSettings.SplashScreen.show)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_ShowUnitySplashScreen))) { PlayerSettings.SplashScreen.show = needed_ShowUnitySplashScreen; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + showUnitySplashScreen, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + resizableWindow) && PlayerSettings.resizableWindow != needed_ResizableWindow) { ++numItems; GUILayout.Label(resizableWindow + string.Format(currentValue, PlayerSettings.resizableWindow)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_ResizableWindow))) { PlayerSettings.resizableWindow = needed_ResizableWindow; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + resizableWindow, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + visibleInBackground) && PlayerSettings.visibleInBackground != needed_VisibleInBackground) { ++numItems; GUILayout.Label(visibleInBackground + string.Format(currentValue, PlayerSettings.visibleInBackground)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_VisibleInBackground))) { PlayerSettings.visibleInBackground = needed_VisibleInBackground; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + visibleInBackground, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + runInBackground) && PlayerSettings.runInBackground != needed_RunInBackground) { ++numItems; GUILayout.Label(runInBackground + string.Format(currentValue, PlayerSettings.runInBackground)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_RunInBackground))) { PlayerSettings.runInBackground = needed_RunInBackground; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + runInBackground, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + gpuSkinning) && PlayerSettings.gpuSkinning != needed_GPUSkinning) { ++numItems; GUILayout.Label(gpuSkinning + string.Format(currentValue, PlayerSettings.gpuSkinning)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_GPUSkinning))) { PlayerSettings.gpuSkinning = needed_GPUSkinning; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + gpuSkinning, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + colorSpace) && PlayerSettings.colorSpace != needed_ColorSpace) { ++numItems; GUILayout.Label(colorSpace + string.Format(currentValue, PlayerSettings.colorSpace)); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_ColorSpace) + " - requires reloading scene")) { PlayerSettings.colorSpace = needed_ColorSpace; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + colorSpace, true); } GUILayout.EndHorizontal(); } if (!EditorPrefs.HasKey(ignore + MSAAValue) && QualitySettings.antiAliasing != needed_MSAAValue) { ++numItems; GUILayout.Label(MSAAValue + string.Format(currentValue, QualitySettings.antiAliasing) + "x Multi Sampling"); GUILayout.BeginHorizontal(); if (GUILayout.Button(string.Format(useRecommended, needed_MSAAValue))) { QualitySettings.antiAliasing = needed_MSAAValue; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Ignore")) { EditorPrefs.SetBool(ignore + MSAAValue, true); } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Clear All Ignores")) { EditorPrefs.DeleteKey(ignore + buildTarget); EditorPrefs.DeleteKey(ignore + showUnitySplashScreen); EditorPrefs.DeleteKey(ignore + displayResolutionDialog); EditorPrefs.DeleteKey(ignore + resizableWindow); EditorPrefs.DeleteKey(ignore + colorSpace); EditorPrefs.DeleteKey(ignore + gpuSkinning); EditorPrefs.DeleteKey(ignore + MSAAValue); EditorPrefs.DeleteKey(ignore + visibleInBackground); EditorPrefs.DeleteKey(ignore + runInBackground); EditorPrefs.DeleteKey(ignore + MSAAValue); } GUILayout.EndHorizontal(); GUILayout.EndScrollView(); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); if (numItems > 0) { if (GUILayout.Button("Accept All")) { // Only set those that have not been explicitly ignored. if (!EditorPrefs.HasKey(ignore + buildTarget)) EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, needed_BuildTarget); if (!EditorPrefs.HasKey(ignore + showUnitySplashScreen)) PlayerSettings.SplashScreen.show = needed_ShowUnitySplashScreen; if (!EditorPrefs.HasKey(ignore + resizableWindow)) PlayerSettings.resizableWindow = needed_ResizableWindow; if (!EditorPrefs.HasKey(ignore + colorSpace)) PlayerSettings.colorSpace = needed_ColorSpace; if (!EditorPrefs.HasKey(ignore + gpuSkinning)) PlayerSettings.gpuSkinning = needed_GPUSkinning; if (!EditorPrefs.HasKey(ignore + runInBackground)) PlayerSettings.runInBackground = needed_RunInBackground; if (!EditorPrefs.HasKey(ignore + visibleInBackground)) PlayerSettings.visibleInBackground = needed_VisibleInBackground; if (!EditorPrefs.HasKey(ignore + MSAAValue)) QualitySettings.antiAliasing = needed_MSAAValue; EditorUtility.DisplayDialog("Accept All", "Settings applied", "Ok"); Close(); } if (GUILayout.Button("Ignore All")) { if (EditorUtility.DisplayDialog("Ignore All", "Are you sure?", "Yes, Ignore All", "Cancel")) { // Only ignore those that do not currently match our recommended settings. if (EditorUserBuildSettings.activeBuildTarget != needed_BuildTarget) EditorPrefs.SetBool(ignore + buildTarget, true); if (PlayerSettings.SplashScreen.show != needed_ShowUnitySplashScreen) EditorPrefs.SetBool(ignore + showUnitySplashScreen, true); if (PlayerSettings.resizableWindow != needed_ResizableWindow) EditorPrefs.SetBool(ignore + resizableWindow, true); if (PlayerSettings.colorSpace != needed_ColorSpace) EditorPrefs.SetBool(ignore + colorSpace, true); if (PlayerSettings.gpuSkinning != needed_GPUSkinning) EditorPrefs.SetBool(ignore + gpuSkinning, true); if (PlayerSettings.runInBackground != needed_RunInBackground) EditorPrefs.SetBool(ignore + runInBackground, true); if (PlayerSettings.visibleInBackground != needed_VisibleInBackground) EditorPrefs.SetBool(ignore + visibleInBackground, true); if (QualitySettings.antiAliasing != needed_MSAAValue) EditorPrefs.SetBool(ignore + MSAAValue, true); Close(); } } } else if (GUILayout.Button("Close")) { Close(); } GUILayout.EndHorizontal(); } }