Created
October 17, 2020 09:50
-
-
Save AkihiroImada/8d4d53ce76d79f36c4959d43e58dca7e to your computer and use it in GitHub Desktop.
指定フォルダ以下のアセットをAddressableとして登録するエディタ拡張.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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