【Unity】【Addressable】アドレス / グループ / ラベルをスクリプトから操作する方法まとめ

Addressableアセットシステムのアドレスやグループ、ラベルをスクリプトから操作する方法をまとめました。

Unity2019.3.5
Addressables 1.7.5

設定ファイルを取得する

アドレスやグループなどをスクリプトから操作するには、まずAddressableAssetSettingsインスタンスが必要になります。
この設定ファイルは大抵のプロジェクトには一つしかないので、以下のように書けば設定ファイルを取得できます。

using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
    }
}

もしプロジェクト内に複数の設定ファイルがある場合には普通に他のアセットを取得するのと同様にすればOKです、

using UnityEditor.AddressableAssets.Settings;
using UnityEditor;

public class AddressableExample
{
    private static void Example()
    {
        var settings = Selection.activeObject as AddressableAssetSettings;
    }
}

グループを操作する

次にグループを操作する方法をまとめます。

グループを取得する

まずグループの取得方法です。
デフォルトグループは以下のように取得します。

using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.DefaultGroup;
    }
}

特定の名前のグループを取得する方法は以下の通りです。

using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.FindGroup("Character_01");
        // こんな感じで探すこともできる
        //var group = settings.FindGroup(x => x.Name.Contains("Character_01"));
    }
}

全てのグループをListで取得することもできます。

using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var groups = settings.groups;
    }
}
グループを作る

次にグループを作ります。
グループの作り方は若干複雑ですが、以下のようにテンプレートから作るのが簡単だと思います。

using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        
        // 適当なAddressableAssetGroupTemplateを一つ取得
        var groupTemplate = settings.GetGroupTemplateObject(0) as AddressableAssetGroupTemplate;
        
        // Groupを作成
        AddressableAssetGroup newGroup = settings.CreateGroup("Example Group", false, false, true, null, groupTemplate.GetTypes());
        groupTemplate.ApplyToAddressableAssetGroup(newGroup);
        
        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}
グループを削除する

グループを削除するにはAddressableAssetSettings.RemoveGroup()を使います。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.FindGroup("Character_02");
        settings.RemoveGroup(group);
        
        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}

エントリを操作する

各グループの中に存在するアセットやそのアドレスの情報をエントリといいます。
この節ではエントリの操作方法をまとめます。

エントリを取得する

エントリを取得するにはAddressableAssetSettings.FindAssetEntry()に取得したいエントリが示すアセットのguidを渡します。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");
        
        var entry = settings.FindAssetEntry(guid);
    }
}

またグループオブジェクトからもそのグループに所属するエントリを検索したり、全エントリを取得することができます。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.DefaultGroup;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");

        // グループからエントリを取得する
        var entry = group.GetAssetEntry(guid);

        // グループに所属するエントリの一覧を取得する
        var entries = group.entries;
    }
}
エントリを新規作成 / 移動する

エントリを特定のグループに追加するにはAddressableAssetSettings.CreateOrMoveEntry()を使います。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.DefaultGroup;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");
        
        // 指定したグループにエントリを生成・移動
        settings.CreateOrMoveEntry(guid, group);
        
        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}
エントリを削除する

エントリをグループから削除するにはAddressableAssetSettings.RemoveAssetEntry()を使います。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");
        
        // エントリを削除
        settings.RemoveAssetEntry(guid);
        
        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}

以下のようにグループオブジェクトにエントリを渡して削除することもできます。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.DefaultGroup;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");

        // 指定したグループからエントリを削除
        var entry = group.GetAssetEntry(guid);
        group.RemoveAssetEntry(entry);

        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}

ラベルを操作する

次にラベルを操作します。

ラベルを一覧に追加・削除する

ラベルをラベル一覧に追加・削除するには下記のようにAddressableAssetSettingsを操作します。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;

        // ラベルを一覧に追加する
        settings.AddLabel("Example01");
        
        // ラベルを一覧から削除する
        settings.RemoveLabel("Example01");
        
       // 変更を保存
        AssetDatabase.SaveAssets();
    }
}
エントリにラベルを追加・削除する

エントリにラベルを追加・削除するには以下のようにAddressableAssetEntry.SetLabel()を使用します。

using UnityEditor;
using UnityEditor.AddressableAssets;

public class AddressableExample
{
    public static void Example()
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;
        var group = settings.DefaultGroup;
        var guid = AssetDatabase.AssetPathToGUID("Assets/Prefabs/Character_01/Character01.prefab");

        // エントリにラベルを追加
        var entry = group.GetAssetEntry(guid);
        entry.SetLabel("Example01", true);

        // エントリからラベルを削除(第二引数をfalseに)
        entry.SetLabel("Example01", false);

        // ラベル追加の場合、第三引数をtrueにするとラベルが無かった場合に自動的に作られる
        //entry.SetLabel("Example01", true);
        
        // 変更を保存
        AssetDatabase.SaveAssets();
    }
}

関連

light11.hatenadiary.com