Вы можете использовать API сценариев диспетчера пакетов для взаимодействия с диспетчером пакетов с помощью скриптов C#фрагмента кода, который позволяет создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
См. в Словарь. Например, вы можете установить определенный пакет или версию в зависимости от платформы целевой машины.
Система в значительной степени зависит от класса 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, который можно использовать для получения статуса операции 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 для встраивания одного из пакеты уже установлены в вашем проекте. Основным методом является метод Client.Embed, который создает копию пакета и сохраняет ее в Packages
вашего проекта.
Метод Client.Embed возвращает EmbedRequest, который можно использовать для получения статуса операции Embed, любых ошибок или ответа Request, который содержит Информация о пакете для нового встроенного пакета
См. в Словарь.
В этом примере также используется метод Client.List для доступа к набору пакетов, установленных в данный момент в вашем проекте, и выбора первого из них. который не встроен и не встроен.
Метод Client.List возвращает 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;
}
}
}
}
События диспетчера пакетов
Используйте класс Events для регистрации обработчика событий в диспетчере пакетов. Класс Events содержит два события, на которые вы можете подписаться и которые диспетчер пакетов вызывает в следующих точках:
- Непосредственно перед тем, как диспетчер пакетов изменит список зависимостей
См. в Словарь (registeringPackages) - После того как диспетчер пакетов импортирует и скомпилирует измененный список зависимостей пакетов (registeredPackages)
В следующих примерах показано, как использовать оба этих события.
Пример использования события RegistrationPackages
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!");
}
}
}