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