패키지 관리자 스크립팅 API를 사용하여 패키지 관리자와 프로그래밍 방식으로 상호작용할 수 있습니다. 예를 들어 타겟 컴퓨터의 플랫폼에 따라 특정 패키지나 버전을 설치해야 할 수 있습니다.
이 시스템의 핵심은 PackageManager.Client 클래스입니다. 이 클래스를 이용하면 스크립팅을 통해 패키지를 찾고, 패키지 리스트를 탐색하고, 패키지를 설치하거나 제거할 수 있습니다.
또 다른 주요 클래스로는 PackageManager.PackageInfo가 있습니다. 이 클래스에는 패키지 매니페스트와 레지스트리에서 획득한 메타데이터 등과 같은 패키지 상태가 들어 있습니다. 예를 들어 패키지에 이용 가능한 버전 리스트 또는 패키지를 찾거나 설치할 때 발생하는 오류 리스트를 가져올 수 있습니다.
이 예제에서는 Client 클래스를 사용하여 프로젝트에 패키지를 설치하거나 추가하는 방법을 설명합니다.
Client.Add 메서드를 호출할 때 패키지 이름 또는 특정 버전의 이름을 지정할 수 있습니다. 예를 들어 Client.Add("com.unity.textmeshpro@1.3.0")
를 사용하면 TextMesh Pro 패키지 1.3.0 버전을 설치하지만, Client.Add("com.unity.textmeshpro")
만 사용하면 해당 패키지의 최신 버전을 설치하거나 최신 버전으로 업데이트합니다.
Client.Add 메서드는 AddRequest 인스턴스를 반환합니다. 이 인스턴스를 사용하면 상태, 오류, 또는 패키지에 새로 추가된 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 클래스를 사용하여 프로젝트에서 패키지에 대해 반복 작업을 수행하는 방법을 설명합니다.
Client.List 메서드는 ListRequest 인스턴스를 반환합니다. 이 인스턴스를 사용하면 List 작업 상태, 오류, 또는 반복할 수 있는 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;
}
}
}
}