Files
2025-11-30 08:35:03 +02:00

159 lines
5.3 KiB
C#

// SPDX-FileCopyrightText: 2023 Unity Technologies and the glTFast authors
// SPDX-License-Identifier: Apache-2.0
#if UNITY_2021_2_OR_NEWER
#define HYPERLINK
#define COMBINED
#endif
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEditor.PackageManager.Requests;
using UnityEngine;
namespace GLTFast.Editor
{
[InitializeOnLoad]
static class PackageSetupCheck
{
static ListRequest s_ListRequest;
static PackageReplacement[] s_Packages = new PackageReplacement[]
{
new PackageReplacement()
{
name = "Draco for Unity",
identifier = "com.unity.cloud.draco",
legacyName = "Draco 3D Data Compression",
legacyIdentifier = "com.atteneder.draco",
feature = "KHR_draco_mesh_compression",
featureUri = "https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md",
upgradeDocsUri = "https://docs.unity3d.com/Packages/com.unity.cloud.draco@5.0/manual/upgrade-guide.html#transition-to-draco-for-unity"
},
new PackageReplacement()
{
name = "KTX for Unity",
identifier = "com.unity.cloud.ktx",
legacyName = "KTX/Basis Universal Texture",
legacyIdentifier = "com.atteneder.ktx",
feature = "KHR_texture_basisu",
featureUri = "https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_basisu/README.md",
upgradeDocsUri = "https://docs.unity3d.com/Packages/com.unity.cloud.ktx@3.2/manual/upgrade-guide.html#transition-to-ktx-for-unity"
}
};
static PackageSetupCheck()
{
EditorApplication.update += WaitForPackageList;
s_ListRequest = Client.List(true);
#if HYPERLINK
EditorGUI.hyperLinkClicked += HyperLinkClicked;
#endif
}
static void WaitForPackageList()
{
if (s_ListRequest != null && s_ListRequest.IsCompleted)
{
if (s_ListRequest.Error == null)
{
foreach (var package in s_Packages)
{
CheckForLegacyPackage(s_ListRequest.Result, package);
}
}
s_ListRequest = null;
EditorApplication.update -= WaitForPackageList;
}
}
static void CheckForLegacyPackage(
PackageCollection packages,
PackageReplacement pkg
)
{
var legacyFound = false;
foreach (var packageInfo in packages)
{
if (packageInfo.name == pkg.legacyIdentifier)
{
legacyFound = true;
}
}
if (legacyFound)
{
pkg.LogUpgradeMessage();
}
}
#if HYPERLINK
static void HyperLinkClicked(EditorWindow window, HyperLinkClickedEventArgs args)
{
if(args.hyperLinkData.TryGetValue("command", out var command) && command=="replace")
{
if (args.hyperLinkData.TryGetValue("arg", out var pkg))
{
foreach (var package in s_Packages)
{
if (package.legacyIdentifier == pkg)
{
ReplacePackage(package);
}
}
}
}
}
#endif
#if COMBINED
static void ReplacePackage(PackageReplacement package)
{
if (EditorUtility.DisplayDialog(
"Package Upgrade",
$"Replace deprecated {package.legacyName} ({package.legacyIdentifier}) by {package.name} ({package.identifier})?",
"Replace",
"Cancel"
)
)
{
Client.AddAndRemove(
new[] { package.identifier },
new[] { package.legacyIdentifier }
);
}
}
#endif
}
struct PackageReplacement
{
public string name;
public string identifier;
public string legacyName;
public string legacyIdentifier;
public string feature;
public string featureUri;
public string upgradeDocsUri;
public void LogUpgradeMessage()
{
var message = $"Deprecated package <i>{legacyName}</i> (<i>{legacyIdentifier}</i>) detected!\n" +
$"<i>glTFast</i> now requires <i>{name}</i> (<i>{identifier}</i>) instead to provide support for " +
$"<a href=\"{featureUri}\">{feature}</a>.\n";
#if HYPERLINK
message +=
$"You can <a command=\"replace\" arg=\"{legacyIdentifier}\">automatically replace</a> the " +
$"deprecated package or do it manually following the <a href=\"{upgradeDocsUri}\">documentation</a>.";
#else
message += "To upgrade the package, follow the documentation at " +
$"<a href=\"{upgradeDocsUri}\">{upgradeDocsUri}</a>";
#endif
Debug.LogWarning(message);
}
}
}