您可以使用包管理器脚本 API 使用 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
参见 术语表 与包管理器进行交互。例如,您可能希望根据目标机器的平台安装特定的包或版本。
该系统高度依赖于 PackageManager.Client 类,您可以使用它来查找包,浏览包列表,并通过脚本安装和卸载包。
另一个重要的类是 PackageManager.PackageInfo,它包含包的状态,包括从 包清单每个包都有一个清单,它向包管理器提供有关包的信息。清单包含信息,例如包的名称、版本、用户说明、对其他包的依赖项(如果有)以及其他详细信息。 更多信息
参见 术语表 和注册表获得的元数据。例如,您可以获得可用于该包的 版本列表,或在定位或安装包时可能发生的 错误列表。
此示例演示如何使用 Client 类将包安装到项目中或将其添加到项目中。
您可以使用 Client.Add 添加包。当您调用 Client.Add
方法时,您只需指定包名,或指定带特定版本的包名。例如,使用 Client.Add("com.unity.textmeshpro")
安装(或更新为)TextMesh Pro 包的最新版本;使用 Client.Add("[email protected]")
安装 TextMesh Pro 包的 1.3.0 版本。
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 类迭代项目中的包。
The Client.List 方法返回一个 ListRequest 实例,您可以使用它来获取列表操作的状态、任何错误或一个 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
文件夹下。
The Client.Embed 方法返回一个 EmbedRequest 实例,您可以使用它来获取嵌入操作的状态、任何错误或一个 Request 响应,其中包含新 嵌入包嵌入包是可以修改的包,您将其存储在 Unity 项目根目录下的 Packages
目录中。这与您从包服务器下载的大多数包不同,这些包是不可变的。 更多信息
参见 术语表 的 PackageInfo 信息。
此示例还使用 Client.List 方法来访问您项目中当前安装的包集合,并选出第一个既不是嵌入包也不是内置包的包。
The Client.List 方法返回一个 ListRequest 实例,您可以使用它来获取列表操作的状态、任何错误或一个 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 类向包管理器注册事件处理程序。The Events 类包含您可以订阅的两个事件,包管理器在以下时刻触发这两个事件:
以下示例演示了如何使用这两个事件。
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}");
}
}
}
}
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!");
}
}
}