✍️ 개요
[ Custom Package 제작하기 ]
흐에에에에--!
매우 험난했던 커스텀 패키지 제작기...
사실 이슈가 많았기 때문에 한 번 더 포스팅하도록 하겠습니다.
분명 나처럼 고생하신 분들이 있을거야...
📌 문제 분석
기분 좋게 새로운 프로젝트를 열어서 커스텀 패키지를 설치했어요.
그리고 Sample도 설치해서 잘 작동하는지 확인하는데...
아니... Addressable이 왜 다 빠져있는거임..?!
진정하고 Addressables Groups을 열어서 확인해보자.
... Addressables Setting이 비어있네요.
생각해보면 당연한게 AddressableAssetsData가 새로운 프로젝트에 없기 때문이죠.
그렇다면 어떻게 AddressableAssetsData를 가져올 수 있을까요?
📌 해결책(실패)
해결책(실패) : AddressableAssetsData 폴더를 샘플에 포함시키기
사실 어떻게 해결하면 좋을지 몰라서 샘플에 넣어봤습니다.
과연 결과는...?
실패-!
확인해보니 샘플에 포함시켜도 새 프로젝트에서 별개의 AddressableAssetsData을 생성하여 사용하더군요.
사실 이렇게 해결될거란 생각은 하지 않았지만...
어쨌든 해결책의 실마리를 잡을 수 있었습니다..!
📌 해결책(성공)
해결책(성공) : 샘플 AddressableAssetGroup을 새 프로젝트 AddressableGroups에 추가하기
2개로 나뉜다면 하나로 합쳐주면 되는거 아니겠습니까?!
새 프로젝트의 AddressableAssetGroup에 샘플에서 사용하는 Group만 추가하는 작업을 하기 때문에 데이터에 문제가 생길 일도 없습니다!
바로 시도해보도록 합시다.
이번에도 InitializeOnLoad 어트리뷰트를 활용하여 다음 작업을 처리하도록 구현하였습니다.
※ InitializeOnLoad : 에디터가 실행되거나 컴파일될 때 해당 클래스가 로드되도록 합니다.
- 프로젝트 내 AddressableAssetSettings가 없다면 생성합니다.
- AddressableAssetGroup에 샘플에서 사용하는 Group을 추가합니다.
※ 아래 포스팅에서 좀 더 자세히 다루고 있으니 원리가 궁금하시면 참고해주세요.
[ 소스 코드 복사하기 ]
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEngine;
[InitializeOnLoad]
public class AddressableAssetAdder
{
private static string folderPath = AddressableAssetSettingsDefaultObject.kDefaultConfigFolder;
private static string settingsName = AddressableAssetSettingsDefaultObject.kDefaultConfigAssetName;
static AddressableAssetAdder()
{
EditorApplication.delayCall -= AddressableAssetAdderHandler;
EditorApplication.delayCall += AddressableAssetAdderHandler;
}
private static void AddressableAssetAdderHandler()
{
AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
{
Debug.Log($"New AddressableAssetSettings created.");
settings = CreateAddressableAssetSettings();
AddressableAssetSettingsDefaultObject.Settings = settings;
}
if (settings.FindGroup("DevelopKit_Basic_Template") == null)
{
string packageVersion = FindPackageVersion();
string assetPath = $"Assets/Samples/DevelopKit Basic Template/{packageVersion}/Basic Template Reference/AddressableAssetsData/AssetGroups/DevelopKit_Basic_Template.asset";
string groupName = "DevelopKit_Basic_Template";
AddressableAssetGroup group = AssetDatabase.LoadAssetAtPath<AddressableAssetGroup>(assetPath);
settings.groups.Add(group);
Debug.Log($"Asset '{assetPath}' added to Addressable Group '{groupName}'.");
}
}
private static AddressableAssetSettings CreateAddressableAssetSettings()
{
AddressableAssetSettings settings = AddressableAssetSettings.Create(folderPath, settingsName, true, true);
// 기본 그룹 생성
if (settings.DefaultGroup == null)
{
var defaultGroup = settings.CreateGroup(
"Default Local Group",
true,
false,
false,
null,
typeof(BundledAssetGroupSchema),
typeof(ContentUpdateGroupSchema)
);
settings.DefaultGroup = defaultGroup;
// 기본 경로 설정
BundledAssetGroupSchema bundleSchema = defaultGroup.GetSchema<BundledAssetGroupSchema>();
if (bundleSchema != null)
{
bundleSchema.BuildPath.SetVariableByName(settings, "LocalBuildPath");
bundleSchema.LoadPath.SetVariableByName(settings, "LocalLoadPath");
}
Debug.Log("Default Addressable Group created");
}
return settings;
}
private static string FindPackageVersion()
{
string packagePath = Application.dataPath.Replace("Assets", string.Empty) +
"/Library/PackageCache/com.developkit.basictemplate/package.json";
string packageText = System.IO.File.ReadAllText(packagePath);
string version = string.Empty;
string[] lines = packageText.Split('\n');
foreach (string line in lines)
{
if (line.Contains("\"version\""))
{
version = line.Split(':')[1].Trim().Replace("\"", string.Empty).Replace(",", string.Empty);
break;
}
}
return version;
}
}
위 스크립트만 추가해주면..?!
와우! 너무 완벽합니다!
이제 샘플을 설치하면 자동으로 AddressableAssetGroup을 추가해주네요.
📝 정리
... 사실 해결 과정이 무난한 것 같아 보이지만 실상은 그렇지 않았습니다.
유니티 포럼과 디스커션을 뒤져봐도 마땅한 해답이 없었어요.
https://discussions.unity.com/t/addressables-in-custom-packages/831011
https://discussions.unity.com/t/addressables-usage-within-a-package/829998
위 두 사이트가 저와 동일한 문제에 대해 토론을 했지만...
해결책을 찾지는 못했습니다. (그래서 그냥 제가 만듬)
혹시라도 더 좋은 해결책이 있다면 공유해주시면 감사하겠습니다!
'유니티(Unity) > 이슈 도감' 카테고리의 다른 글
[Unity 이슈] Package 파일 참조하는 방법 (0) | 2024.12.28 |
---|---|
[Unity 이슈] InitializeOnLoad 주의 사항 (0) | 2024.12.23 |
[Unity 이슈] 커스텀 패키지 종속성 문제 (1) | 2024.12.21 |
[Unity] 직렬화가 되지 않는 문제 (1) | 2024.12.06 |
[Unity] SpriteAtlas GetSprite 함수가 동작하지 않는 문제 (0) | 2024.12.04 |