123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- using System;
- using System.Collections.Generic;
- using System.IO;
-
- using UnityEditor.AdaptivePerformance.Editor.Metadata;
-
- using UnityEngine;
- using UnityEngine.UIElements;
- using UnityEngine.AdaptivePerformance;
-
- namespace UnityEditor.AdaptivePerformance.Editor
- {
- class AdaptivePerformanceSettingsManager : SettingsProvider
- {
- struct Content
- {
- public static readonly GUIContent k_InitializeOnStart = new GUIContent(L10n.Tr("Initialize Adaptive Performance on Startup"));
- public static readonly GUIContent k_DocText = new GUIContent(L10n.Tr("View documentation"));
- public static readonly Uri k_DocUri = new Uri("https://docs.unity3d.com/Packages/com.unity.adaptiveperformance@latest");
- public static readonly GUIContent k_ExplanatoryText = new GUIContent(L10n.Tr("Selecting an Adaptive Performance provider below enables that provider for the corresponding build target. Unity will download and install the provider package if it is not already present. Disabling a provider will not automatically uninstall packages that are already installed. To uninstall a provider package, use the Package Manager."));
- public static readonly GUIContent k_FrameTimingExplanatoryText = new GUIContent(L10n.Tr("Please enable Frame Timing Stats in the Player Settings. Adaptive Performance requires precise frame time information."));
- }
-
- static string s_SettingsRootTitle = $"Project/{AdaptivePerformanceConstants.kAdaptivePerformanceProviderManagement}";
- static AdaptivePerformanceSettingsManager s_SettingsManager = null;
-
- internal static AdaptivePerformanceSettingsManager Instance => s_SettingsManager;
-
- bool resetUi = false;
- internal bool ResetUi
- {
- get
- {
- return resetUi;
- }
- set
- {
- resetUi = value;
- if (resetUi)
- Repaint();
- }
- }
-
- SerializedObject m_SettingsWrapper;
-
- private Dictionary<BuildTargetGroup, AdaptivePerformanceManagerSettingsEditor> CachedSettingsEditor = new Dictionary<BuildTargetGroup, AdaptivePerformanceManagerSettingsEditor>();
-
-
- private BuildTargetGroup m_LastBuildTargetGroup = BuildTargetGroup.Unknown;
-
- static AdaptivePerformanceGeneralSettingsPerBuildTarget currentSettings
- {
- get
- {
- AdaptivePerformanceGeneralSettingsPerBuildTarget generalSettings = null;
- EditorBuildSettings.TryGetConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, out generalSettings);
- if (generalSettings == null)
- {
- lock (s_SettingsManager)
- {
- EditorBuildSettings.TryGetConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, out generalSettings);
- if (generalSettings == null)
- {
- string searchText = "t:AdaptivePerformanceGeneralSettings";
- string[] assets = AssetDatabase.FindAssets(searchText);
- if (assets.Length > 0)
- {
- string path = AssetDatabase.GUIDToAssetPath(assets[0]);
- generalSettings = AssetDatabase.LoadAssetAtPath(path, typeof(AdaptivePerformanceGeneralSettingsPerBuildTarget)) as AdaptivePerformanceGeneralSettingsPerBuildTarget;
- }
- }
-
- if (generalSettings == null)
- {
- generalSettings = ScriptableObject.CreateInstance(typeof(AdaptivePerformanceGeneralSettingsPerBuildTarget)) as AdaptivePerformanceGeneralSettingsPerBuildTarget;
- string assetPath = EditorUtilities.GetAssetPathForComponents(EditorUtilities.s_DefaultGeneralSettingsPath);
- if (!string.IsNullOrEmpty(assetPath))
- {
- assetPath = Path.Combine(assetPath, "AdaptivePerformanceGeneralSettings.asset");
- generalSettings.hideFlags = HideFlags.HideInInspector;
- AssetDatabase.CreateAsset(generalSettings, assetPath);
- }
- }
-
- EditorBuildSettings.AddConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, generalSettings, true);
- }
- }
- return generalSettings;
- }
- }
-
- [UnityEngine.Internal.ExcludeFromDocs]
- AdaptivePerformanceSettingsManager(string path, SettingsScope scopes = SettingsScope.Project) : base(path, scopes)
- {
- }
-
- [SettingsProvider]
- [UnityEngine.Internal.ExcludeFromDocs]
- static SettingsProvider Create()
- {
- if (s_SettingsManager == null)
- {
- s_SettingsManager = new AdaptivePerformanceSettingsManager(s_SettingsRootTitle);
- }
-
- return s_SettingsManager;
- }
-
- [SettingsProviderGroup]
- [UnityEngine.Internal.ExcludeFromDocs]
- static SettingsProvider[] CreateAllChildSettingsProviders()
- {
- List<SettingsProvider> ret = new List<SettingsProvider>();
- if (s_SettingsManager != null)
- {
- var ats = TypeLoaderExtensions.GetAllTypesWithAttribute<AdaptivePerformanceConfigurationDataAttribute>();
- foreach (var at in ats)
- {
- if (at.FullName.Contains("UnityEngine.AdaptivePerformance.TestPackage"))
- continue;
-
- AdaptivePerformanceConfigurationDataAttribute apbda = at.GetCustomAttributes(typeof(AdaptivePerformanceConfigurationDataAttribute), true)[0] as AdaptivePerformanceConfigurationDataAttribute;
- string settingsPath = String.Format("{1}/{0}", apbda.displayName, s_SettingsRootTitle);
- var resProv = new AdaptivePerformanceConfigurationProvider(settingsPath, apbda.buildSettingsKey, at);
- ret.Add(resProv);
- }
- }
-
- return ret.ToArray();
- }
-
- void InitEditorData(ScriptableObject settings)
- {
- if (settings != null)
- {
- m_SettingsWrapper = new SerializedObject(settings);
- }
- }
-
- /// <summary>
- /// See <see href="https://docs.unity3d.com/ScriptReference/SettingsProvider.html">SettingsProvider documentation</see>.
- /// </summary>
- public override void OnActivate(string searchContext, VisualElement rootElement)
- {
- InitEditorData(currentSettings);
- }
-
- /// <summary>
- /// See <see href="https://docs.unity3d.com/ScriptReference/SettingsProvider.html">SettingsProvider documentation</see>.
- /// </summary>
- public override void OnDeactivate()
- {
- m_SettingsWrapper = null;
- CachedSettingsEditor.Clear();
- }
-
- private void DisplayLoaderSelectionUI()
- {
- BuildTargetGroup buildTargetGroup = EditorGUILayout.BeginBuildTargetSelectionGrouping();
-
- try
- {
- bool buildTargetChanged = m_LastBuildTargetGroup != buildTargetGroup;
- if (buildTargetChanged)
- m_LastBuildTargetGroup = buildTargetGroup;
-
- AdaptivePerformanceGeneralSettings settings = currentSettings.SettingsForBuildTarget(buildTargetGroup);
- if (settings == null)
- {
- settings = ScriptableObject.CreateInstance<AdaptivePerformanceGeneralSettings>() as AdaptivePerformanceGeneralSettings;
- settings.hideFlags = HideFlags.HideInInspector;
- currentSettings.SetSettingsForBuildTarget(buildTargetGroup, settings);
- settings.name = $"{buildTargetGroup.ToString()} Settings";
- AssetDatabase.AddObjectToAsset(settings, AssetDatabase.GetAssetOrScenePath(currentSettings));
- }
-
- var serializedSettingsObject = new SerializedObject(settings);
- serializedSettingsObject.Update();
-
- EditorGUILayout.LabelField($"Settings for {buildTargetGroup}", EditorStyles.boldLabel);
-
- SerializedProperty initOnStart = serializedSettingsObject.FindProperty("m_InitManagerOnStart");
- EditorGUIUtility.labelWidth = 260;
- EditorGUILayout.PropertyField(initOnStart, Content.k_InitializeOnStart);
- EditorGUILayout.Space();
-
- SerializedProperty loaderProp = serializedSettingsObject.FindProperty("m_LoaderManagerInstance");
-
- if (!CachedSettingsEditor.ContainsKey(buildTargetGroup))
- {
- CachedSettingsEditor.Add(buildTargetGroup, null);
- }
-
- if (loaderProp.objectReferenceValue == null)
- {
- var adaptivePerformanceManagerSettings = ScriptableObject.CreateInstance<AdaptivePerformanceManagerSettings>() as AdaptivePerformanceManagerSettings;
- adaptivePerformanceManagerSettings.hideFlags = HideFlags.HideInInspector;
- adaptivePerformanceManagerSettings.name = $"{buildTargetGroup.ToString()} Providers";
- AssetDatabase.AddObjectToAsset(adaptivePerformanceManagerSettings, AssetDatabase.GetAssetOrScenePath(currentSettings));
- loaderProp.objectReferenceValue = adaptivePerformanceManagerSettings;
- serializedSettingsObject.ApplyModifiedProperties();
- }
-
- var obj = loaderProp.objectReferenceValue;
-
- if (obj != null)
- {
- loaderProp.objectReferenceValue = obj;
-
- if (CachedSettingsEditor[buildTargetGroup] == null)
- {
- CachedSettingsEditor[buildTargetGroup] = UnityEditor.Editor.CreateEditor(obj) as AdaptivePerformanceManagerSettingsEditor;
-
- if (CachedSettingsEditor[buildTargetGroup] == null)
- {
- Debug.LogError("Failed to create a view for Adaptive Performance Manager Settings Instance");
- }
- }
-
- if (CachedSettingsEditor[buildTargetGroup] != null)
- {
- if (ResetUi)
- {
- ResetUi = false;
- CachedSettingsEditor[buildTargetGroup].Reload();
- }
-
- CachedSettingsEditor[buildTargetGroup].BuildTarget = buildTargetGroup;
- CachedSettingsEditor[buildTargetGroup].OnInspectorGUI();
- }
- }
- else if (obj == null)
- {
- settings.AssignedSettings = null;
- loaderProp.objectReferenceValue = null;
- }
-
- serializedSettingsObject.ApplyModifiedProperties();
- }
- catch (Exception ex)
- {
- Debug.LogError($"Error trying to display provider assignment UI : {ex.Message}");
- }
-
- EditorGUILayout.EndBuildTargetSelectionGrouping();
- }
-
- private void DisplayLink(GUIContent text, Uri link)
- {
- var labelStyle = EditorStyles.linkLabel;
- var uriRect = GUILayoutUtility.GetRect(text, labelStyle);
- var size = labelStyle.CalcSize(text);
- uriRect.width = size.x;
- if (GUI.Button(uriRect, text, labelStyle))
- {
- System.Diagnostics.Process.Start(link.AbsoluteUri);
- }
- EditorGUIUtility.AddCursorRect(uriRect, MouseCursor.Link);
- EditorGUI.DrawRect(new Rect(uriRect.x, uriRect.y + uriRect.height - 1, uriRect.width, 1), labelStyle.normal.textColor);
- }
-
- private void DisplayDocumentationLink()
- {
- DisplayLink(Content.k_DocText, Content.k_DocUri);
- EditorGUILayout.Space();
- }
-
- private void DisplayLoadOrderUi()
- {
- EditorGUILayout.HelpBox(Content.k_ExplanatoryText.text, MessageType.Info);
- EditorGUILayout.Space();
- if (!PlayerSettings.enableFrameTimingStats)
- EditorGUILayout.HelpBox(Content.k_FrameTimingExplanatoryText.text, MessageType.Warning);
-
- EditorGUI.BeginDisabledGroup(AdaptivePerformancePackageMetadataStore.isDoingQueueProcessing || EditorApplication.isPlaying || EditorApplication.isPaused);
- if (m_SettingsWrapper != null && m_SettingsWrapper.targetObject != null)
- {
- m_SettingsWrapper.Update();
-
- EditorGUILayout.Space();
-
- DisplayLoaderSelectionUI();
-
- m_SettingsWrapper.ApplyModifiedProperties();
- }
- EditorGUI.EndDisabledGroup();
- }
-
- /// <summary>
- /// See <see href="https://docs.unity3d.com/ScriptReference/SettingsProvider.html">SettingsProvider documentation</see>.
- /// </summary>
- public override void OnGUI(string searchContext)
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.Space();
- EditorGUILayout.BeginVertical();
-
- DisplayDocumentationLink();
- DisplayLoadOrderUi();
-
- EditorGUILayout.EndHorizontal();
- EditorGUILayout.EndVertical();
-
- base.OnGUI(searchContext);
- }
- }
- }
|