패키지 관리자 스크립팅 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;
}
}
}
}
이 예제에서는 Client 클래스를 사용하여 프로젝트에 이미 설치된 패키지 중 하나를 포함하는 방법을 설명합니다. 메인 메서드는 Client.Embed 메서드입니다. 이 메서드는 패키지의 복사본을 생성한 후 프로젝트의 Packages
폴더에 저장합니다.
Client.Embed 메서드는 EmbedRequest 인스턴스를 반환합니다. 이 인스턴스를 사용하면 Embed 작업 상태, 오류, 또는 패키지에 새로 포함된 PackageInfo 정보가 들어 있는 요청 리스폰스를 가져올 수 있습니다.
또한 이 예제에서는 Client.List 메서드를 사용하여 프로젝트에 현재 설치된 패키지 컬렉션에 액세스한 후 포함되거나 내장되지 않은 첫 번째 패키지를 선택합니다.
Client.List 메서드는 ListRequest 인스턴스를 반환합니다. 이 인스턴스를 사용하면 List 작업 상태, 오류, 또는 반복할 수 있는 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;
}
}
}
}