Files
Cielonos/Packages/dev.yarnspinner.unity/Editor/Utility/UPMSamplesInstaller.cs
SoulliesOfficial 8186f54e90 新场景,剧情
2026-06-02 12:55:39 -04:00

109 lines
3.9 KiB
C#

using UnityEditor.PackageManager;
using UnityEditor.PackageManager.Requests;
#nullable enable
namespace Yarn.Unity.Editor
{
internal static class UPMSamplesInstaller
{
private const string samplesPackageURL = "https://github.com/YarnSpinnerTool/YarnSpinner-Unity-Samples.git#current";
private static AddRequest? installationRequest;
private static void MonitorInstallation()
{
if (installationRequest == null)
{
return;
}
if (!installationRequest.IsCompleted)
{
return;
}
if (installationRequest.Status == StatusCode.Failure)
{
// it failed, log the error but don't clean up the installation
// request as we need the error it has for determining the
// status
UnityEngine.Debug.LogError(installationRequest.Error);
}
else
{
// we succeeded, so we wipe out the request
installationRequest = null;
}
// we remove ourselves from the update loop
UnityEditor.EditorApplication.update -= MonitorInstallation;
}
internal static void InstallSamples()
{
switch (Status)
{
case YarnPackageImporter.SamplesPackageStatus.Installed:
{
// we already have it, ignoring this
break;
}
case YarnPackageImporter.SamplesPackageStatus.NotInstalled:
{
// it's not installed so we need to request it
installationRequest = Client.Add(samplesPackageURL);
UnityEditor.EditorApplication.update += MonitorInstallation;
break;
}
case YarnPackageImporter.SamplesPackageStatus.Installing:
{
// its in progress so just wait, jeez
break;
}
case YarnPackageImporter.SamplesPackageStatus.FailedToInstall:
{
// it failed but that's fine, we can just go again!
installationRequest = Client.Add(samplesPackageURL);
UnityEditor.EditorApplication.update += MonitorInstallation;
break;
}
}
}
internal static YarnPackageImporter.SamplesPackageStatus Status
{
get
{
// ok so first things first if the package is installed we can
// say that
if (YarnPackageImporter.IsSamplesPackageInstalled)
{
return YarnPackageImporter.SamplesPackageStatus.Installed;
}
// we aren't installed but we could be one of:
// - installing in progress
// - failed while attempting an install
// - not even attempted to install it
if (installationRequest != null)
{
// we might be in the process of installing
if (installationRequest.Status == StatusCode.InProgress)
{
return YarnPackageImporter.SamplesPackageStatus.Installing;
}
// at this point we must have had a failure, so we report
// that
if (installationRequest.Status == StatusCode.Failure)
{
return YarnPackageImporter.SamplesPackageStatus.FailedToInstall;
}
}
// at this point we simply aren't installed
return YarnPackageImporter.SamplesPackageStatus.NotInstalled;
}
}
}
}