You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.1 KiB
98 lines
3.1 KiB
#if ENABLE_EDITOR_GAME_SERVICES
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Unity.Services.Core.Editor.ActivationPopup;
|
|
using UnityEditor;
|
|
using UnityEditor.PackageManager;
|
|
using UnityEngine;
|
|
|
|
using PackageInfo = UnityEditor.PackageManager.PackageInfo;
|
|
|
|
namespace Unity.Services.Core.Editor
|
|
{
|
|
static class ServiceInstallationListener
|
|
{
|
|
[InitializeOnLoadMethod]
|
|
static void RegisterToEvents()
|
|
{
|
|
Events.registeredPackages -= OnPackagesRegistered;
|
|
Events.registeredPackages += OnPackagesRegistered;
|
|
}
|
|
|
|
static void OnPackagesRegistered(PackageRegistrationEventArgs args)
|
|
{
|
|
if (args.added.Any())
|
|
{
|
|
OnPackagesAdded(args.added);
|
|
}
|
|
}
|
|
|
|
static void OnPackagesAdded(IEnumerable<PackageInfo> packageInfos)
|
|
{
|
|
var newServices = GetNewServices(packageInfos);
|
|
if (newServices.Any())
|
|
{
|
|
var inactiveServices = new HashSet<IEditorGameService>(newServices.Where(IsServiceInactive));
|
|
if (inactiveServices.Any())
|
|
{
|
|
ServiceActivationPopupWindow.CreateAndShowPopup(inactiveServices);
|
|
}
|
|
}
|
|
}
|
|
|
|
static IEnumerable<IEditorGameService> GetNewServices(IEnumerable<PackageInfo> packageInfos)
|
|
{
|
|
var output = new HashSet<IEditorGameService>();
|
|
var serviceTypes = TypeCache.GetTypesDerivedFrom<IEditorGameService>();
|
|
foreach (var serviceType in serviceTypes)
|
|
{
|
|
if (IsTypeDefinedInPackages(serviceType, packageInfos))
|
|
{
|
|
foreach (var kvp in EditorGameServiceRegistry.Instance.Services)
|
|
{
|
|
if (kvp.Value.GetType() == serviceType)
|
|
{
|
|
output.Add(kvp.Value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
static bool IsTypeDefinedInPackages(Type type, IEnumerable<PackageInfo> packageInfos)
|
|
{
|
|
var output = false;
|
|
foreach (var packageInfo in packageInfos)
|
|
{
|
|
if (IsTypeDefinedInPackage(type, packageInfo))
|
|
{
|
|
output = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
static bool IsTypeDefinedInPackage(Type type, PackageInfo packageInfo)
|
|
{
|
|
var packageInfoFromAssembly = PackageInfo.FindForAssembly(type.Assembly);
|
|
|
|
return ArePackageInfosEqual(packageInfoFromAssembly, packageInfo);
|
|
}
|
|
|
|
static bool ArePackageInfosEqual(PackageInfo x, PackageInfo y)
|
|
{
|
|
return x != null && y != null && x.name == y.name;
|
|
}
|
|
|
|
internal static bool IsServiceInactive(IEditorGameService editorGameService)
|
|
{
|
|
return editorGameService.Enabler != null && !editorGameService.Enabler.IsEnabled();
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|