Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Скриптинг API для пакетов

Вы можете использовать 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!"); } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3