スポンサーリンク

【Unity】指定したフォルダのアセットにAddressableラベルを一括で設定するエディタ拡張

スポンサーリンク
Unity

使い方

使い方としては、ラベルを一括で設定したいフォルダのパスを指定して、あらかじめ登録されているラベル名の中から、設定したいラベルを選んで設定ボタンを押すことで、指定したフォルダ内の全アセットにラベルを設定することが出来ます。

ファルダのパスは、「フォルダを右クリック → CopyPath」でパスをコピーすることが出来ます!

ラベルの追加

ラベルの候補を追加するには、「AssetManagement → Addressables → Groups」を選択して、設定ウィンドウを開きます。

ウィンドウを開いたら、「Tools → Window → Labels」を選択します。

設定を開いたら、画像右下の+ボタンを押して、ラベルを追加します。

これで、ラベル名の候補がエディタ拡張のウィンドウに表示されるようになります!

動作確認

正常にラベルが設定されたかを確認するには、AddressablesGroupsウィンドウを開いて、指定したフォルダに中にあるアセットが一覧に表示されているかを確認します。

アセット単体で確認するには、アセットのInspentorを開いて、Addressableにチェックが入っているかと、正しいパスが設定されているかを確認します。

スクリプト

using UnityEditor;
using UnityEngine;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using System.Collections.Generic;

public class AddressableLabelSetter : EditorWindow
{
    private string folderPath = "Assets/YourFolder"; // 変更が必要
    private string selectedLabel = "";
    private List<string> labelOptions = new List<string>();

    [MenuItem("Tools/Set Addressable Labels")]
    public static void ShowWindow()
    {
        GetWindow<AddressableLabelSetter>("Set Addressable Labels");
    }

    private void OnEnable()
    {
        // ウィンドウが開かれたとき、ラベルのリストを取得する
        UpdateLabelOptions();
    }

    private void OnGUI()
    {
        GUILayout.Label("設定", EditorStyles.boldLabel);
        folderPath = EditorGUILayout.TextField("フォルダパス", folderPath);

        GUILayout.Label("ラベル名", EditorStyles.label);
        if (labelOptions.Count > 0)
        {
            int selectedIndex = labelOptions.IndexOf(selectedLabel);
            selectedIndex = EditorGUILayout.Popup(selectedIndex, labelOptions.ToArray());
            selectedLabel = labelOptions[selectedIndex];
        }
        else
        {
            GUILayout.Label("利用可能なラベルがありません。", EditorStyles.helpBox);
        }

        if (GUILayout.Button("ラベルを設定"))
        {
            SetAddressableLabels();
        }
    }

    private void UpdateLabelOptions()
    {
        labelOptions.Clear();
        AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.Settings;

        foreach (string label in settings.GetLabels())
        {
            labelOptions.Add(label);
        }

        if (labelOptions.Count > 0)
        {
            selectedLabel = labelOptions[0];
        }
    }

    private void SetAddressableLabels()
    {
        if (string.IsNullOrEmpty(selectedLabel))
        {
            Debug.LogError("ラベルが選択されていません。");
            return;
        }

        string[] guids = AssetDatabase.FindAssets("", new[] { folderPath });
        AddressableAssetSettings settings = AddressableAssetSettingsDefaultObject.Settings;

        foreach (string guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            AddressableAssetEntry entry = settings.FindAssetEntry(guid);

            if (entry == null)
            {
                entry = settings.CreateOrMoveEntry(guid, settings.DefaultGroup);
            }

            if (entry != null && !entry.labels.Contains(selectedLabel))
            {
                entry.SetLabel(selectedLabel, true, true);
                Debug.Log($"ラベル '{selectedLabel}' がアセット '{path}' に設定されました。");
            }
        }

        // 設定を保存
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        Debug.Log("ラベル設定が完了しました。");
    }
}

このスクリプトを、プロジェクトのEditorフォルダ内に追加します。Editorフォルダは、プロジェクト内であれば基本どこに配置しても問題ありません。

スクリプトを導入して、動作に問題がなければ作業は終了です!

お疲れさまでした!

タイトルとURLをコピーしました