diff --git a/Assets/Development/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelDevelopmentWindow.cs b/Assets/Development/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelDevelopmentWindow.cs index 58dede6..9790f0e 100644 --- a/Assets/Development/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelDevelopmentWindow.cs +++ b/Assets/Development/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelDevelopmentWindow.cs @@ -26,7 +26,8 @@ private void OnEnable() _groupCollection.Add(new AssetGroup()); _view = new AssetGroupPanelView(); - _presenter = new AssetGroupPanelPresenter(_view, _history, _assetSaveService); + // Use Address rule type for development window + _presenter = new AssetGroupPanelPresenter(_view, _history, _assetSaveService, RuleType.Address); _presenter.SetupView(_groupCollection, 0); } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/AddressRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/AddressRule.cs index 7d07fe6..51b560f 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/AddressRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/AddressRule.cs @@ -122,7 +122,7 @@ public bool TryProvideAddress( return false; } - if (!_assetGroups.Contains(assetPath, assetType, isFolder)) + if (!_assetGroups.Contains(assetPath, assetType, isFolder, null, null)) { address = null; return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/IAddressProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/IAddressProvider.cs index 62314d6..5427fc0 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/IAddressProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/AddressRules/IAddressProvider.cs @@ -1,11 +1,16 @@ -using SmartAddresser.Editor.Core.Models.Shared; +using System; namespace SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules { /// /// Provide addresses from asset information. /// - public interface IAddressProvider : IProvider + public interface IAddressProvider { + void Setup(); + + string Provide(string assetPath, Type assetType, bool isFolder); + + string GetDescription(); } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs new file mode 100644 index 0000000..dffec27 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs @@ -0,0 +1,29 @@ +using System; +using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; + +namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules +{ + /// + /// Provide the label based on the addressable entry's address. + /// + [Serializable] + public sealed class AddressBasedLabelProvider : AddressBasedProvider, ILabelProvider + { + void ILabelProvider.Setup() + { + base.Setup(); + } + + string ILabelProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + return base.Provide(address); + } + + string ILabelProvider.GetDescription() + { + return base.GetDescription(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta similarity index 83% rename from Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta rename to Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta index 9707a7e..461a301 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8460f7827ec164982b63a8d87bab6dc5 +guid: d41bbe608527c454f8f8c6be6a55cf09 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs new file mode 100644 index 0000000..bfb1982 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs @@ -0,0 +1,33 @@ +using System; +using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; + +namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules +{ + /// + /// Provide the label based on the addressable asset group name. + /// + [Serializable] + public sealed class AddressableAssetGroupNameBasedLabelProvider : AddressableAssetGroupNameBasedProvider, + ILabelProvider + { + void ILabelProvider.Setup() + { + base.Setup(); + } + + string ILabelProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + if (addressableAssetGroup == null) + return null; + + return base.Provide(addressableAssetGroup.Name); + } + + string ILabelProvider.GetDescription() + { + return base.GetDescription(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs.meta new file mode 100644 index 0000000..355c507 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b816db7e237544380877a03627482758 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs index 241b74e..e30cd28 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules { @@ -9,5 +10,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules [Serializable] public sealed class AssetPathBasedLabelProvider : AssetPathBasedProvider, ILabelProvider { + void ILabelProvider.Setup() + { + base.Setup(); + } + + string ILabelProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + return base.Provide(assetPath, assetType, isFolder); + } + + string ILabelProvider.GetDescription() + { + return base.GetDescription(); + } } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs index 7a065e8..6ee90d7 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs @@ -1,5 +1,5 @@ using System; -using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules @@ -18,11 +18,11 @@ public string Label set => _label = value; } - void IProvider.Setup() + public void Setup() { } - string IProvider.Provide(string assetPath, Type assetType, bool isFolder) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(_label)) return null; diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs index bd14f08..5661ae6 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules { @@ -15,12 +16,12 @@ public void Setup() labelProvider.Setup(); } - public string Provide(string assetPath, Type assetType, bool isFolder) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (labelProvider == null) return null; - return labelProvider.Provide(assetPath, assetType, isFolder); + return labelProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroup); } public string GetDescription() diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs index ed640bd..de1283a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs @@ -1,11 +1,33 @@ -using SmartAddresser.Editor.Core.Models.Shared; +using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules { /// - /// Provide labels from asset information. + /// Provides a label for addressable asset entries with awareness of address and group information. /// - public interface ILabelProvider : IProvider + public interface ILabelProvider { + /// + /// Setup the label provider. + /// + void Setup(); + + /// + /// Provide a label for the addressable asset. + /// + /// The asset path. + /// The type of the asset. + /// The asset is folder or not. + /// The address assigned to the addressable entry. + /// The addressable asset group. + /// Returns the label. If the label cannot be provided, returns null. + string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup); + + /// + /// Get the description of this rule for display in the UI. + /// + /// + string GetDescription(); } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs index b7f6590..85ec5b3 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules @@ -6,7 +7,10 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules public abstract class LabelProviderAsset : ScriptableObject, ILabelProvider { public abstract void Setup(); - public abstract string Provide(string assetPath, Type assetType, bool isFolder); + + public abstract string Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup); + public abstract string GetDescription(); } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs index ebc8fd7..3e274a0 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs @@ -4,6 +4,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.TinyRx.ObservableCollection; using SmartAddresser.Editor.Foundation.TinyRx.ObservableProperty; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules @@ -79,12 +80,14 @@ public bool Validate(out LabelRuleValidationError error) } /// - /// Create a label from asset information. + /// Create a label from asset information with addressable context. /// /// /// /// - /// If successful, assign the address. If not, null. + /// The address assigned to the addressable entry. + /// The addressable asset group. + /// If successful, assign the label. If not, null. /// /// If true, check if the asset path is valid for entry. /// You can pass false if it is guaranteed to be valid. @@ -94,11 +97,13 @@ public bool TryProvideLabel( string assetPath, Type assetType, bool isFolder, + string address, + AddressableAssetGroup addressableAssetGroup, out string label, bool checkIsPathValidForEntry = true ) { - if (!_assetGroups.Contains(assetPath, assetType, isFolder)) + if (!_assetGroups.Contains(assetPath, assetType, isFolder, address, addressableAssetGroup)) { label = null; return false; @@ -110,7 +115,7 @@ public bool TryProvideLabel( return false; } - label = LabelProvider.Value.Provide(assetPath, assetType, isFolder); + label = LabelProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroup); if (string.IsNullOrEmpty(label)) { diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs index 8a1c72e..509514a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs @@ -105,11 +105,13 @@ out AddressableAssetGroup addressableGroup } /// - /// Provide the labels. + /// Provide the labels with addressable context. /// /// /// /// + /// The address assigned to the addressable entry. + /// The addressable asset group. /// /// /// If true, check if the asset path is valid for entry. @@ -120,6 +122,8 @@ public IReadOnlyCollection ProvideLabels( string assetPath, Type assetType, bool isFolder, + string address, + AddressableAssetGroup addressableAssetGroup, bool doSetup, bool checkIsPathValidForEntry = true ) @@ -132,14 +136,14 @@ public IReadOnlyCollection ProvideLabels( if (doSetup) labelRule.Setup(); - if (labelRule.TryProvideLabel(assetPath, assetType, isFolder, out var label, checkIsPathValidForEntry)) + if (labelRule.TryProvideLabel(assetPath, assetType, isFolder, address, addressableAssetGroup, out var label, checkIsPathValidForEntry)) labels.Add(label); } return labels; } - public string ProvideVersion(string assetPath, Type assetType, bool isFolder, bool doSetup) + public string ProvideVersion(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup, bool doSetup) { foreach (var versionRule in _versionRules) { @@ -147,7 +151,7 @@ public string ProvideVersion(string assetPath, Type assetType, bool isFolder, bo versionRule.Setup(); // Adopt the first matching version. - if (versionRule.TryProvideVersion(assetPath, assetType, isFolder, out var version)) + if (versionRule.TryProvideVersion(assetPath, assetType, isFolder, address, addressableAssetGroup, out var version)) return version; } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs new file mode 100644 index 0000000..c983334 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs @@ -0,0 +1,29 @@ +using System; +using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; + +namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules +{ + /// + /// Provide the version based on the addressable entry's address. + /// + [Serializable] + public sealed class AddressBasedVersionProvider : AddressBasedProvider, IVersionProvider + { + void IVersionProvider.Setup() + { + base.Setup(); + } + + string IVersionProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + return base.Provide(address); + } + + string IVersionProvider.GetDescription() + { + return base.GetDescription(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs.meta new file mode 100644 index 0000000..b8fe23f --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b9f915bb33e2458c9f76cfa04ac2823 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs new file mode 100644 index 0000000..245bfee --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs @@ -0,0 +1,33 @@ +using System; +using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; + +namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules +{ + /// + /// Provide the version based on the addressable asset group name. + /// + [Serializable] + public sealed class AddressableAssetGroupNameBasedVersionProvider : AddressableAssetGroupNameBasedProvider, + IVersionProvider + { + void IVersionProvider.Setup() + { + base.Setup(); + } + + string IVersionProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + if (addressableAssetGroup == null) + return null; + + return base.Provide(addressableAssetGroup.Name); + } + + string IVersionProvider.GetDescription() + { + return base.GetDescription(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs.meta new file mode 100644 index 0000000..9651b89 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 974624353ab984a02b852d13052315e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs index edb9052..ceba012 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules { @@ -9,5 +10,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules [Serializable] public sealed class AssetPathBasedVersionProvider : AssetPathBasedProvider, IVersionProvider { + void IVersionProvider.Setup() + { + base.Setup(); + } + + string IVersionProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) + { + // Asset path based provider doesn't use address or addressableAssetGroupName + return base.Provide(assetPath, assetType, isFolder); + } + + string IVersionProvider.GetDescription() + { + return base.GetDescription(); + } } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs index 9223e35..2dfd90a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs @@ -1,5 +1,5 @@ using System; -using SmartAddresser.Editor.Core.Models.Shared; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules @@ -18,11 +18,11 @@ public string Version set => _version = value; } - void IProvider.Setup() + public void Setup() { } - string IProvider.Provide(string assetPath, Type assetType, bool isFolder) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(_version)) return null; diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs index d30b2b8..11f158b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules { @@ -15,12 +16,12 @@ public void Setup() versionProvider.Setup(); } - public string Provide(string assetPath, Type assetType, bool isFolder) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (versionProvider == null) return null; - return versionProvider.Provide(assetPath, assetType, isFolder); + return versionProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroup); } public string GetDescription() diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs index 7c07a51..5f1f1e8 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs @@ -1,11 +1,33 @@ -using SmartAddresser.Editor.Core.Models.Shared; +using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules { /// - /// Provide tags from asset information. + /// Provides a version for addressable asset entries with awareness of address and group information. /// - public interface IVersionProvider : IProvider + public interface IVersionProvider { + /// + /// Setup the version provider. + /// + void Setup(); + + /// + /// Provide a version for the addressable asset. + /// + /// The asset path. + /// The type of the asset. + /// The asset is folder or not. + /// The address assigned to the addressable entry. + /// The addressable asset group. + /// Returns the version. If the version cannot be provided, returns null. + string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup); + + /// + /// Get the description of this rule for display in the UI. + /// + /// + string GetDescription(); } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs index 17681b6..52d5c6a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules @@ -6,7 +7,7 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules public abstract class VersionProviderAsset : ScriptableObject, IVersionProvider { public abstract void Setup(); - public abstract string Provide(string assetPath, Type assetType, bool isFolder); + public abstract string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup); public abstract string GetDescription(); } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs index c59e570..6cfc8fa 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs @@ -4,6 +4,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.TinyRx.ObservableCollection; using SmartAddresser.Editor.Foundation.TinyRx.ObservableProperty; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules @@ -78,12 +79,14 @@ public bool Validate(out VersionRuleValidationError error) } /// - /// Create a version from asset information. + /// Create a version from asset information with addressable context. /// /// /// /// - /// If successful, assign the address. If not, null. + /// The address assigned to the addressable entry. + /// The addressable asset group. + /// If successful, assign the version. If not, null. /// /// If true, check if the asset path is valid for entry. /// You can pass false if it is guaranteed to be valid. @@ -93,11 +96,13 @@ public bool TryProvideVersion( string assetPath, Type assetType, bool isFolder, + string address, + AddressableAssetGroup addressableAssetGroup, out string version, bool checkIsPathValidForEntry = true ) { - if (!_assetGroups.Contains(assetPath, assetType, isFolder)) + if (!_assetGroups.Contains(assetPath, assetType, isFolder, address, addressableAssetGroup)) { version = null; return false; @@ -109,7 +114,7 @@ public bool TryProvideVersion( return false; } - version = VersionProvider.Value.Provide(assetPath, assetType, isFolder); + version = VersionProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroup); if (string.IsNullOrEmpty(version)) { diff --git a/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs b/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs index c0226b2..7edd1ae 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs @@ -141,13 +141,11 @@ private bool TryAddEntry( if (addressableGroup == null) return false; - var addressableGroupName = addressableGroup.Name; - // Check the version if it is specified. if (!string.IsNullOrEmpty(versionExpression)) { var comparator = _versionExpressionParser.CreateComparator(versionExpression); - var versionText = layoutRule.ProvideVersion(assetPath, assetType, isFolder, doSetup); + var versionText = layoutRule.ProvideVersion(assetPath, assetType, isFolder, address, addressableGroup, doSetup); if (string.IsNullOrEmpty(versionText) && layoutRule.Settings.ExcludeUnversioned.Value) return false; @@ -161,11 +159,13 @@ private bool TryAddEntry( // Set group and address. var entryAdapter = - _addressableSettingsAdapter.CreateOrMoveEntry(addressableGroupName, assetGuid, invokeModificationEvent); + _addressableSettingsAdapter.CreateOrMoveEntry(addressableGroup.Name, assetGuid, invokeModificationEvent); entryAdapter.SetAddress(address, invokeModificationEvent); + // Provide labels with addressable context (address and group). + var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, addressableGroup, doSetup); + // Add labels to addressable settings if not exists. - var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, doSetup); var addressableLabels = _addressableSettingsAdapter.GetLabels(); foreach (var label in labels) if (!addressableLabels.Contains(label)) diff --git a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs index 1b51f6b..8142df1 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs @@ -87,13 +87,13 @@ IReadOnlyList isFolders continue; // Labels - var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, false, false).ToArray(); + var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, addressRule.AddressableGroup, false, false).ToArray(); // Versions var versions = new List(); foreach (var versionRule in layoutRule.VersionRules) { - if (!versionRule.TryProvideVersion(assetPath, assetType, isFolder, out var version, false)) + if (!versionRule.TryProvideVersion(assetPath, assetType, isFolder, address, addressRule.AddressableGroup, out var version, false)) continue; versions.Add(version); diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs new file mode 100644 index 0000000..c45f86b --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs @@ -0,0 +1,87 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace SmartAddresser.Editor.Core.Models.Shared +{ + [Serializable] + public abstract class AddressBasedProvider + { + [SerializeField] private bool _replaceWithRegex; + [SerializeField] private string _pattern; + [SerializeField] private string _replacement; + + private Regex _regex; + + /// + /// If true, replaces the address value through regular expressions. + /// + public bool ReplaceWithRegex + { + get => _replaceWithRegex; + set => _replaceWithRegex = value; + } + + /// + /// Regex pattern to replace the address value. + /// + public string Pattern + { + get => _pattern; + set => _pattern = value; + } + + /// + /// Replacement value for the regex pattern. + /// + public string Replacement + { + get => _replacement; + set => _replacement = value; + } + + public void Setup() + { + if (!_replaceWithRegex) + return; + + try + { + _regex = new Regex(_pattern); + } + catch + { + _regex = null; + } + } + + public string Provide(string address) + { + if (string.IsNullOrEmpty(address)) + return null; + + if (_replaceWithRegex && _regex == null) + return null; + + try + { + var sourceValue = address; + return _replaceWithRegex ? _regex.Replace(sourceValue, _replacement) : sourceValue; + } + catch + { + return null; + } + } + + public string GetDescription() + { + var result = "Source: Address"; + if (_replaceWithRegex) + result += $", Regex: Replace \"{_pattern}\" with \"{_replacement}\""; + + return result; + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs.meta new file mode 100644 index 0000000..07ecbff --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 35097beab3c3640a08ed3c3741ee2082 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs new file mode 100644 index 0000000..2908d02 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs @@ -0,0 +1,85 @@ +using System; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace SmartAddresser.Editor.Core.Models.Shared +{ + [Serializable] + public abstract class AddressableAssetGroupNameBasedProvider + { + [SerializeField] private bool _replaceWithRegex; + [SerializeField] private string _pattern; + [SerializeField] private string _replacement; + + private Regex _regex; + + /// + /// If true, replaces the group name value through regular expressions. + /// + public bool ReplaceWithRegex + { + get => _replaceWithRegex; + set => _replaceWithRegex = value; + } + + /// + /// Regex pattern to replace the group name value. + /// + public string Pattern + { + get => _pattern; + set => _pattern = value; + } + + /// + /// Replacement value for the regex pattern. + /// + public string Replacement + { + get => _replacement; + set => _replacement = value; + } + + public void Setup() + { + if (!_replaceWithRegex) + return; + + try + { + _regex = new Regex(_pattern); + } + catch + { + _regex = null; + } + } + + public string Provide(string groupName) + { + if (string.IsNullOrEmpty(groupName)) + return null; + + if (_replaceWithRegex && _regex == null) + return null; + + try + { + return _replaceWithRegex ? _regex.Replace(groupName, _replacement) : groupName; + } + catch + { + return null; + } + } + + public string GetDescription() + { + var result = "Source: Addressable Asset Group Name"; + if (_replaceWithRegex) + result += $", Regex: Replace \"{_pattern}\" with \"{_replacement}\""; + + return result; + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs.meta new file mode 100644 index 0000000..08e314e --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: febfe542c82474e8d8a4991c45df4216 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs new file mode 100644 index 0000000..4c5be71 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using SmartAddresser.Editor.Foundation.ListableProperty; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl +{ + /// + /// Filter to pass assets if the address matches the regex. + /// + [Serializable] + [AssetFilter("Address Filter", "Address Filter")] + [RestrictedToRules(RuleType.Label, RuleType.Version)] + public sealed class AddressBasedAssetFilter : AssetFilterBase + { + [SerializeField] private bool _matchWithFolders; + [SerializeField] private AssetFilterCondition _condition = AssetFilterCondition.ContainsMatched; + [SerializeField] private StringListableProperty _addressRegex = new StringListableProperty(); + private List _errorRegexStrings = new List(); + private List _regexes = new List(); + + public bool MatchWithFolders + { + get => _matchWithFolders; + set => _matchWithFolders = value; + } + + public AssetFilterCondition Condition + { + get => _condition; + set => _condition = value; + } + + /// + /// Regex string for address matching. + /// + public StringListableProperty AddressRegex => _addressRegex; + + public override void SetupForMatching() + { + _regexes.Clear(); + _errorRegexStrings.Clear(); + foreach (var addressRegex in _addressRegex) + { + if (string.IsNullOrEmpty(addressRegex)) + continue; + + try + { + var regex = new Regex(addressRegex); + _regexes.Add(regex); + } + catch + { + // If the regex string is invalid and an exception is thrown, add to errorStrings and continue. + _errorRegexStrings.Add(addressRegex); + } + } + } + + public override bool Validate(out AssetFilterValidationError error) + { + if (_errorRegexStrings.Count >= 1) + { + error = new AssetFilterValidationError( + this, + _errorRegexStrings + .Select(errorRegexString => $"Invalid regex string: {errorRegexString}") + .ToArray()); + return false; + } + + error = null; + return true; + } + + /// + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + if (string.IsNullOrEmpty(address)) + return false; + + if (!_matchWithFolders && isFolder) + return false; + + switch (_condition) + { + case AssetFilterCondition.ContainsMatched: + for (int i = 0, size = _regexes.Count; i < size; i++) + if (_regexes[i].IsMatch(address)) + return true; + return false; + case AssetFilterCondition.MatchAll: + for (int i = 0, size = _regexes.Count; i < size; i++) + if (!_regexes[i].IsMatch(address)) + return false; + return true; + case AssetFilterCondition.ContainsUnmatched: + for (int i = 0, size = _regexes.Count; i < size; i++) + if (!_regexes[i].IsMatch(address)) + return true; + return false; + case AssetFilterCondition.NotMatchAll: + for (int i = 0, size = _regexes.Count; i < size; i++) + if (_regexes[i].IsMatch(address)) + return false; + return true; + default: + throw new ArgumentOutOfRangeException(); + } + } + + public override string GetDescription() + { + var result = new StringBuilder(); + var elementCount = 0; + foreach (var addressRegex in _addressRegex) + { + if (string.IsNullOrEmpty(addressRegex)) + continue; + + if (elementCount >= 1) + { + var delimiter = + _condition == AssetFilterCondition.MatchAll || _condition == AssetFilterCondition.NotMatchAll + ? " && " + : " || "; + result.Append(delimiter); + } + + result.Append(addressRegex); + elementCount++; + } + + if (result.Length >= 1) + { + if (elementCount >= 2) + { + result.Insert(0, "( "); + result.Append(" )"); + } + + var prefix = _condition == AssetFilterCondition.MatchAll || + _condition == AssetFilterCondition.ContainsMatched + ? "Address Match: " + : "Address Not Match: "; + result.Insert(0, prefix); + } + + return result.ToString(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs.meta new file mode 100644 index 0000000..92a530b --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5b3c4d5e6f7a8b4c9d0e1f2a3b4c5d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs new file mode 100644 index 0000000..ecc4681 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Text; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using SmartAddresser.Editor.Foundation.ListableProperty; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl +{ + /// + /// Filter to pass assets if they belong to the specified AddressableAssetGroup. + /// + [Serializable] + [AssetFilter("Addressable Group Filter", "Addressable Group Filter")] + [RestrictedToRules(RuleType.Label, RuleType.Version)] + public sealed class AddressableAssetGroupBasedAssetFilter : AssetFilterBase + { + [SerializeField] + private ListableProperty _groups = new ListableProperty(); + + private HashSet _groupSet = new HashSet(); + + private bool _hasNullGroup; + + /// + /// AddressableAssetGroups for filtering. + /// + public ListableProperty Groups => _groups; + + public override void SetupForMatching() + { + _groupSet.Clear(); + _hasNullGroup = false; + + foreach (var group in _groups) + { + if (group == null) + { + _hasNullGroup = true; + continue; + } + + _groupSet.Add(group); + } + } + + public override bool Validate(out AssetFilterValidationError error) + { + if (_hasNullGroup) + { + error = new AssetFilterValidationError(this, new[] { "There are null reference groups." }); + return false; + } + + error = null; + return true; + } + + /// + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) + { + if (addressableAssetGroup == null) + return false; + + return _groupSet.Contains(addressableAssetGroup); + } + + public override string GetDescription() + { + var result = new StringBuilder(); + var elementCount = 0; + + foreach (var group in _groups) + { + if (group == null) continue; + + if (elementCount >= 1) result.Append(" || "); + + result.Append(group.name); + elementCount++; + } + + if (result.Length >= 1) + { + if (elementCount >= 2) + { + result.Insert(0, "( "); + result.Append(" )"); + } + + result.Insert(0, "Addressable Group: "); + } + + return result.ToString(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs.meta new file mode 100644 index 0000000..e37a6d9 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7d5e6f8a9b1c2d4e0f1a2b3c4d5e6f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs index 7e4d2a7..ac1c64f 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -19,7 +20,8 @@ public virtual bool Validate(out AssetFilterValidationError error) } /// - public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder); + public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup); /// public abstract string GetDescription(); diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs index 324e21a..1409308 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -23,7 +24,8 @@ protected AssetFilterBase() public abstract bool Validate(out AssetFilterValidationError error); /// - public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder); + public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup); /// public abstract string GetDescription(); diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/CustomAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/CustomAssetFilter.cs index af4469c..86daacf 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/CustomAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/CustomAssetFilter.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -40,12 +41,13 @@ public bool Validate(out AssetFilterValidationError error) return assetFilter.Validate(out error); } - public bool IsMatch(string assetPath, Type assetType, bool isFolder) + public bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) { if (assetFilter == null) return false; - - return assetFilter.IsMatch(assetPath, assetType, isFolder); + + return assetFilter.IsMatch(assetPath, assetType, isFolder, address, addressableAssetGroup); } public string GetDescription() diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilter.cs index 0702ddc..82c0df5 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilter.cs @@ -6,6 +6,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.ListableProperty; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -78,7 +79,8 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(assetPath)) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilter.cs index 4a31fd2..3f12138 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilter.cs @@ -8,6 +8,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.ListableProperty; using UnityEngine; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl { @@ -69,7 +70,7 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(assetPath)) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilter.cs index a5187da..78c0dba 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilter.cs @@ -6,6 +6,7 @@ using SmartAddresser.Editor.Foundation.ListableProperty; using UnityEditor; using UnityEngine; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl { @@ -56,7 +57,7 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(assetPath)) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilter.cs index ab0f16a..99bbe3e 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilter.cs @@ -10,6 +10,7 @@ using SmartAddresser.Editor.Foundation.ListableProperty; using UnityEditor; using UnityEngine; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl { @@ -68,7 +69,7 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(assetPath)) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilter.cs index f6e231b..1817b4f 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilter.cs @@ -10,6 +10,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.ListableProperty; using UnityEngine; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl { @@ -82,7 +83,7 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (string.IsNullOrEmpty(assetPath)) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilter.cs index 1f97138..dd268b6 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilter.cs @@ -4,6 +4,7 @@ using System.Text; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using UnityEngine; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl { @@ -83,7 +84,7 @@ public override bool Validate(out AssetFilterValidationError error) } /// - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (assetType == null) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroup.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroup.cs index 38599eb..a4d4b20 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroup.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroup.cs @@ -8,6 +8,7 @@ using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.TinyRx.ObservableCollection; using SmartAddresser.Editor.Foundation.TinyRx.ObservableProperty; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups @@ -67,8 +68,11 @@ public bool Validate(out AssetGroupValidationError error) /// /// /// + /// The address assigned to the addressable entry. May be null when called from AddressRule. + /// The addressable asset group. May be null when called from AddressRule. /// - public bool Contains(string assetPath, Type assetType, bool isFolder) + public bool Contains(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) { if (_filters.Count == 0) return false; @@ -79,7 +83,7 @@ public bool Contains(string assetPath, Type assetType, bool isFolder) if (filter == null) continue; - if (!filter.IsMatch(assetPath, assetType, isFolder)) + if (!filter.IsMatch(assetPath, assetType, isFolder, address, addressableAssetGroup)) return false; } diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroupObservableList.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroupObservableList.cs index a5b3288..a6b2e69 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroupObservableList.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetGroupObservableList.cs @@ -3,6 +3,7 @@ using System.Text; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; using SmartAddresser.Editor.Foundation.TinyRx.ObservableCollection; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups { @@ -44,11 +45,14 @@ public bool Validate(out AssetGroupValidationError[] errors) /// /// /// + /// The address assigned to the addressable entry. May be null when called from AddressRule. + /// The addressable asset group. May be null when called from AddressRule. /// - public bool Contains(string assetPath, Type assetType, bool isFolder) + public bool Contains(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup) { for (var i = 0; i < Count; i++) - if (this[i].Contains(assetPath, assetType, isFolder)) + if (this[i].Contains(assetPath, assetType, isFolder, address, addressableAssetGroup)) return true; return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/IAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/IAssetFilter.cs index 44824bd..5ce9262 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/IAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/IAssetFilter.cs @@ -3,8 +3,8 @@ // -------------------------------------------------------------- using System; -using System.Collections.Generic; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.ValidationError; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups { @@ -25,7 +25,7 @@ public interface IAssetFilter /// /// Returns false if the AssetFilter is corrupted. /// Example: When an asset referenced by the filter is deleted. - /// This method will be called after . + /// This method will be called after . /// /// bool Validate(out AssetFilterValidationError error); @@ -39,8 +39,11 @@ public interface IAssetFilter /// /// /// + /// The address assigned to the addressable entry. May be null when called from AddressRule. + /// The addressable asset group. May be null when called from AddressRule. /// - bool IsMatch(string assetPath, Type assetType, bool isFolder); + bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, + AddressableAssetGroup addressableAssetGroup); /// /// Get a description of this asset filter. diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/LabelRules.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/LabelRules.meta new file mode 100644 index 0000000..6f34cfa --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/LabelRules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc3742314fb364d079ceedcd69093b36 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs new file mode 100644 index 0000000..8438a73 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs @@ -0,0 +1,46 @@ +using System; + +namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups +{ + /// + /// Attribute to restrict AssetFilter usage to specific rule types. + /// + [AttributeUsage(AttributeTargets.Class)] + public sealed class RestrictedToRulesAttribute : Attribute + { + /// + /// Constructor. + /// + /// The rule types that are allowed to use this filter. + public RestrictedToRulesAttribute(params RuleType[] allowedRuleTypes) + { + AllowedRuleTypes = allowedRuleTypes; + } + + /// + /// The rule types that are allowed to use this filter. + /// + public RuleType[] AllowedRuleTypes { get; } + } + + /// + /// Enum representing the different rule types. + /// + public enum RuleType + { + /// + /// Address rule type. + /// + Address, + + /// + /// Label rule type. + /// + Label, + + /// + /// Version rule type. + /// + Version + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs.meta new file mode 100644 index 0000000..5a5364c --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a9f4c7e8b3d54494b8e5f6a2c7d8e0f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetPathBasedProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetPathBasedProvider.cs index d53fd5c..8bb84c4 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetPathBasedProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetPathBasedProvider.cs @@ -5,7 +5,7 @@ namespace SmartAddresser.Editor.Core.Models.Shared { [Serializable] - public abstract class AssetPathBasedProvider : IProvider + public abstract class AssetPathBasedProvider { [SerializeField] private PartialAssetPathType _source = PartialAssetPathType.AssetPath; [SerializeField] private bool _replaceWithRegex; @@ -50,7 +50,7 @@ public string Replacement set => _replacement = value; } - void IProvider.Setup() + public void Setup() { if (!_replaceWithRegex) return; @@ -65,7 +65,7 @@ void IProvider.Setup() } } - string IProvider.Provide(string assetPath, Type assetType, bool isFolder) + public string Provide(string assetPath, Type assetType, bool isFolder) { if (_replaceWithRegex && _regex == null) return null; @@ -81,7 +81,7 @@ string IProvider.Provide(string assetPath, Type assetType, bool isFolder } } - string IProvider.GetDescription() + public string GetDescription() { var result = $"Source: {_source.ToString()}"; if (_replaceWithRegex) diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs deleted file mode 100644 index 6e8fad0..0000000 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace SmartAddresser.Editor.Core.Models.Shared -{ - public interface IProvider - { - void Setup(); - - T Provide(string assetPath, Type assetType, bool isFolder); - - string GetDescription(); - } -} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/AddressRuleEditor/AddressRuleEditorInspectorPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/AddressRuleEditor/AddressRuleEditorInspectorPresenter.cs index e4b488c..741ed7d 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/AddressRuleEditor/AddressRuleEditorInspectorPresenter.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/AddressRuleEditor/AddressRuleEditorInspectorPresenter.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups; using SmartAddresser.Editor.Core.Tools.Addresser.Shared; using SmartAddresser.Editor.Core.Tools.Addresser.Shared.AssetGroups; using SmartAddresser.Editor.Foundation.CommandBasedUndo; @@ -22,7 +23,7 @@ public AddressRuleEditorInspectorPresenter(AddressRuleEditorInspectorView view, { _view = view; _assetGroupCollectionPanelPresenter = - new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService); + new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService, RuleType.Address); _addressProviderPanelPresenter = new AddressProviderPanelPresenter(view.AddressProviderPanelView, history, saveService); } diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs new file mode 100644 index 0000000..a2dc503 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs @@ -0,0 +1,28 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.LabelRuleEditor +{ + /// + /// GUI Drawer for + /// + [CustomGUIDrawer(typeof(AddressBasedLabelProvider))] + public sealed class AddressBasedLabelProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressBasedLabelProvider target) + { + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) + using (new EditorGUI.IndentLevelScope()) + { + var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); + target.Pattern = EditorGUILayout.TextField(patternLabel, target.Pattern); + var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); + target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); + } + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs.meta new file mode 100644 index 0000000..e1cfb29 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 183c49b5556d14422bf44104839b5a83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs new file mode 100644 index 0000000..38b337d --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs @@ -0,0 +1,29 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.LabelRuleEditor +{ + /// + /// GUI Drawer for + /// + [CustomGUIDrawer(typeof(AddressableAssetGroupNameBasedLabelProvider))] + public sealed class + AddressableAssetGroupNameBasedLabelProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressableAssetGroupNameBasedLabelProvider target) + { + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) + using (new EditorGUI.IndentLevelScope()) + { + var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); + target.Pattern = EditorGUILayout.TextField(patternLabel, target.Pattern); + var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); + target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); + } + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs.meta new file mode 100644 index 0000000..ed56d43 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bcb570f10e62c4a01b5616a596de316e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/LabelRuleEditorInspectorPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/LabelRuleEditorInspectorPresenter.cs index 92e423e..2a0fd4f 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/LabelRuleEditorInspectorPresenter.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/LabelRuleEditorInspectorPresenter.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups; using SmartAddresser.Editor.Core.Tools.Addresser.Shared; using SmartAddresser.Editor.Core.Tools.Addresser.Shared.AssetGroups; using SmartAddresser.Editor.Foundation.CommandBasedUndo; @@ -20,7 +21,7 @@ public LabelRuleEditorInspectorPresenter(LabelRuleEditorInspectorView view, Auto { _view = view; _assetGroupCollectionPanelPresenter = - new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService); + new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService, RuleType.Label); _labelProviderPanelPresenter = new LabelProviderPanelViewPresenter(view.LabelProviderPanelView, history, saveService); } diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/Shared/AssetPathBasedProviderDrawerBase.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/Shared/AssetPathBasedProviderDrawerBase.cs index 0a5e783..cc326fb 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/Shared/AssetPathBasedProviderDrawerBase.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/Shared/AssetPathBasedProviderDrawerBase.cs @@ -1,7 +1,6 @@ using SmartAddresser.Editor.Core.Models.Shared; using SmartAddresser.Editor.Foundation.CustomDrawers; using UnityEditor; -using UnityEngine; namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.Shared { @@ -14,7 +13,7 @@ protected override void GUILayout(T target) var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); - GUI.enabled = target.ReplaceWithRegex; + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) using (new EditorGUI.IndentLevelScope()) { var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); @@ -22,8 +21,6 @@ protected override void GUILayout(T target) var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); } - - GUI.enabled = true; } } } diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs new file mode 100644 index 0000000..0f6fe57 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs @@ -0,0 +1,28 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.VersionRuleEditor +{ + /// + /// GUI Drawer for + /// + [CustomGUIDrawer(typeof(AddressBasedVersionProvider))] + public sealed class AddressBasedVersionProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressBasedVersionProvider target) + { + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) + using (new EditorGUI.IndentLevelScope()) + { + var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); + target.Pattern = EditorGUILayout.TextField(patternLabel, target.Pattern); + var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); + target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); + } + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs.meta new file mode 100644 index 0000000..07b1488 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 451bd4041e4d14127ace9fd1f9382c62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs new file mode 100644 index 0000000..6ccaff0 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs @@ -0,0 +1,30 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; +using SmartAddresser.Editor.Core.Models.Shared; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; +using UnityEngine; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.VersionRuleEditor +{ + /// + /// GUI Drawer for + /// + [CustomGUIDrawer(typeof(AddressableAssetGroupNameBasedVersionProvider))] + public sealed class AddressableAssetGroupNameBasedVersionProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressableAssetGroupNameBasedVersionProvider target) + { + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) + using (new EditorGUI.IndentLevelScope()) + { + var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); + target.Pattern = EditorGUILayout.TextField(patternLabel, target.Pattern); + var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); + target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); + } + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs.meta new file mode 100644 index 0000000..a9086c4 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54361e60c92ac42dba5225a8e88c9fdc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/VersionRuleEditorInspectorPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/VersionRuleEditorInspectorPresenter.cs index bd2fad9..d0203c1 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/VersionRuleEditorInspectorPresenter.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/VersionRuleEditorInspectorPresenter.cs @@ -1,5 +1,6 @@ using System; using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups; using SmartAddresser.Editor.Core.Tools.Addresser.Shared; using SmartAddresser.Editor.Core.Tools.Addresser.Shared.AssetGroups; using SmartAddresser.Editor.Foundation.CommandBasedUndo; @@ -20,7 +21,7 @@ public VersionRuleEditorInspectorPresenter(VersionRuleEditorInspectorView view, { _view = view; _assetGroupCollectionPanelPresenter = - new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService); + new AssetGroupCollectionPanelPresenter(view.GroupCollectionView, history, saveService, RuleType.Version); _versionProviderPanelPresenter = new VersionProviderPanelViewPresenter(view.VersionProviderPanelView, history, saveService); } diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs new file mode 100644 index 0000000..e88e493 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs @@ -0,0 +1,28 @@ +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using SmartAddresser.Editor.Foundation.ListableProperty; +using UnityEditor; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.Shared.AssetGroups.AssetFilterDrawer +{ + [CustomGUIDrawer(typeof(AddressBasedAssetFilter))] + internal sealed class AddressBasedAssetFilterDrawer : GUIDrawer + { + private TextListablePropertyGUI _listablePropertyGUI; + + public override void Setup(object target) + { + base.Setup(target); + _listablePropertyGUI = new TextListablePropertyGUI("Address (Regex)", Target.AddressRegex); + } + + protected override void GUILayout(AddressBasedAssetFilter target) + { + target.MatchWithFolders = EditorGUILayout.Toggle("Match With Folders", target.MatchWithFolders); + target.Condition = + (AssetFilterCondition)EditorGUILayout.EnumPopup( + ObjectNames.NicifyVariableName(nameof(Target.Condition)), target.Condition); + _listablePropertyGUI.DoLayout(); + } + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs.meta new file mode 100644 index 0000000..52d0385 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6c4d5e6f7a9b0c4d0e1f2a3b4c5d6e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs new file mode 100644 index 0000000..63679d0 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs @@ -0,0 +1,26 @@ +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using SmartAddresser.Editor.Foundation.ListableProperty; +using UnityEditor; + +namespace SmartAddresser.Editor.Core.Tools.Addresser.Shared.AssetGroups.AssetFilterDrawer +{ + [CustomGUIDrawer(typeof(AddressableAssetGroupBasedAssetFilter))] + internal sealed class AddressableAssetGroupBasedAssetFilterDrawer : GUIDrawer + { + private AddressableAssetGroupListablePropertyGUI _listablePropertyGUI; + + public override void Setup(object target) + { + base.Setup(target); + _listablePropertyGUI = new AddressableAssetGroupListablePropertyGUI( + ObjectNames.NicifyVariableName(nameof(Target.Groups)), + Target.Groups); + } + + protected override void GUILayout(AddressableAssetGroupBasedAssetFilter target) + { + _listablePropertyGUI.DoLayout(); + } + } +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs.meta b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs.meta new file mode 100644 index 0000000..ce351bf --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8e6f7a0b1c3d5e6f0a1b2c3d4e5f6a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupCollectionPanelPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupCollectionPanelPresenter.cs index 92b3871..0ae20dc 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupCollectionPanelPresenter.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupCollectionPanelPresenter.cs @@ -16,6 +16,7 @@ internal sealed class AssetGroupCollectionPanelPresenter : IDisposable new Dictionary(); private readonly AutoIncrementHistory _history; + private readonly RuleType? _ruleType; private readonly IAssetSaveService _saveService; private readonly CompositeDisposable _setupViewDisposables = new CompositeDisposable(); private readonly AssetGroupCollectionPanelView _view; @@ -24,11 +25,12 @@ internal sealed class AssetGroupCollectionPanelPresenter : IDisposable private IObservableList _groups; public AssetGroupCollectionPanelPresenter(AssetGroupCollectionPanelView view, AutoIncrementHistory history, - IAssetSaveService saveService) + IAssetSaveService saveService, RuleType? ruleType = null) { _view = view; _history = history; _saveService = saveService; + _ruleType = ruleType; SetupViewEventHandlers(); } @@ -78,7 +80,7 @@ public void SetupView(ObservableList groups) void AddGroupView(AssetGroup group, int index) { var groupPanelView = _view.AddGroupPanelView(group, index); - var groupPanelPresenter = new AssetGroupPanelPresenter(groupPanelView, _history, _saveService); + var groupPanelPresenter = new AssetGroupPanelPresenter(groupPanelView, _history, _saveService, _ruleType); groupPanelPresenter.SetupView(_groups, index); _groupPanelPresenters.Add(group.Id, groupPanelPresenter); } diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelPresenter.cs index 209e290..acdc812 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelPresenter.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupPanelPresenter.cs @@ -20,6 +20,7 @@ internal sealed class AssetGroupPanelPresenter : IDisposable new Dictionary(); private readonly AutoIncrementHistory _history; + private readonly RuleType? _ruleType; private readonly IAssetSaveService _saveService; private readonly CompositeDisposable _setupViewDisposables = new CompositeDisposable(); private readonly AssetGroupPanelView _view; @@ -29,11 +30,12 @@ internal sealed class AssetGroupPanelPresenter : IDisposable private IList _groups; public AssetGroupPanelPresenter(AssetGroupPanelView view, AutoIncrementHistory history, - IAssetSaveService saveService) + IAssetSaveService saveService, RuleType? ruleType = null) { _view = view; _history = history; _saveService = saveService; + _ruleType = ruleType; SetupViewEventHandlers(); } @@ -246,6 +248,18 @@ void AddFilter() .Where(x => !typeof(AssetFilterAsset).IsAssignableFrom(x)) .Where(x => x.GetCustomAttribute() == null); + // Filter by rule context if set + if (_ruleType.HasValue) + types = types.Where(type => + { + var restrictedAttribute = type.GetCustomAttribute(); + // If no restriction attribute, allow for all rules + if (restrictedAttribute == null) + return true; + // If restriction attribute exists, check if current rule type is allowed + return restrictedAttribute.AllowedRuleTypes.Contains(_ruleType.Value); + }); + // Show filter selection menu. var menu = new GenericMenu(); foreach (var type in types) @@ -394,7 +408,9 @@ private ICollection GetMoveDownByOptions() return Array.Empty(); var index = _groups.IndexOf(_group); - return index == _groups.Count - 1 ? Array.Empty() : Enumerable.Range(1, _groups.Count - index - 1).ToArray(); + return index == _groups.Count - 1 + ? Array.Empty() + : Enumerable.Range(1, _groups.Count - index - 1).ToArray(); } } } diff --git a/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs b/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs new file mode 100644 index 0000000..d365874 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs @@ -0,0 +1,24 @@ +using SmartAddresser.Editor.Foundation.ListableProperty; +using UnityEditor; +using UnityEditor.AddressableAssets.Settings; + +namespace SmartAddresser.Editor.Foundation.ListableProperty +{ + public sealed class AddressableAssetGroupListablePropertyGUI : ListablePropertyGUI + { + public AddressableAssetGroupListablePropertyGUI(string displayName, + ListableProperty list) + : base(displayName, list, (rect, label, value, onValueChanged) => + { + using (var ccs = new EditorGUI.ChangeCheckScope()) + { + var newValue = (AddressableAssetGroup)EditorGUI.ObjectField(rect, label, value, + typeof(AddressableAssetGroup), false); + if (ccs.changed) + onValueChanged.Invoke(newValue); + } + }) + { + } + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs.meta b/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs.meta new file mode 100644 index 0000000..c0e8511 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9f7a0b2c3d6e8f0a1b3c5d7e9f1a3b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules.meta new file mode 100644 index 0000000..c4bd539 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e6f7890abcdef123456789056cd2345 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs new file mode 100644 index 0000000..0dbc809 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs @@ -0,0 +1,99 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.LabelRules +{ + internal sealed class AddressBasedLabelProviderTest + { + private ILabelProvider _labelProvider; + private AddressBasedLabelProvider _provider; + + [SetUp] + public void Setup() + { + _provider = new AddressBasedLabelProvider(); + _labelProvider = _provider; + } + + [Test] + public void Provide_WithoutRegex_ReturnsAddress() + { + _provider.ReplaceWithRegex = false; + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); + + Assert.That(result, Is.EqualTo("character/player")); + } + + [Test] + public void Provide_WithRegex_ReturnsModifiedAddress() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"character/(.+)"; + _provider.Replacement = "$1_label"; + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); + + Assert.That(result, Is.EqualTo("player_label")); + } + + [Test] + public void Provide_WithNullAddress_ReturnsNull() + { + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, null, null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithEmptyAddress_ReturnsNull() + { + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegex_ReturnsNull() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = "["; + _provider.Replacement = "replacement"; + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + _provider.ReplaceWithRegex = false; + + var description = _labelProvider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Address")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"^prefix/"; + _provider.Replacement = ""; + + var description = _labelProvider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"^prefix/\" with \"\"")); + } + } +} diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs.meta new file mode 100644 index 0000000..00e7443 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c4d5e6f7890abcdef123456789034ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs new file mode 100644 index 0000000..89cf4d1 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs @@ -0,0 +1,105 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.LabelRules +{ + internal sealed class AddressableAssetGroupNameBasedLabelProviderTest + { + private ILabelProvider _labelProvider; + private AddressableAssetGroupNameBasedLabelProvider _provider; + + [SetUp] + public void Setup() + { + _provider = new AddressableAssetGroupNameBasedLabelProvider(); + _labelProvider = _provider; + } + + [Test] + public void Provide_WithoutRegex_ReturnsGroupName() + { + _provider.ReplaceWithRegex = false; + _labelProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "TestGroup"; + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.EqualTo("TestGroup")); + + Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithRegex_ReturnsModifiedGroupName() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"Group_(.+)"; + _provider.Replacement = "$1_Label"; + _labelProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "Group_Characters"; + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.EqualTo("Characters_Label")); + + Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithNullGroup_ReturnsNull() + { + _labelProvider.Setup(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegex_ReturnsNull() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = "[{"; + _provider.Replacement = "replacement"; + _labelProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "TestGroup"; + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.Null); + + Object.DestroyImmediate(group); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + _provider.ReplaceWithRegex = false; + + var description = _labelProvider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"_v\d+$"; + _provider.Replacement = ""; + + var description = _labelProvider.GetDescription(); + + Assert.That(description, + Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"_v\\d+$\" with \"\"")); + } + } +} diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs.meta new file mode 100644 index 0000000..d0121f7 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4d5e6f7890abcdef123456789045bc12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/Shared/AssetPathBasedProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/Shared/AssetPathBasedProviderTest.cs index 42abc7e..9ef9eab 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/Shared/AssetPathBasedProviderTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/Shared/AssetPathBasedProviderTest.cs @@ -11,10 +11,9 @@ internal sealed class AssetPathBasedProviderTest [TestCase(PartialAssetPathType.AssetPath, ExpectedResult = "Assets/Dummy.asset")] public string SourceType(PartialAssetPathType sourceType) { - var providerImpl = new FakeAssetPathBasedProvider(); - var provider = (IProvider)providerImpl; - providerImpl.Source = sourceType; - providerImpl.ReplaceWithRegex = false; + var provider = new FakeAssetPathBasedProvider(); + provider.Source = sourceType; + provider.ReplaceWithRegex = false; provider.Setup(); var address = provider.Provide("Assets/Dummy.asset", typeof(ScriptableObject), false); return address; @@ -23,12 +22,11 @@ public string SourceType(PartialAssetPathType sourceType) [Test] public void ReplaceWithRegex() { - var providerImpl = new FakeAssetPathBasedProvider(); - var provider = (IProvider)providerImpl; - providerImpl.Source = PartialAssetPathType.AssetPath; - providerImpl.ReplaceWithRegex = true; - providerImpl.Pattern = "^Assets/(?[a-zA-Z]{5}).asset$"; - providerImpl.Replacement = "${key}"; + var provider = new FakeAssetPathBasedProvider(); + provider.Source = PartialAssetPathType.AssetPath; + provider.ReplaceWithRegex = true; + provider.Pattern = "^Assets/(?[a-zA-Z]{5}).asset$"; + provider.Replacement = "${key}"; provider.Setup(); var address = provider.Provide("Assets/Dummy.asset", typeof(ScriptableObject), false); Assert.That(address, Is.EqualTo("Dummy")); diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules.meta new file mode 100644 index 0000000..0738451 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 890abcdef123456789089fa5678bc234 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs new file mode 100644 index 0000000..7fd920c --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs @@ -0,0 +1,98 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; + +namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.VersionRules +{ + internal sealed class AddressBasedVersionProviderTest + { + private AddressBasedVersionProvider _provider; + private IVersionProvider _versionProvider; + + [SetUp] + public void Setup() + { + _provider = new AddressBasedVersionProvider(); + _versionProvider = _provider; + } + + [Test] + public void Provide_WithoutRegex_ReturnsAddress() + { + _provider.ReplaceWithRegex = false; + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v1.0.0/character", null); + + Assert.That(result, Is.EqualTo("v1.0.0/character")); + } + + [Test] + public void Provide_WithRegex_ReturnsModifiedAddress() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"v(\d+\.\d+\.\d+)/.*"; + _provider.Replacement = "$1"; + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v1.2.3/character/player", null); + + Assert.That(result, Is.EqualTo("1.2.3")); + } + + [Test] + public void Provide_WithNullAddress_ReturnsNull() + { + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, null, null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithEmptyAddress_ReturnsNull() + { + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegex_ReturnsNull() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = "[("; + _provider.Replacement = "replacement"; + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v1.0.0/character", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + _provider.ReplaceWithRegex = false; + + var description = _versionProvider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Address")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"v(\d+\.\d+\.\d+)"; + _provider.Replacement = "$1"; + + var description = _versionProvider.GetDescription(); + + Assert.That(description, + Is.EqualTo("Source: Address, Regex: Replace \"v(\\d+\\.\\d+\\.\\d+)\" with \"$1\"")); + } + } +} diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs.meta new file mode 100644 index 0000000..5851984 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f7890abcdef123456789067de3456ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs new file mode 100644 index 0000000..a5cabde --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs @@ -0,0 +1,105 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.VersionRules +{ + internal sealed class AddressableAssetGroupNameBasedVersionProviderTest + { + private AddressableAssetGroupNameBasedVersionProvider _provider; + private IVersionProvider _versionProvider; + + [SetUp] + public void Setup() + { + _provider = new AddressableAssetGroupNameBasedVersionProvider(); + _versionProvider = _provider; + } + + [Test] + public void Provide_WithoutRegex_ReturnsGroupName() + { + _provider.ReplaceWithRegex = false; + _versionProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "Version_1.0.0"; + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.EqualTo("Version_1.0.0")); + + Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithRegex_ReturnsModifiedGroupName() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"Version_(.+)"; + _provider.Replacement = "$1"; + _versionProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "Version_2.5.1"; + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.EqualTo("2.5.1")); + + Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithNullGroup_ReturnsNull() + { + _versionProvider.Setup(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", null); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegex_ReturnsNull() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = "({["; + _provider.Replacement = "replacement"; + _versionProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "Version_1.0.0"; + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.Null); + + Object.DestroyImmediate(group); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + _provider.ReplaceWithRegex = false; + + var description = _versionProvider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"v(.+)_Group"; + _provider.Replacement = "$1"; + + var description = _versionProvider.GetDescription(); + + Assert.That(description, + Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"v(.+)_Group\" with \"$1\"")); + } + } +} diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs.meta new file mode 100644 index 0000000..ab14fbe --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7890abcdef123456789078ef4567ab01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs new file mode 100644 index 0000000..63533ac --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs @@ -0,0 +1,272 @@ +using System; +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl +{ + internal sealed class AddressBasedAssetFilterTest + { + private AddressBasedAssetFilter _filter; + + [SetUp] + public void Setup() + { + _filter = new AddressBasedAssetFilter(); + } + + [Test] + public void IsMatch_WithSingleRegex_ContainsMatched_ReturnsTrue() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = "character/.*"; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "character/player", null); + + Assert.That(result, Is.True); + } + + [Test] + public void IsMatch_WithSingleRegex_ContainsMatched_ReturnsFalse() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = "character/.*"; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "weapon/sword", null); + + Assert.That(result, Is.False); + } + + [Test] + public void IsMatch_WithMultipleRegex_ContainsMatched_ReturnsTrue() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("character/.*"); + _filter.AddressRegex.AddValue("weapon/.*"); + _filter.SetupForMatching(); + + var result1 = _filter.IsMatch("dummy", typeof(object), false, "character/player", null); + var result2 = _filter.IsMatch("dummy", typeof(object), false, "weapon/sword", null); + var result3 = _filter.IsMatch("dummy", typeof(object), false, "item/potion", null); + + Assert.That(result1, Is.True); + Assert.That(result2, Is.True); + Assert.That(result3, Is.False); + } + + [Test] + public void IsMatch_WithMultipleRegex_MatchAll_ReturnsTrue() + { + _filter.Condition = AssetFilterCondition.MatchAll; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue(".*player.*"); + _filter.AddressRegex.AddValue("character/.*"); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "character/player", null); + + Assert.That(result, Is.True); + } + + [Test] + public void IsMatch_WithMultipleRegex_MatchAll_ReturnsFalse() + { + _filter.Condition = AssetFilterCondition.MatchAll; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue(".*player.*"); + _filter.AddressRegex.AddValue("character/.*"); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "character/enemy", null); + + Assert.That(result, Is.False); + } + + [Test] + public void IsMatch_WithMultipleRegex_ContainsUnmatched_ReturnsTrue() + { + _filter.Condition = AssetFilterCondition.ContainsUnmatched; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("character/.*"); + _filter.AddressRegex.AddValue("weapon/.*"); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "character/player", null); + + // character/playerは"weapon/.*"にマッチしないので、true + Assert.That(result, Is.True); + } + + [Test] + public void IsMatch_WithMultipleRegex_NotMatchAll_ReturnsTrue() + { + _filter.Condition = AssetFilterCondition.NotMatchAll; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("character/.*"); + _filter.AddressRegex.AddValue("weapon/.*"); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "item/potion", null); + + Assert.That(result, Is.True); + } + + [Test] + public void IsMatch_WithFolder_WhenMatchWithFoldersIsFalse_ReturnsFalse() + { + _filter.MatchWithFolders = false; + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = ".*"; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), true, "folder/path", null); + + Assert.That(result, Is.False); + } + + [Test] + public void IsMatch_WithFolder_WhenMatchWithFoldersIsTrue_ReturnsTrue() + { + _filter.MatchWithFolders = true; + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = ".*"; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), true, "folder/path", null); + + Assert.That(result, Is.True); + } + + [Test] + public void SetupForMatching_WithInvalidRegex_DoesNotThrow() + { + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("valid.*"); + _filter.AddressRegex.AddValue("["); // 不正な正規表現 + _filter.AddressRegex.AddValue("another.*"); + + Assert.DoesNotThrow(() => _filter.SetupForMatching()); + } + + [Test] + public void Validate_WithInvalidRegex_ReturnsFalse() + { + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("valid.*"); + _filter.AddressRegex.AddValue("["); // 不正な正規表現 + _filter.AddressRegex.AddValue("({"); // 別の不正な正規表現 + _filter.SetupForMatching(); + + var result = _filter.Validate(out var error); + + Assert.That(result, Is.False); + Assert.That(error, Is.Not.Null); + Assert.That(error.ErrorMessages.Count, Is.EqualTo(2)); + Assert.That(error.ErrorMessages[0], Does.Contain("Invalid regex string: [")); + Assert.That(error.ErrorMessages[1], Does.Contain("Invalid regex string: ({")); + } + + [Test] + public void Validate_WithValidRegex_ReturnsTrue() + { + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("character/.*"); + _filter.AddressRegex.AddValue("weapon/.*"); + _filter.SetupForMatching(); + + var result = _filter.Validate(out var error); + + Assert.That(result, Is.True); + Assert.That(error, Is.Null); + } + + [Test] + public void GetDescription_WithSingleRegex_ContainsMatched() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = "character/.*"; + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Address Match: character/.*")); + } + + [Test] + public void GetDescription_WithMultipleRegex_MatchAll() + { + _filter.Condition = AssetFilterCondition.MatchAll; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue(".*player.*"); + _filter.AddressRegex.AddValue("character/.*"); + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Address Match: ( .*player.* && character/.* )")); + } + + [Test] + public void GetDescription_WithMultipleRegex_NotMatchAll() + { + _filter.Condition = AssetFilterCondition.NotMatchAll; + _filter.AddressRegex.IsListMode = true; + _filter.AddressRegex.AddValue("enemy/.*"); + _filter.AddressRegex.AddValue("boss/.*"); + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Address Not Match: ( enemy/.* && boss/.* )")); + } + + [Test] + public void GetDescription_WithEmptyRegexList_ReturnsEmptyString() + { + var description = _filter.GetDescription(); + + Assert.That(description, Is.Empty); + } + + [Test] + public void IsMatch_WithAddressableAssetGroup_IgnoresGroup() + { + // AddressBasedAssetFilterはAddressableAssetGroupを使用しない + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = "test/.*"; + _filter.SetupForMatching(); + + var group = ScriptableObject.CreateInstance(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "test/address", group); + + Assert.That(result, Is.True); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void IsMatch_EmptyRegexList_AlwaysFalseForContainsMatched() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "any/address", null); + + Assert.That(result, Is.False); + } + + [Test] + public void IsMatch_EmptyRegexList_AlwaysTrueForMatchAll() + { + _filter.Condition = AssetFilterCondition.MatchAll; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "any/address", null); + + // 空のリストに対してすべてマッチは論理的にtrue + Assert.That(result, Is.True); + } + } +} diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs.meta new file mode 100644 index 0000000..1bc31ce --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 90abcdef12345678901abc6789def345 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs new file mode 100644 index 0000000..874219e --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs @@ -0,0 +1,252 @@ +using System; +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; +using UnityEngine; + +namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl +{ + internal sealed class AddressableAssetGroupBasedAssetFilterTest + { + private AddressableAssetGroupBasedAssetFilter _filter; + + [SetUp] + public void Setup() + { + _filter = new AddressableAssetGroupBasedAssetFilter(); + } + + [Test] + public void IsMatch_WithMatchingGroup_ReturnsTrue() + { + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + group1.Name = "Group1"; + group2.Name = "Group2"; + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(group2); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "dummy/address", group1); + + Assert.That(result, Is.True); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + } + + [Test] + public void IsMatch_WithNonMatchingGroup_ReturnsFalse() + { + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + var group3 = ScriptableObject.CreateInstance(); + group1.Name = "Group1"; + group2.Name = "Group2"; + group3.Name = "Group3"; + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(group2); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "dummy/address", group3); + + Assert.That(result, Is.False); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + UnityEngine.Object.DestroyImmediate(group3); + } + + [Test] + public void IsMatch_WithNullGroup_ReturnsFalse() + { + var group1 = ScriptableObject.CreateInstance(); + _filter.Groups.Value = group1; + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "dummy/address", null); + + Assert.That(result, Is.False); + + UnityEngine.Object.DestroyImmediate(group1); + } + + [Test] + public void IsMatch_WithEmptyGroupList_ReturnsFalse() + { + _filter.SetupForMatching(); + + var group = ScriptableObject.CreateInstance(); + + var result = _filter.IsMatch("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.False); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void Validate_WithValidGroups_ReturnsTrue() + { + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(group2); + _filter.SetupForMatching(); + + var result = _filter.Validate(out var error); + + Assert.That(result, Is.True); + Assert.That(error, Is.Null); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + } + + [Test] + public void Validate_WithNullGroup_ReturnsFalse() + { + var group1 = ScriptableObject.CreateInstance(); + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(null); + _filter.SetupForMatching(); + + var result = _filter.Validate(out var error); + + Assert.That(result, Is.False); + Assert.That(error, Is.Not.Null); + Assert.That(error.ErrorMessages[0], Does.Contain("null reference groups")); + + UnityEngine.Object.DestroyImmediate(group1); + } + + [Test] + public void GetDescription_WithSingleGroup() + { + var group = ScriptableObject.CreateInstance(); + group.name = "TestGroup"; + + _filter.Groups.Value = group; + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Addressable Group: TestGroup")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void GetDescription_WithMultipleGroups() + { + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + group1.name = "Group1"; + group2.name = "Group2"; + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(group2); + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Addressable Group: ( Group1 || Group2 )")); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + } + + [Test] + public void GetDescription_WithNullGroup_IgnoresNull() + { + var group = ScriptableObject.CreateInstance(); + group.name = "ValidGroup"; + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group); + _filter.Groups.AddValue(null); + + var description = _filter.GetDescription(); + + Assert.That(description, Is.EqualTo("Addressable Group: ValidGroup")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void GetDescription_WithEmptyGroupList_ReturnsEmptyString() + { + var description = _filter.GetDescription(); + + Assert.That(description, Is.Empty); + } + + [Test] + public void IsMatch_IgnoresAssetPathAndType() + { + // AddressableAssetGroupBasedAssetFilterはアセットパスやタイプを使用しない + var group = ScriptableObject.CreateInstance(); + _filter.Groups.Value = group; + _filter.SetupForMatching(); + + var result1 = _filter.IsMatch("path1", typeof(Texture2D), false, "addr1", group); + var result2 = _filter.IsMatch("path2", typeof(GameObject), true, "addr2", group); + var result3 = _filter.IsMatch(null, null, false, null, group); + + Assert.That(result1, Is.True); + Assert.That(result2, Is.True); + Assert.That(result3, Is.True); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void SetupForMatching_HandlesDuplicateGroups() + { + var group = ScriptableObject.CreateInstance(); + + // 同じグループを複数回追加 + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group); + _filter.Groups.AddValue(group); + _filter.Groups.AddValue(group); + _filter.SetupForMatching(); + + var result = _filter.IsMatch("dummy", typeof(object), false, "dummy", group); + + // HashSetにより重複は自動的に処理される + Assert.That(result, Is.True); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void IsMatch_WithMultipleGroupsIncludingNull_WorksCorrectly() + { + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + + _filter.Groups.IsListMode = true; + _filter.Groups.AddValue(group1); + _filter.Groups.AddValue(null); + _filter.Groups.AddValue(group2); + _filter.SetupForMatching(); + + var result1 = _filter.IsMatch("dummy", typeof(object), false, "dummy", group1); + var result2 = _filter.IsMatch("dummy", typeof(object), false, "dummy", group2); + + Assert.That(result1, Is.True); + Assert.That(result2, Is.True); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + } + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs.meta new file mode 100644 index 0000000..9a12b4a --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0abcdef12345678902bcd6789eef456a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs index 2a71c5b..a2be57e 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs @@ -2,6 +2,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; using Object = UnityEngine.Object; @@ -18,7 +19,7 @@ public bool IsMatch(string relativeAssetPath, Type assetType) filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.PrefabTex64); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [TestCase(TestAssetRelativePaths.Shared.Texture64, typeof(Texture2D), false, ExpectedResult = true)] @@ -36,7 +37,7 @@ bool onlyDirectDependencies filter.OnlyDirectDependencies = onlyDirectDependencies; filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs index 8a31529..1c1a5b6 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -16,7 +17,7 @@ public void IsMatch_RegisterMatchedExtension_ReturnTrue() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = "png"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -25,7 +26,7 @@ public void IsMatch_RegisterMatchedExtensionWithDot_ReturnTrue() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = ".png"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -34,7 +35,7 @@ public void IsMatch_RegisterNotMatchedExtension_ReturnFalse() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = "jpg"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -45,7 +46,7 @@ public void IsMatch_RegisterExtensionsAndContainsMatched_ReturnTrue() filter.Extension.AddValue("png"); filter.Extension.AddValue("jpg"); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -56,7 +57,7 @@ public void IsMatch_RegisterExtensionsAndNotContainsMatched_ReturnFalse() filter.Extension.AddValue("jpg"); filter.Extension.AddValue("exr"); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -66,7 +67,7 @@ public void IsMatch_InvertMatchAndRegisterMatchedExtension_ReturnFalse() filter.Extension.Value = "png"; filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -76,7 +77,7 @@ public void IsMatch_InvertMatchAndRegisterNotMatchedExtension_ReturnTrue() filter.Extension.Value = "jpg"; filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs index 89d28a5..323c9c1 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -13,9 +14,9 @@ public void IsMatch_ValidFilter_ReturnTrue() var filter = new FindAssetsBasedAssetFilter(); filter.Filter = "t:texture tex_test"; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -25,9 +26,9 @@ public void IsMatch_ValidFilterWithValidFolder_ReturnTrue() filter.Filter = "t:texture tex_test"; filter.TargetFolder.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Folder); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -36,7 +37,7 @@ public void IsMatch_InValidFilter_ReturnFalse() var filter = new FindAssetsBasedAssetFilter(); filter.Filter = "t:texture tex_test_notexists"; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -46,7 +47,7 @@ public void IsMatch_ValidFilterWithInvalidFolder_ReturnFalse() filter.Filter = "t:texture tex_test"; filter.TargetFolder.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Dummy.PrefabDummy, typeof(GameObject), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Dummy.PrefabDummy, typeof(GameObject), false, null, null), Is.False); } [TestCase(null)] @@ -56,7 +57,7 @@ public void IsMatch_FilterIsNullOrWhiteSpace_ReturnFalse(string filterText) var filter = new FindAssetsBasedAssetFilter(); filter.Filter = filterText; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } } } diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs index 45d9ae9..0a8d964 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs @@ -6,6 +6,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; using Object = UnityEngine.Object; @@ -19,7 +20,7 @@ public void IsMatch_RegisterMatchedObject_ReturnTrue() var filter = new ObjectBasedAssetFilter(); filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); } [TestCase(FolderTargetingMode.IncludedNonFolderAssets, TestAssetRelativePaths.Shared.Texture64, typeof(Texture2D), @@ -37,7 +38,7 @@ public bool IsMatch_ObjectIsFolder(FolderTargetingMode targetingMode, string rel filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Folder); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [TestCase(FolderTargetingMode.IncludedNonFolderAssets, TestAssetRelativePaths.Dummy1.Folder, typeof(DefaultAsset), ExpectedResult = false)] @@ -56,7 +57,7 @@ public bool IsMatch_ObjectIsFolder_ContainsFilterDirectoryName_ReturnFalse(Folde filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [Test] @@ -65,7 +66,7 @@ public void IsMatch_RegisterNotMatchedObject_ReturnFalse() var filter = new ObjectBasedAssetFilter(); filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -76,7 +77,7 @@ public void IsMatch_RegisterObjectsAndContainsMatched_ReturnTrue() filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64)); filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture128)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -87,7 +88,7 @@ public void IsMatch_RegisterObjectsAndNotContainsMatched_ReturnFalse() filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture128)); filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture256)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -97,7 +98,7 @@ public void IsMatch_AnotherDirectoryContainsFilterDirectoryName_ReturnFalse() filter.Object.IsListMode = true; filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Dummy1.PrefabDummy, typeof(GameObject), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Dummy1.PrefabDummy, typeof(GameObject), false, null, null), Is.False); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs index 574d171..4755e26 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -17,7 +18,7 @@ public void IsMatch_RegisterMatchedRegex_ReturnTrue() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/Test/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -26,7 +27,7 @@ public void IsMatch_RegisterNotMatchedRegex_ReturnFalse() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/Test2/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -35,7 +36,7 @@ public void IsMatch_RegisterInvalidRegex_ReturnFalse() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/(Test/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.False); } [TestCase(AssetFilterCondition.ContainsMatched, "^Assets/Test/.+", "^Assets/Test2/.+", ExpectedResult = true)] @@ -57,7 +58,7 @@ public bool IsMatch_MultipleAssetPaths(AssetFilterCondition condition, string as filter.AssetPathRegex.AddValue(assetPath1); filter.AssetPathRegex.AddValue(assetPath2); filter.SetupForMatching(); - return filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false); + return filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null); } [TestCase(true, "^Assets/Test", ExpectedResult = true)] @@ -71,7 +72,7 @@ public bool IsMatch_TargetIsFolder(bool matchWithFolder, string targetAssetPath) filter.MatchWithFolders = matchWithFolder; filter.AssetPathRegex.Value = "Assets/Test"; filter.SetupForMatching(); - return filter.IsMatch(targetAssetPath, typeof(DefaultAsset), true); + return filter.IsMatch(targetAssetPath, typeof(DefaultAsset), true, null, null); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs index ae68110..2b71ad8 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -13,7 +14,7 @@ public void IsMatch_SetMatchedType_ReturnTrue() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture2D)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -22,7 +23,7 @@ public void IsMatch_SetDerivedType_ReturnTrue() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -31,7 +32,7 @@ public void IsMatch_SetNotMatchedType_ReturnFalse() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture3D)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -42,7 +43,7 @@ public void IsMatch_ContainsMatched_ReturnTrue() filter.Type.AddValue(TypeReference.Create(typeof(Texture3D))); filter.Type.AddValue(TypeReference.Create(typeof(Texture2D))); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -53,7 +54,7 @@ public void IsMatch_NotContainsMatched_ReturnTrue() filter.Type.AddValue(TypeReference.Create(typeof(Texture3D))); filter.Type.AddValue(TypeReference.Create(typeof(Texture2D))); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2DArray), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2DArray), false, null, null), Is.False); } [Test] @@ -63,7 +64,7 @@ public void IsMatch_InvertMatchAndSetMatchedType_ReturnFalse() filter.Type.Value = TypeReference.Create(typeof(Texture2D)); filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -73,7 +74,7 @@ public void IsMatch_InvertMatchAndSetNotMatchedType_ReturnTrue() filter.Type.Value = TypeReference.Create(typeof(Texture3D)); filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] diff --git a/README.md b/README.md index 8c52ce9..626bd88 100644 --- a/README.md +++ b/README.md @@ -674,6 +674,8 @@ public static class Example | Extension Filter | Filters by extension.
Use case: Target assets that have png or jpg extension.

**Extension**
Target extension. Multiple items can be specified by using the right toggle.

**Invert Match**
If checked, assets that do not match the conditions are targeted. | | Dependent Object Filter | Filters the assets that are referenced by the specified asset.
Use case: Targets the textures that are referenced by the prefab.

**Only Direct Dependencies**
Targets the assets that are referenced directly.

**Object**
Referer Assets. | | Find Assets Filter | Filters by using AssetDatabase.FindAssets().

**Filter**
Filter string to be passed to AssetDatabase.Find()

**Target Folders**
The folder to be searched.
If not specified, all folders will be searched. | +| Address Filter | Filters based on addresses.
Use case: Target only assets that match specific address patterns.

**Address (Regex)**
Target address pattern.
You can use regular expressions.
Multiple items can be specified by using the right toggle.

**Condition**
Specify how to handle multiple Addresses.
* Contains Matched: Target if any address matches.
* Match All: Target if all addresses match.
* Contains Unmatched: Target if any one address does not match.
* Not Match All: Target if all addresses do not match.

**Note**: This filter cannot be used with AddressRule. | +| Addressable Group Filter | Filters based on the Addressable Asset Group to which the asset belongs.
Use case: Target only assets that belong to specific groups.

**Addressable Asset Group**
Target Addressable Asset Groups.
Multiple items can be specified by using the right toggle.

**Invert Match**
If checked, assets that do not match the conditions are targeted.

**Note**: This filter cannot be used with AddressRule. | ### Address Provider @@ -687,6 +689,8 @@ public static class Example |---------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Constant Label Provider | Provides an constant label.

Label
Label name. | | Asset Path Based Label Provider | Provides an label based on the asset path of the target asset.

**Source**
How to specify the label.
* File Name
* File Name Without Extensions
* Asset Path

**Replace With Regex**
If checked, the Source will be replaced with regex. | +| Address Based Label Provider | Provides a label based on the address of the target asset.

**Replace With Regex**
If checked, the address will be replaced with regex using Pattern and Replacement. | +| Addressable Asset Group Name Based Label Provider | Provides a label based on the name of the Addressable Asset Group to which the target asset belongs.

**Replace With Regex**
If checked, the group name will be replaced with regex using Pattern and Replacement. | ### Version Provider @@ -694,6 +698,8 @@ public static class Example |-----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Constant Version Provider | Provides an constant version.

Version
version name. | | Asset Path Based Version Provider | Provides an version based on the asset path of the target asset.

**Source**
How to specify the version.
* File Name
* File Name Without Extensions
* Asset Path

**Replace With Regex**
If checked, the Source will be replaced with regex. | +| Address Based Version Provider | Provides a version based on the address of the target asset.

**Replace With Regex**
If checked, the address will be replaced with regex using Pattern and Replacement. | +| Addressable Asset Group Name Based Version Provider | Provides a version based on the name of the Addressable Asset Group to which the target asset belongs.

**Replace With Regex**
If checked, the group name will be replaced with regex using Pattern and Replacement. | ## Create your own Asset Filters / Providers @@ -704,6 +710,7 @@ You can create your own Asset Filter by inheriting the `AssetFilterAsset` class. ```cs using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; public sealed class ExampleAssetFilter : AssetFilterAsset { @@ -714,9 +721,11 @@ public sealed class ExampleAssetFilter : AssetFilterAsset // This method is executed on the main thread, so Unity API calls should be made here instead of in IsMatch } - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // Return true if the asset matches this filter + // address: The address assigned to the asset (will be null when called from AddressRule) + // addressableAssetGroup: The Addressable Asset Group the asset belongs to (will be null when called from AddressRule) // WARNING: This method may be executed outside the main thread, so Unity API calls are not allowed } @@ -741,6 +750,7 @@ You can create your own Provider by inheriting the `AddressProviderAsset` / `Lab ```cs using System; using SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; public sealed class ExampleAddressProvider : AddressProviderAsset @@ -752,9 +762,11 @@ public sealed class ExampleAddressProvider : AddressProviderAsset // This method is executed on the main thread, so Unity API calls should be made here instead of in Provide } - public override string Provide(string assetPath, Type assetType, bool isFolder) + public override string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // Return the address corresponding to the asset given as an argument + // address: The address assigned to the asset + // addressableAssetGroup: The Addressable Asset Group the asset belongs to // If there is no corresponding address, return null // WARNING: This method may be executed outside the main thread, so Unity API calls are not allowed } diff --git a/README_JA.md b/README_JA.md index e784861..c327eac 100644 --- a/README_JA.md +++ b/README_JA.md @@ -679,6 +679,8 @@ public static class Example | Extension Filter | アセットの拡張子を指定してフィルタリングします。
使用例: png あるいは jpg ファイルだけをレギュレーションの対象にする

**Extension**
対象の拡張子。
右側のトグルを切り替えることで複数指定することもできます。

**Invert Match**
チェックをつけると、条件にマッチしなかったアセットを対象とします。 | | Dependent Object Filter | 指定したアセットから参照されているアセットをフィルタリングします。
使用例: あるPrefabが参照するテクスチャを全て対象とする。

**Only Direct Dependencies**
直接参照しているアセットのみを対象とします。

**Object**
参照元のアセット。 | | Find Assets Filter | AssetDatabase.FindAssets()を用いてアセットをフィルタリングします。

**Filter**
AssetDatabase.Find()に渡すフィルタ文字列。

**Target Folders**
検索対象とするフォルダ。
指定しない場合全てのフォルダが対象となります。 | +| Address Filter | アドレスに基づいてアセットをフィルタリングします。
使用例: 特定のアドレスパターンにマッチするアセットのみを対象とする。

**Address (Regex)**
対象のアドレスパターン。
正規表現を使用することができます。
右側のトグルを切り替えることで複数指定することもできます。

**Condition**
Addressを複数指定する場合の取り扱い方を指定できます。
・Contains Matched: いずれかのアドレスがマッチしたら対象とする
・Match All: 全てのアドレスがマッチしたら対象とする
・Contains Unmatched: マッチしないアドレスが一つでもあれば対象とする
・Not Match All: 全てのアドレスにマッチしなかったら対象とする

**注意**: このフィルタはAddressRuleには使用できません。 | +| Addressable Group Filter | アセットが属するAddressableアセットグループに基づいてフィルタリングします。
使用例: 特定のグループに属するアセットのみを対象とする。

**Addressable Asset Group**
対象のAddressableアセットグループ。
右側のトグルを切り替えることで複数指定することもできます。

**Invert Match**
チェックをつけると、条件にマッチしなかったアセットを対象とします。

**注意**: このフィルタはAddressRuleには使用できません。 | ### Address Provider @@ -692,6 +694,8 @@ public static class Example |---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Constant Label Provider | 固定値でラベルを付与します。

Label
付与するラベルの名前。 | | Asset Path Based Label Provider | 対象アセットのアセットパスを元にラベルを付与します。

**Source**
以下のパターンからラベルを指定します。
・File Name: 拡張子付きファイル名
・File Name Without Extensions: 拡張子なしアセット名
・Asset Path: アセットパス

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、Source を Replacement で Regex.Replace したものをラベルとします。 | +| Address Based Label Provider | 対象アセットのアドレスを元にラベルを付与します。

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、アドレスを Replacement で Regex.Replace したものをラベルとします。 | +| Addressable Asset Group Name Based Label Provider | 対象アセットが属するAddressableアセットグループ名を元にラベルを付与します。

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、グループ名を Replacement で Regex.Replace したものをラベルとします。 | ### Version Provider @@ -699,6 +703,8 @@ public static class Example | --- | --- | | Constant Version Provider | 固定値でバージョンを付与します。

Label
付与するバージョンの名前。 | | Asset Path Based Version Provider | 対象アセットのアセットパスを元にバージョンを付与します。

**Source**
以下のパターンからバージョンを指定します。
・File Name: 拡張子付きファイル名
・File Name Without Extensions: 拡張子なしアセット名
・Asset Path: アセットパス

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、Source を Replacement で Regex.Replace したものをバージョンとします。 | +| Address Based Version Provider | 対象アセットのアドレスを元にバージョンを付与します。

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、アドレスを Replacement で Regex.Replace したものをバージョンとします。 | +| Addressable Asset Group Name Based Version Provider | 対象アセットが属するAddressableアセットグループ名を元にバージョンを付与します。

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、グループ名を Replacement で Regex.Replace したものをバージョンとします。 | ## 独自のアセットフィルタ、プロバイダを作成する @@ -708,6 +714,7 @@ public static class Example ```cs using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; public sealed class ExampleAssetFilter : AssetFilterAsset { @@ -718,9 +725,11 @@ public sealed class ExampleAssetFilter : AssetFilterAsset // メインスレッドで実行されるため、UnityのAPIを使用する処理はIsMatchではなくここで行う } - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // 引数に与えられたアセットがこのフィルタにマッチしていたらtrueを返す + // address: アセットに割り当てられたアドレス(AddressRuleで呼ばれる場合はnullになります) + // addressableAssetGroup: アセットが属するAddressableアセットグループ(AddressRuleで呼ばれる場合はnullになります) // 注意: このメソッドはメインスレッド外で実行される可能性があるためUnityのAPIを使用してはいけない } @@ -745,6 +754,7 @@ public sealed class ExampleAssetFilter : AssetFilterAsset ```cs using System; using SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; public sealed class ExampleAddressProvider : AddressProviderAsset @@ -756,9 +766,11 @@ public sealed class ExampleAddressProvider : AddressProviderAsset // メインスレッドで実行されるため、UnityのAPIを使用する処理はProvideではなくここで行う } - public override string Provide(string assetPath, Type assetType, bool isFolder) + public override string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // 引数に与えられたアセットに対応するアドレスを返す + // address: アセットに割り当てられたアドレス + // addressableAssetGroup: アセットが属するAddressableアセットグループ // 該当するアドレスが無い場合にはnullを返す // 注意: このメソッドはメインスレッド外で実行される可能性があるためUnityのAPIを使用してはいけない }