Unity 패키지 관리자 스크립팅 API 가이드
소개
Unity의 패키지 관리자 스크립팅 API를 사용하면 C# 스크립트를 통해 패키지 관리자와 상호작용할 수 있습니다. 이를 통해 특정 플랫폼에 맞는 패키지 설치, 패키지 리스트 탐색 등을 쉽게 수행할 수 있습니다.
주요 클래스
- PackageManager.Client: 패키지를 찾고, 설치하며, 제거하는데 필요한 메소드가 포함되어 있습니다.
- PackageManager.PackageInfo: 패키지의 메타데이터와 상태 정보를 담고 있습니다.
패키지 추가하기
패키지를 프로젝트에 추가하기 위해 Client.Add()
메서드를 사용합니다.
코드 예시
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.List()
메서드를 사용하여 현재 설치된 패키지 목록을 가져올 수 있습니다.
코드 예시
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.Embed()
메서드를 통해 이미 설치된 패키지를 프로젝트에 포함시킬 수 있습니다.
코드 예시
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;
}
}
}
}
활용 예제
- 프로젝트에 필수 패키지를 포함시켜 패키지 의존성을 관리합니다.
- 패키지의 버전을 관리하고 업데이트 시 논리적 변경점을 명확히 합니다.
패키지 관리자 이벤트
Events
클래스를 사용하여 패키지 관리자에서 발생하는 이벤트를 구독할 수 있습니다.
이벤트 구독 코드 예시
using UnityEditor.PackageManager;
using UnityEngine;
namespace Unity.Editor.Example
{
public class EventSubscribingExample_RegisteringPackages {
public EventSubscribingExample_RegisteringPackages() {
Events.registeringPackages += RegisteringPackagesEventHandler;
}
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}");
}
}
}
}
활용 예제
- 패키지 등록이 발생할 때마다 변경 내용을 기록하여 관리할 수 있습니다.
- 패키지 업데이트 이전이나 삭제 시 사용자 정의 로직을 추가하여 안정성을 높입니다.
결론
이 가이드는 Unity의 패키지 관리자 스크립팅 API를 효과적으로 활용하여 프로젝트를 관리하는 데 필요한 기본기를 제공합니다. 적절한 패키지를 추가하고, 리스트를 탐색하며, 이벤트를 통해 상태를 관리하여 원하는 기능을 구현해 보세요.