您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
123 行
4.0 KiB
123 行
4.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEditor.Build;
|
|
using UnityEditor.Build.Reporting;
|
|
|
|
namespace Unity.Services.Core.Configuration.Editor
|
|
{
|
|
class ProjectConfigurationBuilder : IPreprocessBuildWithReport,
|
|
IPostprocessBuildWithReport,
|
|
IDisposable
|
|
{
|
|
static ProjectConfigurationBuilder s_EditorInstance;
|
|
|
|
IEnumerable<IConfigurationProvider> m_OrderedConfigProviders;
|
|
|
|
/// <remarks>
|
|
/// Necessary for <see cref="IPreprocessBuildWithReport"/> and
|
|
/// <see cref="IPostprocessBuildWithReport"/> compatibility.
|
|
/// </remarks>
|
|
public ProjectConfigurationBuilder()
|
|
: this(null) {}
|
|
|
|
public ProjectConfigurationBuilder(IEnumerable<IConfigurationProvider> orderedConfigProviders)
|
|
{
|
|
m_OrderedConfigProviders = orderedConfigProviders;
|
|
}
|
|
|
|
~ProjectConfigurationBuilder()
|
|
{
|
|
RemoveConfigFromProject();
|
|
}
|
|
|
|
[InitializeOnLoadMethod]
|
|
static void CreateEditorInstanceIfNone()
|
|
{
|
|
if (!(s_EditorInstance is null))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var orderedConfigProviders = GenerateOrderedConfigurationProviders();
|
|
s_EditorInstance = new ProjectConfigurationBuilder(orderedConfigProviders);
|
|
}
|
|
|
|
static IEnumerable<IConfigurationProvider> GenerateOrderedConfigurationProviders()
|
|
{
|
|
return TypeCache.GetTypesDerivedFrom<IConfigurationProvider>()
|
|
.Where(type => !type.IsAbstract)
|
|
.Select(type => (IConfigurationProvider)Activator.CreateInstance(type))
|
|
.OrderBy(prefs => prefs.callbackOrder)
|
|
.ToArray();
|
|
}
|
|
|
|
[InitializeOnEnterPlayMode]
|
|
static void SetUpPlayModeConfigOnEnteringPlayMode(EnterPlayModeOptions _)
|
|
{
|
|
CreateEditorInstanceIfNone();
|
|
ConfigurationUtils.ConfigurationLoader = new EditorConfigurationLoader
|
|
{
|
|
PlayModeConfig = s_EditorInstance.BuildConfiguration()
|
|
};
|
|
}
|
|
|
|
public SerializableProjectConfiguration BuildConfiguration()
|
|
{
|
|
var builder = new ConfigurationBuilder();
|
|
foreach (var provider in m_OrderedConfigProviders)
|
|
{
|
|
provider.OnBuildingConfiguration(builder);
|
|
}
|
|
|
|
return new SerializableProjectConfiguration(builder.Values);
|
|
}
|
|
|
|
public void GenerateConfigFileInProject()
|
|
{
|
|
var config = BuildConfiguration();
|
|
var serializedConfig = EditorJsonUtility.ToJson(config);
|
|
AddConfigToProject(serializedConfig);
|
|
}
|
|
|
|
public static void AddConfigToProject(string config)
|
|
{
|
|
if (!AssetDatabase.IsValidFolder(ConfigurationUtils.StreamingAssetsPath))
|
|
{
|
|
AssetDatabase.CreateFolder("Assets", ConfigurationUtils.StreamingAssetsFolder);
|
|
}
|
|
|
|
File.WriteAllText(ConfigurationUtils.RuntimeConfigFullPath, config);
|
|
AssetDatabase.Refresh();
|
|
}
|
|
|
|
public static void RemoveConfigFromProject()
|
|
{
|
|
AssetDatabase.DeleteAsset(ConfigurationUtils.ConfigAssetPath);
|
|
}
|
|
|
|
int IOrderedCallback.callbackOrder { get; }
|
|
|
|
void IPreprocessBuildWithReport.OnPreprocessBuild(BuildReport report)
|
|
{
|
|
if (m_OrderedConfigProviders is null)
|
|
{
|
|
m_OrderedConfigProviders = GenerateOrderedConfigurationProviders();
|
|
}
|
|
|
|
GenerateConfigFileInProject();
|
|
}
|
|
|
|
void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport report)
|
|
{
|
|
RemoveConfigFromProject();
|
|
}
|
|
|
|
void IDisposable.Dispose()
|
|
{
|
|
RemoveConfigFromProject();
|
|
}
|
|
}
|
|
}
|