Unity
[Unity] CustomEditor - 자동으로 addressable 활성화하기
devchop
2025. 3. 17. 16:46
scriptableObject를 사용하면서, SkillData를 상속받은 여러 종류의 스킬들을 정의했다(strikeSkill , rangeSkill, buffSkill등등..)
나는 addressable을 로드하기때문에 각 scriptableObject의 addressable을 활성화하고 라벨을 설정해야하는데, 이걸 자동으로 설정하게끔 만들어보았다.
OnEnable() 과 OnInspectorGUI() 호출시, addressable이 활성화되지않았다면 활성화 후 , 내가원하는 label을 지정해준다.
라벨 설정할때, entry.label.clear()을 해주는데, 종종 동일한라벨이 여러개 설정되는 버그가 있어서 clear후 새로 넣어주는 방법으로 변경했다.
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;
[CustomEditor(typeof(SkillData), true)]
public class SkillDataEditor : Editor
{
protected virtual void OnEnable()
{
//...
skillData = (SkillData)target;
EnforceAddressable();
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EnforceAddressable();
serializedObject.ApplyModifiedProperties();
}
private void EnforceAddressable()
{
AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.Settings;
if (settings == null)
{
Debug.LogError("Addressable 설정을 찾을 수 없습니다.");
return;
}
// SkillData가 저장된 에셋인지 확인 (메모리에만 있는 경우 무시)
if (!EditorUtility.IsPersistent(skillData)) return;
// SkillData의 Asset Path 가져오기 (파일 전체 경로)
string assetPath = AssetDatabase.GetAssetPath(skillData.GetInstanceID());
if (string.IsNullOrEmpty(assetPath))
{
Debug.LogError("SkillData의 Asset Path를 찾을 수 없습니다.");
return;
}
// Addressable 설정 확인 및 적용
string guid = AssetDatabase.AssetPathToGUID(assetPath);
AddressableAssetEntry entry = settings.FindAssetEntry(guid);
// Addressable이 이미 정상적으로 설정되어 있다면 중간에서 return
if (entry != null && entry.address == assetPath && entry.labels.Count == 1 && entry.labels.Contains("skillDatas")) return;
// Addressable이 설정되지 않은 경우 자동 추가
if (entry == null) entry = settings.CreateOrMoveEntry(guid, settings.DefaultGroup);
// Addressable 이름을 에셋 경로(Assets/...)로 강제 설정
if (entry.address != assetPath) entry.address = assetPath;
entry.labels.Clear();
entry.SetLabel("skillDatas", true, true);
// 변경 사항 저장
settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryModified, entry, true);
AssetDatabase.SaveAssets();
}
}