文档

Unity Engine

Unity Engine

包的脚本 API

Learn how you can use C# to manage packages in your projects.
阅读时间6 分钟最后更新于 1 个月前

可以通过编写 C#脚本使用 Package Manager 脚本 API 与 Package Manager 进行交互。例如,可能需要根据目标设备的平台来安装特定的包或版本。
系统在很大程度上依赖 PackageManager.Client 类,可使用该类来查找包、浏览包列表以及通过脚本安装和卸载包。
另一个重要的类是 PackageManager.PackageInfo,其中包含包的状态,包括从包清单和注册表获取的元数据。例如,可以获取可用于包的版本列表,或者在查找或安装包时可能发生的任何错误列表。

将包添加到项目

以下示例演示了如何使用 Client 类来安装包或者将包添加到项目中。
可以使用 Client.Add 添加包。在调用
Client.Add
方法时,只需指定包名称或具有特定版本的包名称。例如,使用
Client.Add("com.unity.textmeshpro")
,则会安装(或更新到)TextMesh Pro 包的最新版本;使用
Client.Add("com.unity.textmeshpro@1.3.0")
,则会安装 TextMesh Pro 包版本 1.3.0。
Client.Add
方法返回一个 AddRequest 实例,可用于获取状态、任何错误或包含新添加包的 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 操作的状态、任何错误或包含可迭代的 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 实例,可用于获取嵌入操作的状态、任何错误或包含新嵌入包的 PackageInfo 信息的请求响应。
此示例还使用 Client.List 方法来访问项目中当前安装的包的集合,并选择第一个既不是嵌入式包也不是内置包的包。
Client.List 方法返回一个 ListRequest 实例,可用于获取 List 操作的状态、任何错误或包含可迭代的 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 在以下时间点引发这两个事件:
以下示例演示了如何使用这两个事件。

使用 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!"); } }}