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 } }