API скриптов для пакетов
Скрипты Package Manager и API можно использовать для взаимодействия с Package Manager с помощью скриптов C#. Например, можно установить определенный пакет или версию в зависимости от платформы целевой машины.
Использование скрипта API для управления пакетами зависит от PackageManager.Client класс. С его помощью можно искать пакеты, просматривать их список, а также устанавливать и удалять пакеты из скриптов.
Ещё один важный класс — PackageManager.PackageInfo, который содержит состояние пакета, включая метаданные из манифеста пакета и из реестра. Например, вы можете получить список версий для пакета, или список любых ошибок которые могут возникнуть при поиске или установке пакета.
Добавление пакета в проект
Этот пример показывает, как использовать Client класс, чтобы установить или добавить пакет в проект.
Вы можете использовать Client.Add для добавления пакета. При вызове метода Client.Add вы можете указать только имя пакета или имя с конкретной версией. Например, использование Client.Add("com.unity.textmeshpro") устанавливает (или обновляет) последнюю версию пакета TextMesh Pro. Использование Client.Add("com.unity.textmeshpro@1.3.0") устанавливает версию 1.3.0 пакета TextMesh Pro.
Метод Client.Add возвращает экземпляр AddRequest, который можно использовать для получения статуса, любых ошибок или ответа Request, содержащего информацию PackageInfo о вновь добавленном пакете.
using System;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example {
static class AddPackageExample
{
static AddRequest Request;
[MenuItem("Window/Add Package Example")]
static void Add()
{
// Add a package to the project
Request = Client.Add("com.unity.textmeshpro");
EditorApplication.update += Progress;
}
static void Progress()
{
if (Request.IsCompleted)
{
if (Request.Status == StatusCode.Success)
Debug.Log("Installed: " + Request.Result.packageId);
else if (Request.Status >= StatusCode.Failure)
Debug.Log(Request.Error.message);
EditorApplication.update -= Progress;
}
}
}
}
Просмотр списка пакетов в проекте
Этот пример показывает, как использовать Client класс, чтобы перебрать пакеты проекта.
Метод Client.List возвращает экземпляр ListRequest. Используйте экземпляр ListRequest для получения состояния операции List, любых ошибок или ответа Request, содержащего PackageCollection, который можно итерировать.
using System;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example {
static class ListPackageExample
{
static ListRequest Request;
[MenuItem("Window/List Package Example")]
static void List()
{
Request = Client.List(); // List packages installed for the project
EditorApplication.update += Progress;
}
static void Progress()
{
if (Request.IsCompleted)
{
if (Request.Status == StatusCode.Success)
foreach (var package in Request.Result)
Debug.Log("Package name: " + package.name);
else if (Request.Status >= StatusCode.Failure)
Debug.Log(Request.Error.message);
EditorApplication.update -= Progress;
}
}
}
}
Встраивание пакета в проект
Этот пример показывает, как использовать Client class to встраивание один из пакетов, уже установленных в вашем проекте. Основным методом является Client.Embed метод, который делает копию пакета и хранит его под именем Packages папка проекта.
Метод Client.Embed возвращает экземпляр EmbedRequest. Используйте экземпляр EmbedRequest для получения статуса операции Embed, любых ошибок или ответа Request, содержащего информацию PackageInfo о новом встроенном пакете.
В этом примере также используется метод Client.List для доступа к коллекции пакетов, установленных в данный момент в вашем проекте. Метод в примере выбирает первый пакет, который не встроен и не встроен.
Метод Client.List возвращает экземпляр ListRequest. Используйте экземпляр ListRequest для получения состояния операции List, любых ошибок или ответа Request, содержащего PackageCollection, который можно итерировать.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example
{
static class EmbedPackageExample
{
static String targetPackage;
static EmbedRequest Request;
static ListRequest LRequest;
[MenuItem("Window/Embed Package Example")]
static void GetPackageName()
{
// First get the name of an installed package
LRequest = Client.List();
EditorApplication.update += LProgress;
}
static void LProgress()
{
if (LRequest.IsCompleted)
{
if (LRequest.Status == StatusCode.Success)
{
foreach (var package in LRequest.Result)
{
// Only retrieve packages that are currently installed in the
// project (and are neither Built-In nor already Embedded)
if (package.isDirectDependency && package.source
!= PackageSource.BuiltIn && package.source
!= PackageSource.Embedded)
{
targetPackage = package.name;
break;
}
}
}
else
Debug.Log(LRequest.Error.message);
EditorApplication.update -= LProgress;
Embed(targetPackage);
}
}
static void Embed(string inTarget)
{
// Embed a package in the project
Debug.Log("Embed('" + inTarget + "') called");
Request = Client.Embed(inTarget);
EditorApplication.update += Progress;
}
static void Progress()
{
if (Request.IsCompleted)
{
if (Request.Status == StatusCode.Success)
Debug.Log("Embedded: " + Request.Result.packageId);
else if (Request.Status >= StatusCode.Failure)
Debug.Log(Request.Error.message);
EditorApplication.update -= Progress;
}
}
}
}
Package Manager события
Используйте Events класс, чтобы зарегистрировать обработчик событий в Package Manager. Events классе есть два события, на которые можно подписаться; Package Manager вызывает их в следующие моменты:
- Непосредственно перед Package Manager изменяется список зависимостей (registeringPackages)
- После Package Manager импортирует и компилирует измененный список зависимостей пакетов (registeredPackages)
Следующие примеры демонстрируют, как использовать оба эти события.
Пример использования события registeringPackages
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example
{
public class EventSubscribingExample_RegisteringPackages
{
public EventSubscribingExample_RegisteringPackages()
{
// Subscribe to the event using the addition assignment operator (+=).
// This executes the code in the handler whenever the event is fired.
Events.registeringPackages += RegisteringPackagesEventHandler;
}
// The method is expected to receive a PackageRegistrationEventArgs event argument.
void RegisteringPackagesEventHandler(PackageRegistrationEventArgs packageRegistrationEventArgs)
{
Debug.Log("The list of registered packages is about to change!");
foreach (var addedPackage in packageRegistrationEventArgs.added)
{
Debug.Log($"Adding {addedPackage.displayName}");
}
foreach (var removedPackage in packageRegistrationEventArgs.removed)
{
Debug.Log($"Removing {removedPackage.displayName}");
}
// The changedFrom and changedTo collections contain the packages that are about to be updated.
// Both collections are guaranteed to be the same size with indices matching the same package name.
for (int i = 0; i <= packageRegistrationEventArgs.changedFrom.Count; i++)
{
var oldPackage = packageRegistrationEventArgs.changedFrom[i];
var newPackage = packageRegistrationEventArgs.changedTo[i];
Debug.Log($"Changing ${oldPackage.displayName} version from ${oldPackage.version} to ${newPackage.version}");
}
}
}
}
Пример использования события registeredPackages
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example
{
public class EventSubscribingExample_RegisteredPackages
{
// You must use '[InitializeOnLoadMethod]' or '[InitializeOnLoad]' to subscribe to this event.
[InitializeOnLoadMethod]
static void SubscribeToEvent()
{
// This causes the method to be invoked after the Editor registers the new list of packages.
Events.registeredPackages += RegisteredPackagesEventHandler;
}
static void RegisteredPackagesEventHandler(PackageRegistrationEventArgs packageRegistrationEventArgs)
{
// Code executed here can safely assume that the Editor has finished compiling the new list of packages
Debug.Log("The list of registered packages has changed!");
}
}
}