Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AkihiroImada/8d4d53ce76d79f36c4959d43e58dca7e to your computer and use it in GitHub Desktop.
Save AkihiroImada/8d4d53ce76d79f36c4959d43e58dca7e to your computer and use it in GitHub Desktop.
指定フォルダ以下のアセットをAddressableとして登録するエディタ拡張.
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
public class EditorWindowAddressableAssetsRegister : EditorWindow
{
[SerializeField] List<DefaultAsset> m_directoryList = new List<DefaultAsset>();
private static EditorWindowAddressableAssetsRegister m_instance = null;
private static readonly string PATH_ADDRESSABLE_ASSET_SETTINGS = "Assets/AddressableAssetsData/AddressableAssetSettings.asset";
[MenuItem("Window/Custom/AddressableAssetsRegister")]
static void Open()
{
if (m_instance == null)
{
m_instance = CreateInstance<EditorWindowAddressableAssetsRegister>();
}
m_instance.ShowUtility();
}
private void OnGUI()
{
SerializedObject serialized = new SerializedObject(this);
var p = serialized.FindProperty("m_directoryList");
EditorGUILayout.PropertyField(p, true);
if (GUILayout.Button("Run")) { Run(); }
serialized.ApplyModifiedProperties();
}
private void Run()
{
var settings = AssetDatabase.LoadAssetAtPath<AddressableAssetSettings>(PATH_ADDRESSABLE_ASSET_SETTINGS);
var schema = new List<AddressableAssetGroupSchema>() { CreateInstance<BundledAssetGroupSchema>(), CreateInstance<ContentUpdateGroupSchema>() };
foreach (var d in m_directoryList)
{
var group = settings.groups.Find(g => g.name.Equals(d.name));
if (group == null) { group = settings.CreateGroup(d.name, false, false, false, schema); }
AddAllAssets(settings, group, Path.Combine(ProjectPath(), AssetDatabase.GetAssetPath(d)));
Debug.Log(AssetDatabase.GetAssetPath(d));
}
}
private void AddAllAssets(AddressableAssetSettings settings, AddressableAssetGroup group, string path)
{
var objs = LoadAssetsInDir(path);
foreach (var o in objs)
{
var e = settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(o)), group);
e.SetAddress(o.name);
}
}
/// <summary>
// ディレクトリの中のアセットをすべてロードする.
/// </summary>
/// <returns></returns>
private static Object[] LoadAssetsInDir(string dirPath, SearchOption searchOption = SearchOption.AllDirectories)
{
var list = new List<Object>();
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
dirInfo.GetFiles("*", searchOption)
.Where(file => !(file.Name.Contains(".meta")))
.ToList()
.ForEach((file) =>
{
var o = AssetDatabase.LoadAssetAtPath<Object>(Trim2AssetPath(file.FullName));
if (o) list.Add(o);
});
return list.ToArray();
}
/// <summary>
/// フルパスからプロジェクトの相対パスを取得する.
/// 入力例:C:/Users/Taro/Documents/UnityProject/ProjectName/Assets/Main/moge.jpg
/// 出力例:Assets/Main/moge.jpg
/// </summary>
/// <returns></returns>
private static string Trim2AssetPath(string fullPath)
{
var index = fullPath.IndexOf("Assets");
return fullPath.Substring(index);
}
/// <summary>
/// プロジェクトのパスを返す.
/// </summary>
/// <returns></returns>
public static string ProjectPath()
{
return Directory.GetParent(Application.dataPath).FullName;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment