您可以使用 Package Manager 脚本 API 以编程方式与 Package Manager 进行交互。例如,可能需要根据目标机器的平台来安装特定的包或版本。
系统的核心是 PackageManager.Client 类,可使用该类来查找包、浏览包列表以及通过脚本安装和卸载包。
另一个重要的类是 PackageManager.PackageInfo,其中包含包的状态,包括从包清单和注册表获取的元数据。例如,可获取适用于包的版本列表,或者获取在查找或安装包时可能发生的所有错误的列表。
This example demonstrates how to use the Client class to install or add a package to the Project.
在调用 Client.Add 方法时,您可以指定包名称或具有特定版本的名称。例如,如果使用 Client.Add("com.unity.textmeshpro@1.3.0")
,则会安装 TextMesh Pro 包版本 1.3.0,但如果仅使用 Client.Add("com.unity.textmeshpro")
,则会安装(或更新到)该包的最新版本。
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;
}
}
}
}
This example demonstrates how to use the Client class to iterate over the packages in the Project.
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;
}
}
}
}