[Unity] 어드레서블 Simplify Addressable Names 커스텀Unity/Tips2024. 12. 16. 18:18
Table of Contents
💫문제
유니티에서 에셋을 어드레서블로 체크하면 기본적으로 어드레서블 이름은 해당 에셋의 full path가 된다
만약 어드레서블을 이름으로 불러올 계획이있다면 경우에따라 상당히 불편할 수 있다.
그래서 유니티 어드레서블 기본 기능중에 이름 단순화 기능이 있지만
딱 파일명(확장자도 제거)만 남겨주고 싹 다 날려버린다
이게 또 설계 계획에따라 다르겠지만 이것마저 불편할 수 있다(나는 불편했다)
포맷을 이용해서 단순화 규칙을 커스텀할 수 있으면 좋겠지만 그런건 없다
그래서 코드를 이용해서 어드레서블 이름 단순화 커스텀을 만들어 봤다
📝코드
주의
UnityEditor API를 사용하기 때문에 코드를 Editor폴더를 만들어서 그 안에 넣거나,
코드 전체를 UNITY_EDITOR 전처리문으로 감싸자
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
public static class CustomSimplifyAddressableName
{
[MenuItem("Oniboogie/어드레서블/어드레서블 네임 단순화 커스텀")]
public static void SimplifyAddressableNames()
{
// Addressable Asset Settings를 가져옴
var settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
{
// Addressable Asset Settings가 없을 경우 오류 메시지 출력
EditorUtility.DisplayDialog("실패", "Addressable Asset Settings 못찾음", "OK");
return;
}
// 모든 Addressable 그룹을 순회
foreach (var group in settings.groups)
{
// 그룹이 null이거나 BundledAssetGroupSchema가 없는 경우 건너뜀
if (group == null || group.HasSchema<BundledAssetGroupSchema>() == false)
continue;
// 그룹 내의 모든 엔트리를 순회
foreach (var entry in group.entries)
{
if (entry == null)
continue;
// 엔트리의 GUID를 통해 경로를 가져옴
string assetPath = AssetDatabase.GUIDToAssetPath(entry.guid);
if (string.IsNullOrEmpty(assetPath))
continue;
// 간소화된 이름 생성
string simplifiedName = GetSimplifiedName(assetPath);
if (!string.IsNullOrEmpty(simplifiedName))
{
// 엔트리의 Address를 설정
entry.SetAddress(simplifiedName);
}
}
}
// 변경사항 저장
AssetDatabase.SaveAssets();
EditorUtility.DisplayDialog("완료", "어드레서블 이름 단순화 완료", "OK");
}
private static string GetSimplifiedName(string assetPath)
{
// "Assets/" 접두사를 제거
string relativePath = assetPath.StartsWith("Assets/") ? assetPath.Substring(7) : assetPath;
// 경로를 구성 요소로 분리
string[] pathComponents = relativePath.Split('/');
// 최소한 폴더와 파일 이름이 있어야 함
if (pathComponents.Length < 2)
return null;
// 상위 폴더와 확장자를 제외한 파일 이름 결합
string folderName = pathComponents[0];
// 폴더이름 앞에 00. 01. 같은 숫자 제거
folderName = folderName.Remove(0, 3);
string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(pathComponents[^1]);
return $"{folderName}/{fileNameWithoutExtension}";
}
}
🍎설명 및 사용
동작 프로세스
[어드레서블 세팅 ➡️ 어드레서블 그룹들 ➡️ 어드레서블] 순으로 접근해서 모든 어드레서블을 순회한다
순회하면서 `GetSimplifiedName`함수에서 코딩한 규칙대로 어드레서블 이름을 리턴받아 어드레서블 이름을 수정한다
사용
[MenuItem] 어트리뷰트를 사용해서 에디터 상단 메뉴에 추가했다
결과
실행하면 `{상위폴더 이름}/{파일명}`으로 어드레서블 이름이 바뀐다
여담
다만 나는 해당 파일의 바로 위 폴더 이름 말고 `Assets/`다음 폴더 이름을 원해서 바로 상위 폴더 이름이 아니다
바로 상위 폴더를 원할 경우 68번줄의 아래 부분을
string folderName = pathComponents[0];
배열 길이-2 인덱스로 바꿔주면 된다
(길이-1은 파일명이다)
string folderName = pathComponents[pathComponents.Length - 2];
🔗참조
'Unity > Tips' 카테고리의 다른 글
[Unity] 프로젝트 시작과 함께하는 에셋들 추천 - 무료 에셋 편 (1) | 2024.04.26 |
---|---|
[Unity] 동적 다운로드한 이미지 에셋 수동으로 메모리에서 내리기 (0) | 2024.03.20 |
[Unity 최적화] Dynamic Resolution을 적용해보자! (0) | 2023.08.02 |
[Unity] 유니티 에디터 OpenGL/Vulkan 그래픽스API로 열기 (0) | 2023.08.02 |
[Unity] Adressable에셋 코드로 링크(인스펙터 등록)하기 (0) | 2023.06.24 |