ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

アセットに設定されてあるアセットバンドル名をコンテキストメニューで取得できるようにしてみた

概要

プログラムでアセットバンドルからロードする際に、アセットに設定したAssetBundle名を取得したい時がありました。 f:id:daria_sieben:20190725105613p:plain

Inspectorで設定できるのでそこから名前もコピーできるのかなと思っていましたが、 コピーみたいな項目がありませんでした。 f:id:daria_sieben:20190725091014p:plain

なのでコンテキストメニューを利用して選択しているアセットのアセットバンドル名をコピーできるようにしました。

環境はUnity2018.4.4.f1です。

実装

コードを見たほうが早いと思うのでコード載せます。

using System.Linq;
using UnityEditor;
using UnityEngine;

public class SelectObjectAssetBundleNamesCopyToClipBoard
{
    [MenuItem("Assets/SelectObjectAssetBundleNamesCopyToClipBoard")]
    private static void CopyToClipBoard()
    {
        //バンドル名はAssetImporterで取得できるので、選択しているアセットのパスを渡す
        var selectAssetsPath = Selection.objects.Select(AssetDatabase.GetAssetPath);
        var assetImporters = selectAssetsPath.Select(AssetImporter.GetAtPath);

         //スクリプトで使えるように引用符(')で囲んでおく
                //.NET 4.xだったらこの書き方で行けますが、それより下のバージョンなら+などで連結してください
        var assetBundleNames = assetImporters.Select(importer => $"\"{importer.assetBundleName}\"");

        //クリップボードにコピー
        GUIUtility.systemCopyBuffer = string.Join(",\n", assetBundleNames);
    }

    [MenuItem("Assets/SelectObjectAssetBundleNamesCopyToClipBoard", true)]
    private static bool IsValidate()
    {
        //選択しているオブジェクトがあればコピーできるようにする
        return Selection.objects != null && Selection.objects.Length > 0;
    }
}

最後に

今は選択しているアセットのみですが、フォルダだった場合はフォルダ以下のアセットバンドル名も取得できれば便利になりそうですね。 機会があったら改良したいと思います。