using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace AutoGroupGenerator
{
///
/// Input rule that aggregates assets selected directly or via JSON lists.
///
[CreateAssetMenu(menuName = Constants.ContextMenus.InputRulesMenu + nameof(AssetSelectionInputRule))]
public class AssetSelectionInputRule : InputRule
{
#region Fields
///
/// Assets explicitly selected for inclusion in the addressables groups.
///
[SerializeField]
public List m_SelectedAssets = new List();
///
/// JSON list of assets containing additional asset paths.
///
[SerializeField]
public List m_JsonAssetLists = new List();
///
/// When true, include the current addressable assets in the input list.
///
[SerializeField]
public bool m_IncludeCurrentAddressables = false;
#endregion
#region Helper DTO
[Serializable]
private class StringArrayWrapper
{
public List items;
}
#endregion
#region Methods
///
/// Returns a set of asset paths based on selected assets and JSON lists.
///
/// Asset paths to include.
public override HashSet GetIncludedAssets()
{
var result = new HashSet(StringComparer.Ordinal);
foreach (var asset in m_SelectedAssets)
{
if (asset == null) continue;
string path = AssetDatabase.GetAssetPath(asset);
if (!string.IsNullOrEmpty(path)) result.Add(path);
}
foreach (var jsonTextAsset in m_JsonAssetLists)
{
if (jsonTextAsset == null)
continue;
try
{
string raw = jsonTextAsset.text;
if (string.IsNullOrWhiteSpace(raw))
continue;
string wrapped = raw.TrimStart().StartsWith("[")
? $"{{\"items\":{raw}}}"
: raw;
var parsed = JsonUtility.FromJson(wrapped);
if (parsed?.items == null)
continue;
foreach (var p in parsed.items)
{
string path = (p ?? string.Empty).Trim();
if (string.IsNullOrEmpty(path))
continue;
var loaded = AssetDatabase.LoadAssetAtPath(path);
if (loaded == null) continue;
if (AssetDatabase.IsValidFolder(path)) continue;
result.Add(path);
}
}
catch (Exception ex)
{
Debug.LogWarning(
$"[AutoGroupGenerator] Invalid JSON in '{jsonTextAsset.name}'. " +
$"Expected a simple array of asset paths (e.g. [\"Assets/X.prefab\"]). " +
$"This file will be skipped. Error: {ex.Message}",
jsonTextAsset
);
}
}
if (m_IncludeCurrentAddressables)
{
result.UnionWith(AddressableUtil.GetExtendedAddressableEntries());
}
return result;
}
#endregion
}
}