Unity 包的腳本API

2020-10-26 18:09 更新

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

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

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

將包添加到項(xiàng)目

以下示例演示了如何使用 Client 類來(lái)安裝包或者將包添加到項(xiàng)目中。

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

Client.Add 方法將返回 AddRequest 實(shí)例,可以用來(lái)獲取狀態(tài)、任何錯(cuò)誤或 Request 響應(yīng)(包含新添加的包的 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()
       {
           // 將包添加到項(xiàng)目
           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;
           }
       }
   }
}

瀏覽項(xiàng)目中的包列表

以下示例演示了如何使用 Client 類來(lái)遍歷項(xiàng)目中的包。

Client.List 方法將返回 ListRequest 實(shí)例,可以用來(lái)獲取 List 操作的狀態(tài)、任何錯(cuò)誤或者 Request 響應(yīng)(包含您可以遍歷的 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();    // 列出已為項(xiàng)目安裝的包
           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;
           }
       }
   }
}

在項(xiàng)目中嵌入包

以下示例演示了如何使用 Client 類來(lái)嵌入您的項(xiàng)目中已經(jīng)安裝的某個(gè)包。主方法是 Client.Embed 方法,可生成包的副本并存儲(chǔ)在項(xiàng)目的 Packages 文件夾下面。

Client.Embed 方法將返回 EmbedRequest 實(shí)例,可以用來(lái)獲取 Embed 操作的狀態(tài)、任何錯(cuò)誤或 Request 響應(yīng)(包含新嵌入的包的 PackageInfo 信息)。

此示例還使用 Client.List 方法來(lái)訪問(wèn)項(xiàng)目中當(dāng)前安裝的包的集合,并選擇第一個(gè)既不是嵌入式包也不是內(nèi)置包的包。

Client.List 方法將返回 ListRequest 實(shí)例,可以用來(lái)獲取 List 操作的狀態(tài)、任何錯(cuò)誤或者 Request 響應(yīng)(包含您可以遍歷的 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()
        {
            // 首先獲取一個(gè)已安裝的包的名稱
            LRequest = Client.List();
            EditorApplication.update += LProgress;
        }


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)