📌 개요
[ Custom Package 제작하기 ]
이전에 커스텀 패키지를 만드는 과정을 살펴봤었어요.
그런데 만약 여러분이 스크립트에서 Unity Package Manager을 사용했다면 종속성 문제가 발생했을거예요.
저는 커스텀 패키지에서 Addressable 패키지와 Unitask 패키지를 사용했는데 여기서 문제가 발생했거든요.
그래서 오늘은 종속성 문제를 해결하는 방법에 대해 알아보도록 하겠습니다.
📌 Unity 패키지 종속성 이슈 및 해결
Unity 패키지 종속성 이슈를 해결하는 방법은 매우 간단합니다. 위 사진을 예시로 살펴볼게요.
StartUp 함수에서 Addressable 패키지를 사용하는 것을 확인할 수 있어요.
이때 package.json에서 Addressable을 종속성 정의로 기입하지 않으면 패키지를 설치할 때 문제가 발생한답니다.
그래서 위 사진처럼 package.json에서 dependencies에 패키지를 등록해줍니다.
이때, SemVer(*.*.*) 형식으로 최소 필요 버전을 기입해주세요.
그러면 커스텀 패키지를 설치할 때 UPM(Unity Package Manager)에서 자동으로 종속성 패키지를 설치해줍니다.
📌 Git 패키지 종속성 이슈 및 해결
하지만 Git 패키지는 Unity 패키지와 달리 package.json에 종속성을 선언하여 해결할 수 없습니다.
Unitask와 같은 Git URL을 기반으로 설치된 패키지는 URL 링크가 필요한데요.
package.json에는 SemVer 형식만 가능하기 때문에 다른 방법으로 자동화해야 합니다.
바로 manifest.json을 활용하는 거랍니다!
manifest.json은 Packages 폴더에서 확인할 수 있습니다.
열어보시면 위처럼 SemVer 형식이 아니라 URL로 저장되어 있는 것을 볼 수 있습니다.
그 이유는 Unitask는 Git 패키지이고, 다른 패키지들은 Unity 패키지라서 그렇답니다.
저렇게 mainfest.json에 패키지 이름과 URL을 기입해주기만 하면 되는데요.
이걸 이제 패키지를 설치할 때 자동으로 기입해주는 과정을 구현하면 됩니다.
여기서 중요한 것은 바로 전처리기입니다.
커스텀 패키지에서 Assembly Definition을 선택하여 Version Defines을 추가해주세요.
이러면 패키지의 유무에 따라 전처리기를 활성화/비활성화 설정을 할 수 있습니다.
만약 Unitask가 있다면 위 전처리기 영역이 활성화될거예요.
만약 Unitask가 없다면 따로 manifest.json을 설정하는 코드를 추가하면 됩니다.
그렇다면 Unitask가 프로젝트에 없을 때 자동으로 설치하는 코드를 살펴보겠습니다.
[ 소스 코드 복사하기 ]
using System.IO;
using UnityEditor;
using UnityEngine;
namespace DevelopKit
{
[InitializeOnLoad]
public class BasicTemplateToolbarExtender : Editor
{
private const string UnitaskName = "com.cysharp.unitask";
private const string UnitaskUrl = "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask";
static BasicTemplateToolbarExtender()
{
bool checkUnitaskInstalled = CheckPackageInstalled(UnitaskName);
if (!checkUnitaskInstalled)
{
AddPackage(UnitaskName, UnitaskUrl);
}
}
private static void AddPackage(string name, string url)
{
string manifestPath = Path.Combine(Application.dataPath.Replace("Assets", string.Empty), "Packages/manifest.json");
if (!File.Exists(manifestPath))
{
Debug.LogError($"manifest.json not found at '{manifestPath}'");
return;
}
string manifestText = File.ReadAllText(manifestPath);
if (!manifestText.Contains(UnitaskName))
{
Debug.Log($"{UnitaskName} not found in manifest.json");
var modifiedText = manifestText.Insert(manifestText.IndexOf("dependencies") + 17, $"\t\"{UnitaskName}\": \"{UnitaskUrl}\",\n");
File.WriteAllText(manifestPath, modifiedText);
Debug.Log($"Added {UnitaskName} to manifest.json");
}
UnityEditor.PackageManager.Client.Resolve();
}
private static bool CheckPackageInstalled(string packageName)
{
string manifestPath = Path.Combine(Application.dataPath.Replace("Assets", string.Empty), "Packages/manifest.json");
string manifestText = File.ReadAllText(manifestPath);
return manifestText.Contains(packageName);
}
}
}
여기서 중요한 점은 InitializeOnLoad 어트리뷰트를 사용하는 것입니다.
이 어트리뷰트는 에디터가 시작하거나 컴파일될 때 특정 클래스가 자동으로 로드되도록 설정합니다.
위처럼 정적 생성자를 호출하여 Unitask의 유무를 체크하고 추가하는 작업을 구현합니다.
이 클래스를 커스텀 페키지의 Editor 폴더에 추가해주면 끝입니다.
이러면 커스텀 패키지를 설치할 때, Git 종속성 패키지도 자동으로 설치할 수 있습니다.
글이 친절하지 못했나요?
그렇다면 아래 자료를 참고해보세요!
💡 참고 자료
'유니티(Unity) > 이슈 도감' 카테고리의 다른 글
[Unity 이슈] InitializeOnLoad 주의 사항 (0) | 2024.12.23 |
---|---|
[Unity 이슈] 커스텀 패키지 Addressable 이슈 (1) | 2024.12.22 |
[Unity] 직렬화가 되지 않는 문제 (1) | 2024.12.06 |
[Unity] SpriteAtlas GetSprite 함수가 동작하지 않는 문제 (0) | 2024.12.04 |
[Unity] 마우스 좌표와 월드 좌표 변환 주의 사항 (2) | 2024.12.04 |