using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.AdaptivePerformance;
using UnityEditor.AdaptivePerformance.Editor.Metadata;
namespace UnityEditor.AdaptivePerformance.Editor
{
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
///
/// Container class that holds general settings for each build target group installed in Unity.
///
public class AdaptivePerformanceGeneralSettingsPerBuildTarget : ScriptableObject, ISerializationCallbackReceiver
{
[SerializeField]
List Keys = new List();
[SerializeField]
List Values = new List();
Dictionary Settings = new Dictionary();
#if UNITY_EDITOR
static AdaptivePerformanceGeneralSettingsPerBuildTarget()
{
EditorApplication.playModeStateChanged += PlayModeStateChanged;
}
void OnEnable()
{
foreach (var setting in Settings.Values)
{
var assignedSettings = setting.AssignedSettings;
if (assignedSettings == null)
continue;
var filteredLoaders = from ldr in assignedSettings.loaders where ldr != null select ldr;
assignedSettings.loaders = filteredLoaders.ToList();
}
AdaptivePerformanceGeneralSettings.Instance = AdaptivePerformanceGeneralSettingsForBuildTarget(BuildTargetGroup.Standalone);
}
static void PlayModeStateChanged(PlayModeStateChange state)
{
AdaptivePerformanceGeneralSettingsPerBuildTarget buildTargetSettings = null;
EditorBuildSettings.TryGetConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, out buildTargetSettings);
if (buildTargetSettings == null)
return;
AdaptivePerformanceGeneralSettings instance = buildTargetSettings.SettingsForBuildTarget(BuildTargetGroup.Standalone);
if (instance == null || !instance.InitManagerOnStart)
return;
instance.InternalPlayModeStateChanged(state);
}
internal static bool ContainsLoaderForAnyBuildTarget(string loaderTypeName)
{
AdaptivePerformanceGeneralSettingsPerBuildTarget buildTargetSettings = null;
EditorBuildSettings.TryGetConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, out buildTargetSettings);
if (buildTargetSettings == null)
return false;
foreach (var settings in buildTargetSettings.Settings.Values)
{
if (AdaptivePerformancePackageMetadataStore.IsLoaderAssigned(settings.Manager, loaderTypeName))
return true;
}
return false;
}
#endif
///
/// Set specific settings for a given build target.
///
/// An enum that specifies which platform group this build is for.
/// An instance of to assign for the given key.
public void SetSettingsForBuildTarget(BuildTargetGroup targetGroup, AdaptivePerformanceGeneralSettings settings)
{
// Ensures the editor's "runtime instance" is the most current for standalone settings
if (targetGroup == BuildTargetGroup.Standalone)
AdaptivePerformanceGeneralSettings.Instance = settings;
Settings[targetGroup] = settings;
}
/// Get specific settings for a given build target.
/// An enum that specifies which platform group this build is for.
/// The instance of assigned to the key, or null if no instance is assigned.
public AdaptivePerformanceGeneralSettings SettingsForBuildTarget(BuildTargetGroup targetGroup)
{
AdaptivePerformanceGeneralSettings ret = null;
Settings.TryGetValue(targetGroup, out ret);
return ret;
}
/// Serialization override.
public void OnBeforeSerialize()
{
Keys.Clear();
Values.Clear();
foreach (var kv in Settings)
{
Keys.Add(kv.Key);
Values.Add(kv.Value);
}
}
/// Serialization override.
public void OnAfterDeserialize()
{
Settings = new Dictionary();
for (int i = 0; i < Math.Min(Keys.Count, Values.Count); i++)
{
Settings.Add(Keys[i], Values[i]);
}
}
/// Given a build target, get the general settings container assigned to it.
/// An enum that specifies which platform group this build is for.
/// The instance of assigned to the key, or null if no instance is assigned.
public static AdaptivePerformanceGeneralSettings AdaptivePerformanceGeneralSettingsForBuildTarget(BuildTargetGroup targetGroup)
{
AdaptivePerformanceGeneralSettingsPerBuildTarget buildTargetSettings = null;
EditorBuildSettings.TryGetConfigObject(AdaptivePerformanceGeneralSettings.k_SettingsKey, out buildTargetSettings);
if (buildTargetSettings == null)
return null;
return buildTargetSettings.SettingsForBuildTarget(targetGroup);
}
}
}