版本:Unity 6 (6000.0)
语言:英语
包清单窗口
访问包资源

包的脚本 API

您可以使用包管理器脚本 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 类包含您可以订阅的两个事件,包管理器在以下时刻触发这两个事件:

以下示例演示了如何使用这两个事件。

使用 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!");
        }
    }
}
包清单窗口
访问包资源