Unity 패키지 관리자 스크립팅 API 가이드

소개

Unity의 패키지 관리자 스크립팅 API를 사용하면 C# 스크립트를 통해 패키지 관리자와 상호작용할 수 있습니다. 이를 통해 특정 플랫폼에 맞는 패키지 설치, 패키지 리스트 탐색 등을 쉽게 수행할 수 있습니다.

주요 클래스

  1. PackageManager.Client: 패키지를 찾고, 설치하며, 제거하는데 필요한 메소드가 포함되어 있습니다.
  2. 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를 효과적으로 활용하여 프로젝트를 관리하는 데 필요한 기본기를 제공합니다. 적절한 패키지를 추가하고, 리스트를 탐색하며, 이벤트를 통해 상태를 관리하여 원하는 기능을 구현해 보세요.