Unity

Custom Unity Package를 UPM으로 배포하는 방법

CommitGuy 2024. 7. 16. 19:00

UPM (Unity Package Manager) 란?

 UPM은 프로젝트에 필요한 기능등을 모듈단위로 분리해 기능을 제작하고 Package Manager를 통해 편리하게 다운로드해 사용할 수 있는 Unity 기능.

 UPM을 사용하지 않는다면 '.unityproject'를 받아 import하여 내 로컬 프로젝트의 Assets 폴더 아래에 들어가게 되어 외부 패키지를 삭제해야 하거나 할때면 일일이 찾아서 삭제해야 하는 불편함이 존재했음

 

그러나 UPM을 사용하면 패키지들이 패키지 단위로 묶여있고 독립적으로 관리되어 필요할 때 패키지를 업데이트하고 삭제할 수 있어 프로젝트를 깔끔하게 유지할 수 있다.

UPM 사용 이유

Custom Package를 UPM으로 만드는 방법

 처음엔 Unity Project에서 내가 만들고자 하는 Unity Package를 만든다. 그리고 그 후 만든 Unity Package를 UPM으로 만들기 위해선 UPM의 Package Layout 규칙대로 리소스 및 코드를 맞춰야 한다.

UPM 구조에 맞게 프로젝트 분해 및 재배열

 필자의 경우 여기에서 많이 햇깔렸었는데 .unitypackage로 내가 만든 plugin을 배포할때는 Unity에서 plugin 개발 후 Export Package로 Export만 하면 됐는데 UPM을 사용할 경우 유니티 프로젝트 자체가 필요가 없고 내가 만든 plugin에 있는 리소스와 코드를 따로 가져와 UPM 구조에 맞게 재배열해야 했다. 완전한 분해와 재배열을 해야한다. 

 

이해하기 쉽게 필자가 만든 UPM Unity SDK를 하나 예제로 가져와 그 예제를 통해 UPM을 만드는 과정을 보겠다.

 

1. Unity Plugin 개발 단계

Plugin 개발 단계

UPM으로 변환전 Plugin 개발단계에서의 Project Structure이다

이걸 UPM Layout 구조로 변경해야 한다

 

2. UPM Layout 구조로 재구축

UPM Layout 구조

UPM Layout

 

위와 같은 구조로 프로젝트를 설정해야 한다 각각의 기능에 대한 설명은 아래 링크를 참조하자

https://docs.unity3d.com/kr/2021.1/Manual/cus-layout.html

 

패키지 레이아웃 - Unity 매뉴얼

다음은 커스텀 패키지에 대한 권장 패키지 레이아웃입니다.

docs.unity3d.com

 

 

UPM Structurize

UPM Structure에 맞게 폴더 및 파일들을 추가하고 기존 코드는 새로만든 Runtime 폴더 아래에 둔다

Assembly Definition 생성

Package내 Script가 있는 경우 반드시 어셈블리 정의 파일(.asmdef)를 생성해야 함

Create > Assembly Definition 클릭 후 어셈블리 정의 파일 생성

 

Assembly 정의 파일 생성 위치 및 디자인 가이드 라인

1. [Editor 폴더] 어셈블리 정의 파일 : Editor/MyCompany.MyFeature.Editor.asmdef

2. [Runtime 폴더] 어셈블리 정의 파일 : Runtime/MyCompany.MyFeature.Runtime.asmdef

3. [Tests 폴더]의 Editor & Runtime 어셈블리 정의 파일

 - Tests/Editor/MyCompany.MyFeature.Editor.Tests.asmdef

 - Tests/Runtime/MyCompany.MyFeature.Runtime.Tests.asmdef

 

참조

https://docs.unity3d.com/kr/2021.1/Manual/cus-asmdef.html

 

어셈블리 정의 및 패키지 - Unity 매뉴얼

패키지 내 스크립트는 반드시 어셈블리 정의 파일(.asmdef)과 연결해야 합니다. 어셈블리 정의 파일은 .NET 에코시스템의 C# 프로젝트에 대한 Unity의 대응 버전입니다. 어셈블리 정의 파일의 명시적

docs.unity3d.com

 

package.json 작성

 package.json을 작성하여 패키지의 특정 버전에 관한 정보를 관리

package.json은 패키지에 관한 중요 정보를 담고 패키지의 루트에 위치

 

아래는 package.json의 예시

{
  "name": "com.unity.example",
  "version": "1.2.3",
  "displayName": "Package Example",
  "description": "This is an example package",
  "unity": "2019.1",
  "unityRelease": "0b5",
  "documentationUrl": "https://example.com/",
  "changelogUrl": "https://example.com/changelog.html",
  "licensesUrl": "https://example.com/licensing.html",
  "dependencies": {
    "com.unity.some-package": "1.0.0",
    "com.unity.other-package": "2.0.0"
 },
 "keywords": [
    "keyword1",
    "keyword2",
    "keyword3"
  ],
  "author": {
    "name": "Unity",
    "email": "unity@example.com",
    "url": "https://www.unity3d.com"
  }
}

 

[필수 프로퍼티]

- name : 공식적으로 등록되는 패키지 이름. 역순 도메인 이름 표기법을 사용하는 Unity 패키지 관리자 명명 규칙을 준수, 이 이름은 고유식별자로 PackageManager 창의 리스트 뷰에 나타나는 사용자 친화적 이름은 아님

- version : 패키지 버전 숫자(MAJOR.MINOR.PATCH)

 

[의무 프로퍼티]

기술적으로는 선택사항이지만 패키지를 쉽게 검색하고 사용자에게 더 나은 경험을 제공하기 위해서는 값을 지정하는게 좋은 프로퍼티

- description : 패키지에 대한 간략한 설명, 이 텍스트는 Package Manager창의 세부 정부 뷰에 나타남

- displayName : Unity Editor에 표시되는 사용자 친화적 이름

- unity : 패키지와 호환 가능한 가장 낮은 unity 버전을 표기

 

[옵션 프로퍼티]

선택 사항 프로퍼티로 아래 참조를 참고

 

참조

https://docs.unity3d.com/kr/2021.1/Manual/upm-manifestPkg.html

 

패키지 매니페스트 - Unity 매뉴얼

Unity는 패키지 매니페스트 파일(package.json)을 사용하여 특정 패키지의 특정 버전에 관한 정보를 관리합니다. 패키지 매니페스트는 항상 패키지의 루트에 위치하며, 패키지에 관한 중요 정보(예:

docs.unity3d.com

 

3. UPM Structure만 남기고 나머지 다 제거

 여기까지 git에 commit을 한 후 git에서 따로 branch를 만든다. 필자의 경우 upm으로 브랜치 생성

따로 브런치 생성

upm structure 구조를 가장 root directory로 옮기고 나머지는 전부 제거한다

 

refactoring upm

그 후 Git에 올린다

 

3. UPM 으로 해당 패키지를 받는 방법

Github Clone Code

 

Github에 오른쪽 상단의 Code를 눌러 HTTPS 탭의 web url을 복사한다

 

Unity의 Package Manager에 들어가 Add package from git URL을 클릭 복사한 url을 입력하고 upm이 적용된 브랜치는 upm 브랜치이니 url 마지막에 #upm을 추가한다

Ex] https://github.com/DevCoop-code/llama.unity.git#upm

 

다음과 같이 Unity Package Manager에 뜨는걸 확인할 수 있고 설치하면 사용 가능해진다