Unity 包的腳本API

2020-10-26 18:09 更新

您可以使用 Package Manager 腳本 API 以編程方式與 Package Manager 進行交互。例如,可能需要根據(jù)目標機器的平臺來安裝特定的包或版本。

系統(tǒng)的核心是 PackageManager.Client 類,可使用該類來查找包、瀏覽包列表以及通過腳本安裝和卸載包。

另一個重要的類是 PackageManager.PackageInfo,其中包含包的狀態(tài),包括從包清單和注冊表獲取的元數(shù)據(jù)。例如,可獲取適用于包的版本列表,或者獲取在查找或安裝包時可能發(fā)生的所有錯誤的列表

將包添加到項目

以下示例演示了如何使用 Client 類來安裝包或者將包添加到項目中。

在調用 Client.Add 方法時,您可以指定包名稱或具有特定版本的名稱。例如,如果使用 Client.Add("com.unity.textmeshpro@1.3.0"),則會安裝 TextMesh Pro 包版本 1.3.0,但如果僅使用 Client.Add("com.unity.textmeshpro"),則會安裝(或更新到)該包的最新版本。

Client.Add 方法將返回 AddRequest 實例,可以用來獲取狀態(tài)、任何錯誤或 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()
       {
           // 將包添加到項目
           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 操作的狀態(tài)、任何錯誤或者 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();    // 列出已為項目安裝的包
           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 操作的狀態(tài)、任何錯誤或 Request 響應(包含新嵌入的包的 PackageInfo 信息)。

此示例還使用 Client.List 方法來訪問項目中當前安裝的包的集合,并選擇第一個既不是嵌入式包也不是內置包的包。

Client.List 方法將返回 ListRequest 實例,可以用來獲取 List 操作的狀態(tài)、任何錯誤或者 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()
        {
            // 首先獲取一個已安裝的包的名稱
            LRequest = Client.List();
            EditorApplication.update += LProgress;
        }


        static void LProgress()
        {
            if (LRequest.IsCompleted)
            {
                if (LRequest.Status == StatusCode.Success)
                {
                    foreach (var package in LRequest.Result)
                    {
                        // 僅獲取項目中當前安裝的包
                        //(既不是內置的包也不是已嵌入的包)
                        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)
        {
            // 將包嵌入項目中
            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;
            }
        }
    }
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號