From 67a0f76e2ab039756ace4c06213bfb7ea593073c Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Fri, 27 Jun 2025 18:31:07 +0900 Subject: [PATCH 01/24] =?UTF-8?q?LabelRule=E3=81=AB=E3=82=A2=E3=83=89?= =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=81=A8AddressableAssetGroupName=E3=82=92?= =?UTF-8?q?=E6=B8=A1=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/LayoutRuleData.asset | 201 ++++++++++++ Assets/LayoutRuleData.asset.meta | 8 + .../LabelRules/AssetPathBasedLabelProvider.cs | 15 + .../LabelRules/ConstantLabelProvider.cs | 5 +- .../LabelRules/CustomLabelProvider.cs | 4 +- .../LayoutRules/LabelRules/ILabelProvider.cs | 27 +- .../LabelRules/LabelProviderAsset.cs | 5 +- .../LayoutRules/LabelRules/LabelRule.cs | 10 +- .../Core/Models/LayoutRules/LayoutRule.cs | 8 +- .../Models/Services/ApplyLayoutRuleService.cs | 4 +- .../Models/Services/BuildLayoutService.cs | 3 +- .../Models/Shared/AssetGroups/LabelRules.meta | 8 + Assets/test.unity | 301 ++++++++++++++++++ Assets/test.unity.meta | 7 + 14 files changed, 590 insertions(+), 16 deletions(-) create mode 100644 Assets/LayoutRuleData.asset create mode 100644 Assets/LayoutRuleData.asset.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/LabelRules.meta create mode 100644 Assets/test.unity create mode 100644 Assets/test.unity.meta diff --git a/Assets/LayoutRuleData.asset b/Assets/LayoutRuleData.asset new file mode 100644 index 0000000..3f26e41 --- /dev/null +++ b/Assets/LayoutRuleData.asset @@ -0,0 +1,201 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c113ff064b10c427fb3a071e46ace37d, type: 3} + m_Name: LayoutRuleData + m_EditorClassIdentifier: + _layoutRule: + _settings: + _excludeUnversioned: + _value: 0 + _didDispose: 0 + _versionExpression: + _value: + _didDispose: 0 + _addressRules: + _didDispose: 0 + _internalList: + - _id: 2868a28f-3312-430d-b459-90f22117eb50 + _addressableGroup: {fileID: 11400000, guid: e951bd4a5440a44ac8bad1e919845854, type: 2} + _control: + _value: 0 + _didDispose: 0 + _assetGroups: + _didDispose: 0 + _internalList: + - _id: b1498885-825f-4315-a9a0-4bdad5c0f37e + _name: + _value: Default Asset Group + _didDispose: 0 + _filters: + _didDispose: 0 + _internalList: [] + _addressProviderInternal: + id: 0 + _addressProviderDescription: + _value: 'Source: AssetPath' + _didDispose: 0 + _assetGroupDescription: + _value: (None) + _didDispose: 0 + - _id: 02bf8694-ce54-42c6-975e-11734ea9ec32 + _addressableGroup: {fileID: 11400000, guid: dc29f501fce884852a5e61aca42c489d, type: 2} + _control: + _value: 1 + _didDispose: 0 + _assetGroups: + _didDispose: 0 + _internalList: + - _id: 277212d5-0db5-48b8-bf03-771038abeb17 + _name: + _value: Default Asset Group + _didDispose: 0 + _filters: + _didDispose: 0 + _internalList: + - id: 1 + _addressProviderInternal: + id: 2 + _addressProviderDescription: + _value: 'Source: AssetPath' + _didDispose: 0 + _assetGroupDescription: + _value: 'Extension: png' + _didDispose: 0 + - _id: 9d6dc5d0-598f-4e3e-b61b-87563a9ae67d + _addressableGroup: {fileID: 11400000, guid: 271a4ace128b6461f82705c4fb81e90b, type: 2} + _control: + _value: 1 + _didDispose: 0 + _assetGroups: + _didDispose: 0 + _internalList: + - _id: d252f14a-f25e-455a-802a-dae29a71cf2a + _name: + _value: Test + _didDispose: 0 + _filters: + _didDispose: 0 + _internalList: + - id: 3 + - _id: 54ed566d-7d54-42b7-8394-b600446d7602 + _name: + _value: New Asset Group + _didDispose: 0 + _filters: + _didDispose: 0 + _internalList: + - id: 4 + _addressProviderInternal: + id: 5 + _addressProviderDescription: + _value: 'Source: AssetPath' + _didDispose: 0 + _assetGroupDescription: + _value: 'Match any of: Test' + _didDispose: 0 + _labelRules: + _didDispose: 0 + _internalList: + - _id: a38e5f92-1efb-4dd7-b35a-6909ee699dfc + _name: + _value: New Label Rule + _didDispose: 0 + _assetGroups: + _didDispose: 0 + _internalList: + - _id: 8e2a47ad-47a6-4cf9-9ccc-4f2ea18e6dad + _name: + _value: Default Asset Group + _didDispose: 0 + _filters: + _didDispose: 0 + _internalList: + - id: 6 + _labelProviderInternal: + id: 7 + _assetGroupDescription: + _value: No asset groups referenced + _didDispose: 0 + _labelProviderDescription: + _value: (None) + _didDispose: 0 + k__BackingField: + _didDispose: 0 + _versionRules: + _didDispose: 0 + _internalList: [] + references: + version: 1 + 00000000: + type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} + data: + _source: 2 + _replaceWithRegex: 0 + _pattern: + _replacement: + 00000001: + type: {class: ExtensionBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} + data: + _id: 8026401c-5d71-4f2a-b119-83bc71ad9416 + _extension: + _isListMode: 0 + _values: + - png + _invertMatch: 0 + _extensions: [] + _hasEmptyExtension: 0 + 00000002: + type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} + data: + _source: 2 + _replaceWithRegex: 0 + _pattern: + _replacement: + 00000003: + type: {class: FindAssetsBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} + data: + _id: e74f0f62-e526-4ab9-b95f-48f40b44eaca + _filter: + targetFolder: + _isListMode: 0 + _values: + - {fileID: 0} + 00000004: + type: {class: AssetGroupBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} + data: + _id: 14d1489b-b569-466a-b093-5540f0cd6979 + _assetGroupIds: + _isListMode: 1 + _values: + - d252f14a-f25e-455a-802a-dae29a71cf2a + _matchMode: 0 + _cachedAssetGroups: [] + 00000005: + type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} + data: + _source: 2 + _replaceWithRegex: 0 + _pattern: + _replacement: + 00000006: + type: {class: AssetGroupBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} + data: + _id: 75cc829d-3fe5-4fe1-bbc4-922606d0a294 + _assetGroupIds: + _isListMode: 1 + _values: [] + _matchMode: 0 + _cachedAssetGroups: [] + 00000007: + type: {class: ConstantLabelProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules, asm: SmartAddresser.Editor} + data: + _label: diff --git a/Assets/LayoutRuleData.asset.meta b/Assets/LayoutRuleData.asset.meta new file mode 100644 index 0000000..a380d4e --- /dev/null +++ b/Assets/LayoutRuleData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7003a1d5af84144159d90a90c145fd81 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + 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..f94f1d1 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs @@ -9,5 +9,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules [Serializable] public sealed class AssetPathBasedLabelProvider : AssetPathBasedProvider, ILabelProvider { + public void Setup() + { + ((IProvider)this).Setup(); + } + + public string Provide(string assetPath, Type assetType, bool isFolder, string address, + string addressableAssetGroupName) + { + return ((IProvider)this).Provide(assetPath, assetType, isFolder); + } + + public string GetDescription() + { + return ((IProvider)this).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..5fd7427 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs @@ -1,5 +1,4 @@ using System; -using SmartAddresser.Editor.Core.Models.Shared; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules @@ -18,11 +17,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, string addressableAssetGroupName) { 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..20e111b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/CustomLabelProvider.cs @@ -15,12 +15,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, string addressableAssetGroupName) { if (labelProvider == null) return null; - return labelProvider.Provide(assetPath, assetType, isFolder); + return labelProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); } 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..a1031e1 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs @@ -1,11 +1,32 @@ -using SmartAddresser.Editor.Core.Models.Shared; +using System; 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 name of 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, string addressableAssetGroupName); + + /// + /// 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..a3dd2c2 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs @@ -6,7 +6,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, + string addressableAssetGroupName); + 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..e21003f 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs @@ -79,12 +79,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 name of 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,6 +96,8 @@ public bool TryProvideLabel( string assetPath, Type assetType, bool isFolder, + string address, + string addressableAssetGroupName, out string label, bool checkIsPathValidForEntry = true ) @@ -110,7 +114,7 @@ public bool TryProvideLabel( return false; } - label = LabelProvider.Value.Provide(assetPath, assetType, isFolder); + label = LabelProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); 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..b21dc72 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 name of 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, + string addressableAssetGroupName, bool doSetup, bool checkIsPathValidForEntry = true ) @@ -132,7 +136,7 @@ public IReadOnlyCollection ProvideLabels( if (doSetup) labelRule.Setup(); - if (labelRule.TryProvideLabel(assetPath, assetType, isFolder, out var label, checkIsPathValidForEntry)) + if (labelRule.TryProvideLabel(assetPath, assetType, isFolder, address, addressableAssetGroupName, out var label, checkIsPathValidForEntry)) labels.Add(label); } diff --git a/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs b/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs index c0226b2..0531bbf 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs @@ -164,8 +164,10 @@ private bool TryAddEntry( _addressableSettingsAdapter.CreateOrMoveEntry(addressableGroupName, assetGuid, invokeModificationEvent); entryAdapter.SetAddress(address, invokeModificationEvent); + // Provide labels with addressable context (address and group name). + var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, addressableGroupName, 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..cc9392c 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs @@ -81,13 +81,14 @@ IReadOnlyList isFolders var assetPath = assetPaths[i]; var assetType = assetTypes[i]; var isFolder = isFolders[i]; + var groupName = addressRule.AddressableGroup.Name; // Address if (!addressRule.TryProvideAddress(assetPath, assetType, isFolder, out var address, false)) continue; // Labels - var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, false, false).ToArray(); + var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, groupName, false, false).ToArray(); // Versions var versions = new List(); 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/test.unity b/Assets/test.unity new file mode 100644 index 0000000..078be4c --- /dev/null +++ b/Assets/test.unity @@ -0,0 +1,301 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.4465785, g: 0.49641246, b: 0.57481706, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &103789768 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 103789770} + - component: {fileID: 103789769} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &103789769 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 103789768} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &103789770 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 103789768} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &193565308 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 193565311} + - component: {fileID: 193565310} + - component: {fileID: 193565309} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &193565309 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193565308} + m_Enabled: 1 +--- !u!20 &193565310 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193565308} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &193565311 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193565308} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/test.unity.meta b/Assets/test.unity.meta new file mode 100644 index 0000000..98cf21c --- /dev/null +++ b/Assets/test.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bd9dfb12b74fb4436be830ff3d5abb0d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 1c7fd67e0ca4fe247aac209c9b1abbb42c5a265b Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Fri, 27 Jun 2025 18:41:19 +0900 Subject: [PATCH 02/24] =?UTF-8?q?VersionRule=E3=81=AB=E3=82=A2=E3=83=89?= =?UTF-8?q?=E3=83=AC=E3=82=B9=E3=81=A8AddressableAssetGroupName=E3=82=92?= =?UTF-8?q?=E6=B8=A1=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Models/LayoutRules/LayoutRule.cs | 4 +-- .../AssetPathBasedVersionProvider.cs | 15 +++++++++++ .../VersionRules/ConstantVersionProvider.cs | 5 ++-- .../VersionRules/CustomVersionProvider.cs | 4 +-- .../VersionRules/IVersionProvider.cs | 27 ++++++++++++++++--- .../VersionRules/VersionProviderAsset.cs | 2 +- .../LayoutRules/VersionRules/VersionRule.cs | 10 ++++--- .../Models/Services/ApplyLayoutRuleService.cs | 2 +- .../Models/Services/BuildLayoutService.cs | 4 +-- 9 files changed, 56 insertions(+), 17 deletions(-) diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs index b21dc72..60e8c7f 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs @@ -143,7 +143,7 @@ public IReadOnlyCollection ProvideLabels( return labels; } - public string ProvideVersion(string assetPath, Type assetType, bool isFolder, bool doSetup) + public string ProvideVersion(string assetPath, Type assetType, bool isFolder, string address, string addressableAssetGroupName, bool doSetup) { foreach (var versionRule in _versionRules) { @@ -151,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, addressableAssetGroupName, out var version)) return version; } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs index edb9052..b4f9d2b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs @@ -9,5 +9,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules [Serializable] public sealed class AssetPathBasedVersionProvider : AssetPathBasedProvider, IVersionProvider { + public void Setup() + { + ((IProvider)this).Setup(); + } + + public string Provide(string assetPath, Type assetType, bool isFolder, string address, string addressableAssetGroupName) + { + // Asset path based provider doesn't use address or addressableAssetGroupName + return ((IProvider)this).Provide(assetPath, assetType, isFolder); + } + + public string GetDescription() + { + return ((IProvider)this).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..90876da 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs @@ -1,5 +1,4 @@ using System; -using SmartAddresser.Editor.Core.Models.Shared; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules @@ -18,11 +17,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, string addressableAssetGroupName) { 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..b042bb5 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/CustomVersionProvider.cs @@ -15,12 +15,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, string addressableAssetGroupName) { if (versionProvider == null) return null; - return versionProvider.Provide(assetPath, assetType, isFolder); + return versionProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); } 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..74a7e40 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs @@ -1,11 +1,32 @@ -using SmartAddresser.Editor.Core.Models.Shared; +using System; 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 name of 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, string addressableAssetGroupName); + + /// + /// 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..739819b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs @@ -6,7 +6,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, string addressableAssetGroupName); 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..2b01d2a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs @@ -78,12 +78,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 name of 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,6 +95,8 @@ public bool TryProvideVersion( string assetPath, Type assetType, bool isFolder, + string address, + string addressableAssetGroupName, out string version, bool checkIsPathValidForEntry = true ) @@ -109,7 +113,7 @@ public bool TryProvideVersion( return false; } - version = VersionProvider.Value.Provide(assetPath, assetType, isFolder); + version = VersionProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); 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 0531bbf..b326b4b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/ApplyLayoutRuleService.cs @@ -147,7 +147,7 @@ private bool TryAddEntry( 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, addressableGroupName, doSetup); if (string.IsNullOrEmpty(versionText) && layoutRule.Settings.ExcludeUnversioned.Value) return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs index cc9392c..13a03c3 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs @@ -81,20 +81,20 @@ IReadOnlyList isFolders var assetPath = assetPaths[i]; var assetType = assetTypes[i]; var isFolder = isFolders[i]; - var groupName = addressRule.AddressableGroup.Name; // Address if (!addressRule.TryProvideAddress(assetPath, assetType, isFolder, out var address, false)) continue; // Labels + var groupName = addressRule.AddressableGroup?.Name ?? string.Empty; var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, groupName, 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, groupName, out var version, false)) continue; versions.Add(version); From d9189269917d3468dcf9fc99e83ebaea4f6d4cc9 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Fri, 27 Jun 2025 18:50:42 +0900 Subject: [PATCH 03/24] remp --- .../LabelRules/AssetPathBasedLabelProvider.cs | 3 ++- .../LayoutRules/LabelRules/ConstantLabelProvider.cs | 3 ++- .../LayoutRules/LabelRules/CustomLabelProvider.cs | 5 +++-- .../Models/LayoutRules/LabelRules/ILabelProvider.cs | 5 +++-- .../LayoutRules/LabelRules/LabelProviderAsset.cs | 3 ++- .../Core/Models/LayoutRules/LabelRules/LabelRule.cs | 7 ++++--- .../Editor/Core/Models/LayoutRules/LayoutRule.cs | 10 +++++----- .../VersionRules/AssetPathBasedVersionProvider.cs | 3 ++- .../VersionRules/ConstantVersionProvider.cs | 3 ++- .../LayoutRules/VersionRules/CustomVersionProvider.cs | 5 +++-- .../LayoutRules/VersionRules/IVersionProvider.cs | 5 +++-- .../LayoutRules/VersionRules/VersionProviderAsset.cs | 3 ++- .../Models/LayoutRules/VersionRules/VersionRule.cs | 7 ++++--- .../Core/Models/Services/ApplyLayoutRuleService.cs | 10 ++++------ .../Editor/Core/Models/Services/BuildLayoutService.cs | 5 ++--- 15 files changed, 43 insertions(+), 34 deletions(-) diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs index f94f1d1..4a93cef 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 { @@ -15,7 +16,7 @@ public void Setup() } public string Provide(string assetPath, Type assetType, bool isFolder, string address, - string addressableAssetGroupName) + AddressableAssetGroup addressableAssetGroup) { return ((IProvider)this).Provide(assetPath, assetType, isFolder); } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs index 5fd7427..6ee90d7 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ConstantLabelProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules @@ -21,7 +22,7 @@ public void Setup() { } - public string Provide(string assetPath, Type assetType, bool isFolder, string address, string addressableAssetGroupName) + 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 20e111b..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, string address, string addressableAssetGroupName) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (labelProvider == null) return null; - return labelProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); + 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 a1031e1..de1283a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/ILabelProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules { @@ -19,9 +20,9 @@ public interface ILabelProvider /// The type of the asset. /// The asset is folder or not. /// The address assigned to the addressable entry. - /// The name of the addressable asset group. + /// 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, string addressableAssetGroupName); + string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup); /// /// Get the description of this rule for display in the UI. diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelProviderAsset.cs index a3dd2c2..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 @@ -8,7 +9,7 @@ public abstract class LabelProviderAsset : ScriptableObject, ILabelProvider public abstract void Setup(); public abstract string Provide(string assetPath, Type assetType, bool isFolder, string address, - string addressableAssetGroupName); + 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 e21003f..d98d0b5 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 @@ -85,7 +86,7 @@ public bool Validate(out LabelRuleValidationError error) /// /// /// The address assigned to the addressable entry. - /// The name of the addressable asset group. + /// The addressable asset group. /// If successful, assign the label. If not, null. /// /// If true, check if the asset path is valid for entry. @@ -97,7 +98,7 @@ public bool TryProvideLabel( Type assetType, bool isFolder, string address, - string addressableAssetGroupName, + AddressableAssetGroup addressableAssetGroup, out string label, bool checkIsPathValidForEntry = true ) @@ -114,7 +115,7 @@ public bool TryProvideLabel( return false; } - label = LabelProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); + 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 60e8c7f..509514a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LayoutRule.cs @@ -111,7 +111,7 @@ out AddressableAssetGroup addressableGroup /// /// /// The address assigned to the addressable entry. - /// The name of the addressable asset group. + /// The addressable asset group. /// /// /// If true, check if the asset path is valid for entry. @@ -123,7 +123,7 @@ public IReadOnlyCollection ProvideLabels( Type assetType, bool isFolder, string address, - string addressableAssetGroupName, + AddressableAssetGroup addressableAssetGroup, bool doSetup, bool checkIsPathValidForEntry = true ) @@ -136,14 +136,14 @@ public IReadOnlyCollection ProvideLabels( if (doSetup) labelRule.Setup(); - if (labelRule.TryProvideLabel(assetPath, assetType, isFolder, address, addressableAssetGroupName, 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, string address, string addressableAssetGroupName, bool doSetup) + public string ProvideVersion(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup, bool doSetup) { foreach (var versionRule in _versionRules) { @@ -151,7 +151,7 @@ public string ProvideVersion(string assetPath, Type assetType, bool isFolder, st versionRule.Setup(); // Adopt the first matching version. - if (versionRule.TryProvideVersion(assetPath, assetType, isFolder, address, addressableAssetGroupName, 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/AssetPathBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs index b4f9d2b..ab9078d 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 { @@ -14,7 +15,7 @@ public void Setup() ((IProvider)this).Setup(); } - public string Provide(string assetPath, Type assetType, bool isFolder, string address, string addressableAssetGroupName) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // Asset path based provider doesn't use address or addressableAssetGroupName return ((IProvider)this).Provide(assetPath, assetType, isFolder); diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs index 90876da..2dfd90a 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/ConstantVersionProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules @@ -21,7 +22,7 @@ public void Setup() { } - public string Provide(string assetPath, Type assetType, bool isFolder, string address, string addressableAssetGroupName) + 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 b042bb5..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, string address, string addressableAssetGroupName) + public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { if (versionProvider == null) return null; - return versionProvider.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); + 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 74a7e40..5f1f1e8 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/IVersionProvider.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor.AddressableAssets.Settings; namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules { @@ -19,9 +20,9 @@ public interface IVersionProvider /// The type of the asset. /// The asset is folder or not. /// The address assigned to the addressable entry. - /// The name of the addressable asset group. + /// 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, string addressableAssetGroupName); + string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup); /// /// Get the description of this rule for display in the UI. diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionProviderAsset.cs index 739819b..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, string address, string addressableAssetGroupName); + 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 2b01d2a..ac6d447 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 @@ -84,7 +85,7 @@ public bool Validate(out VersionRuleValidationError error) /// /// /// The address assigned to the addressable entry. - /// The name of the addressable asset group. + /// The addressable asset group. /// If successful, assign the version. If not, null. /// /// If true, check if the asset path is valid for entry. @@ -96,7 +97,7 @@ public bool TryProvideVersion( Type assetType, bool isFolder, string address, - string addressableAssetGroupName, + AddressableAssetGroup addressableAssetGroup, out string version, bool checkIsPathValidForEntry = true ) @@ -113,7 +114,7 @@ public bool TryProvideVersion( return false; } - version = VersionProvider.Value.Provide(assetPath, assetType, isFolder, address, addressableAssetGroupName); + 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 b326b4b..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, address, addressableGroupName, doSetup); + var versionText = layoutRule.ProvideVersion(assetPath, assetType, isFolder, address, addressableGroup, doSetup); if (string.IsNullOrEmpty(versionText) && layoutRule.Settings.ExcludeUnversioned.Value) return false; @@ -161,11 +159,11 @@ 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 name). - var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, addressableGroupName, doSetup); + // 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 addressableLabels = _addressableSettingsAdapter.GetLabels(); diff --git a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs index 13a03c3..8142df1 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Services/BuildLayoutService.cs @@ -87,14 +87,13 @@ IReadOnlyList isFolders continue; // Labels - var groupName = addressRule.AddressableGroup?.Name ?? string.Empty; - var labels = layoutRule.ProvideLabels(assetPath, assetType, isFolder, address, groupName, 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, address, groupName, out var version, false)) + if (!versionRule.TryProvideVersion(assetPath, assetType, isFolder, address, addressRule.AddressableGroup, out var version, false)) continue; versions.Add(version); From 8c9556ea1fe7953aea5d7b90d2f9df94c533f942 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 12:39:18 +0900 Subject: [PATCH 04/24] =?UTF-8?q?IProvider=E3=82=A4=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=95=E3=82=A7=E3=83=BC=E3=82=B9=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=97=E3=81=A6IAddressProvider=E3=81=AB=E7=B5=B1?= =?UTF-8?q?=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IProviderは現在IAddressProviderでしか使用されていないため、 IProviderを削除し、そのメソッドをIAddressProviderに直接定義するように変更。 - IAddressProviderにSetup、Provide、GetDescriptionメソッドを直接定義 - AssetPathBasedProviderからIProviderの実装を削除 - AssetPathBasedVersionProvider/LabelProviderをbaseクラスのメソッドを呼び出すように修正 - IProvider.csとそのメタファイルを削除 - テストコードのIProviderへのキャストを削除 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressRules/IAddressProvider.cs | 9 +++++++-- .../LabelRules/AssetPathBasedLabelProvider.cs | 12 ++++++------ .../AssetPathBasedVersionProvider.cs | 12 ++++++------ .../Models/Shared/AssetPathBasedProvider.cs | 8 ++++---- .../Editor/Core/Models/Shared/IProvider.cs | 13 ------------- .../Core/Models/Shared/IProvider.cs.meta | 11 ----------- .../Shared/AssetPathBasedProviderTest.cs | 18 ++++++++---------- 7 files changed, 31 insertions(+), 52 deletions(-) delete mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs delete mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta 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/AssetPathBasedLabelProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs index 4a93cef..e30cd28 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AssetPathBasedLabelProvider.cs @@ -10,20 +10,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules [Serializable] public sealed class AssetPathBasedLabelProvider : AssetPathBasedProvider, ILabelProvider { - public void Setup() + void ILabelProvider.Setup() { - ((IProvider)this).Setup(); + base.Setup(); } - public string Provide(string assetPath, Type assetType, bool isFolder, string address, + string ILabelProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { - return ((IProvider)this).Provide(assetPath, assetType, isFolder); + return base.Provide(assetPath, assetType, isFolder); } - public string GetDescription() + string ILabelProvider.GetDescription() { - return ((IProvider)this).GetDescription(); + return base.GetDescription(); } } } diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs index ab9078d..ceba012 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AssetPathBasedVersionProvider.cs @@ -10,20 +10,20 @@ namespace SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules [Serializable] public sealed class AssetPathBasedVersionProvider : AssetPathBasedProvider, IVersionProvider { - public void Setup() + void IVersionProvider.Setup() { - ((IProvider)this).Setup(); + base.Setup(); } - public string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) + string IVersionProvider.Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // Asset path based provider doesn't use address or addressableAssetGroupName - return ((IProvider)this).Provide(assetPath, assetType, isFolder); + return base.Provide(assetPath, assetType, isFolder); } - public string GetDescription() + string IVersionProvider.GetDescription() { - return ((IProvider)this).GetDescription(); + return base.GetDescription(); } } } 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/Models/Shared/IProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta deleted file mode 100644 index 9707a7e..0000000 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/IProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8460f7827ec164982b63a8d87bab6dc5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: 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")); From 502b48299e271a28c2eaec70b6d65534bf01bcd4 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 14:03:11 +0900 Subject: [PATCH 05/24] =?UTF-8?q?feat:=20IAssetFilter=E3=81=AEIsMatch?= =?UTF-8?q?=E3=81=AB=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=A8=E3=82=B0?= =?UTF-8?q?=E3=83=AB=E3=83=BC=E3=83=97=E6=83=85=E5=A0=B1=E3=82=92=E6=B8=A1?= =?UTF-8?q?=E3=81=9B=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E6=8B=A1=E5=BC=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IAssetFilter.IsMatchにaddressとaddressableAssetGroupパラメータを追加 - AssetGroup/AssetGroupObservableListのContainsメソッドを更新 - AddressRuleではアドレスが未定のためnullを渡す - LabelRule/VersionRuleでは実際のアドレスとグループ情報を渡す - AssetFilterBase/AssetFilterAssetに新シグネチャを実装(後方互換性を維持) - CustomAssetFilterを新しいシグネチャに更新 これにより、フィルター実装でアドレスやグループ情報に基づいた より柔軟なフィルタリングが可能になりました。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../Core/Models/LayoutRules/AddressRules/AddressRule.cs | 2 +- .../Core/Models/LayoutRules/LabelRules/LabelRule.cs | 2 +- .../Core/Models/LayoutRules/VersionRules/VersionRule.cs | 2 +- .../AssetGroups/AssetFilterImpl/AssetFilterAsset.cs | 9 +++++++++ .../AssetGroups/AssetFilterImpl/AssetFilterBase.cs | 9 +++++++++ .../AssetGroups/AssetFilterImpl/CustomAssetFilter.cs | 8 +++++--- .../Editor/Core/Models/Shared/AssetGroups/AssetGroup.cs | 8 ++++++-- .../Shared/AssetGroups/AssetGroupObservableList.cs | 8 ++++++-- .../Core/Models/Shared/AssetGroups/IAssetFilter.cs | 9 ++++++--- 9 files changed, 44 insertions(+), 13 deletions(-) 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/LabelRules/LabelRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs index d98d0b5..3e274a0 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/LabelRule.cs @@ -103,7 +103,7 @@ public bool TryProvideLabel( bool checkIsPathValidForEntry = true ) { - if (!_assetGroups.Contains(assetPath, assetType, isFolder)) + if (!_assetGroups.Contains(assetPath, assetType, isFolder, address, addressableAssetGroup)) { label = null; return false; diff --git a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs index ac6d447..6cfc8fa 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/VersionRule.cs @@ -102,7 +102,7 @@ public bool TryProvideVersion( bool checkIsPathValidForEntry = true ) { - if (!_assetGroups.Contains(assetPath, assetType, isFolder)) + if (!_assetGroups.Contains(assetPath, assetType, isFolder, address, addressableAssetGroup)) { version = null; return false; 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..2dc5866 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterAsset.cs @@ -19,6 +19,15 @@ public virtual bool Validate(out AssetFilterValidationError error) } /// + public bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, UnityEditor.AddressableAssets.Settings.AddressableAssetGroup addressableAssetGroup) + { + return IsMatch(assetPath, assetType, isFolder); + } + + /// + /// Legacy IsMatch method for backward compatibility. + /// Override this method in derived classes to implement filtering logic. + /// public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder); /// 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..abea9b2 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AssetFilterBase.cs @@ -23,6 +23,15 @@ protected AssetFilterBase() public abstract bool Validate(out AssetFilterValidationError error); /// + public bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, UnityEditor.AddressableAssets.Settings.AddressableAssetGroup addressableAssetGroup) + { + return IsMatch(assetPath, assetType, isFolder); + } + + /// + /// Legacy IsMatch method for backward compatibility. + /// Override this method in derived classes to implement filtering logic. + /// public abstract bool IsMatch(string assetPath, Type assetType, bool isFolder); /// 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/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. From e6f86e91f38b647b274464589f160f822052b705 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 14:10:09 +0900 Subject: [PATCH 06/24] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/LayoutRuleData.asset | 201 --------------------- Assets/LayoutRuleData.asset.meta | 8 - Assets/test.unity | 301 ------------------------------- Assets/test.unity.meta | 7 - 4 files changed, 517 deletions(-) delete mode 100644 Assets/LayoutRuleData.asset delete mode 100644 Assets/LayoutRuleData.asset.meta delete mode 100644 Assets/test.unity delete mode 100644 Assets/test.unity.meta diff --git a/Assets/LayoutRuleData.asset b/Assets/LayoutRuleData.asset deleted file mode 100644 index 3f26e41..0000000 --- a/Assets/LayoutRuleData.asset +++ /dev/null @@ -1,201 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c113ff064b10c427fb3a071e46ace37d, type: 3} - m_Name: LayoutRuleData - m_EditorClassIdentifier: - _layoutRule: - _settings: - _excludeUnversioned: - _value: 0 - _didDispose: 0 - _versionExpression: - _value: - _didDispose: 0 - _addressRules: - _didDispose: 0 - _internalList: - - _id: 2868a28f-3312-430d-b459-90f22117eb50 - _addressableGroup: {fileID: 11400000, guid: e951bd4a5440a44ac8bad1e919845854, type: 2} - _control: - _value: 0 - _didDispose: 0 - _assetGroups: - _didDispose: 0 - _internalList: - - _id: b1498885-825f-4315-a9a0-4bdad5c0f37e - _name: - _value: Default Asset Group - _didDispose: 0 - _filters: - _didDispose: 0 - _internalList: [] - _addressProviderInternal: - id: 0 - _addressProviderDescription: - _value: 'Source: AssetPath' - _didDispose: 0 - _assetGroupDescription: - _value: (None) - _didDispose: 0 - - _id: 02bf8694-ce54-42c6-975e-11734ea9ec32 - _addressableGroup: {fileID: 11400000, guid: dc29f501fce884852a5e61aca42c489d, type: 2} - _control: - _value: 1 - _didDispose: 0 - _assetGroups: - _didDispose: 0 - _internalList: - - _id: 277212d5-0db5-48b8-bf03-771038abeb17 - _name: - _value: Default Asset Group - _didDispose: 0 - _filters: - _didDispose: 0 - _internalList: - - id: 1 - _addressProviderInternal: - id: 2 - _addressProviderDescription: - _value: 'Source: AssetPath' - _didDispose: 0 - _assetGroupDescription: - _value: 'Extension: png' - _didDispose: 0 - - _id: 9d6dc5d0-598f-4e3e-b61b-87563a9ae67d - _addressableGroup: {fileID: 11400000, guid: 271a4ace128b6461f82705c4fb81e90b, type: 2} - _control: - _value: 1 - _didDispose: 0 - _assetGroups: - _didDispose: 0 - _internalList: - - _id: d252f14a-f25e-455a-802a-dae29a71cf2a - _name: - _value: Test - _didDispose: 0 - _filters: - _didDispose: 0 - _internalList: - - id: 3 - - _id: 54ed566d-7d54-42b7-8394-b600446d7602 - _name: - _value: New Asset Group - _didDispose: 0 - _filters: - _didDispose: 0 - _internalList: - - id: 4 - _addressProviderInternal: - id: 5 - _addressProviderDescription: - _value: 'Source: AssetPath' - _didDispose: 0 - _assetGroupDescription: - _value: 'Match any of: Test' - _didDispose: 0 - _labelRules: - _didDispose: 0 - _internalList: - - _id: a38e5f92-1efb-4dd7-b35a-6909ee699dfc - _name: - _value: New Label Rule - _didDispose: 0 - _assetGroups: - _didDispose: 0 - _internalList: - - _id: 8e2a47ad-47a6-4cf9-9ccc-4f2ea18e6dad - _name: - _value: Default Asset Group - _didDispose: 0 - _filters: - _didDispose: 0 - _internalList: - - id: 6 - _labelProviderInternal: - id: 7 - _assetGroupDescription: - _value: No asset groups referenced - _didDispose: 0 - _labelProviderDescription: - _value: (None) - _didDispose: 0 - k__BackingField: - _didDispose: 0 - _versionRules: - _didDispose: 0 - _internalList: [] - references: - version: 1 - 00000000: - type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} - data: - _source: 2 - _replaceWithRegex: 0 - _pattern: - _replacement: - 00000001: - type: {class: ExtensionBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} - data: - _id: 8026401c-5d71-4f2a-b119-83bc71ad9416 - _extension: - _isListMode: 0 - _values: - - png - _invertMatch: 0 - _extensions: [] - _hasEmptyExtension: 0 - 00000002: - type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} - data: - _source: 2 - _replaceWithRegex: 0 - _pattern: - _replacement: - 00000003: - type: {class: FindAssetsBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} - data: - _id: e74f0f62-e526-4ab9-b95f-48f40b44eaca - _filter: - targetFolder: - _isListMode: 0 - _values: - - {fileID: 0} - 00000004: - type: {class: AssetGroupBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} - data: - _id: 14d1489b-b569-466a-b093-5540f0cd6979 - _assetGroupIds: - _isListMode: 1 - _values: - - d252f14a-f25e-455a-802a-dae29a71cf2a - _matchMode: 0 - _cachedAssetGroups: [] - 00000005: - type: {class: AssetPathBasedAddressProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules, asm: SmartAddresser.Editor} - data: - _source: 2 - _replaceWithRegex: 0 - _pattern: - _replacement: - 00000006: - type: {class: AssetGroupBasedAssetFilter, ns: SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl, asm: SmartAddresser.Editor} - data: - _id: 75cc829d-3fe5-4fe1-bbc4-922606d0a294 - _assetGroupIds: - _isListMode: 1 - _values: [] - _matchMode: 0 - _cachedAssetGroups: [] - 00000007: - type: {class: ConstantLabelProvider, ns: SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules, asm: SmartAddresser.Editor} - data: - _label: diff --git a/Assets/LayoutRuleData.asset.meta b/Assets/LayoutRuleData.asset.meta deleted file mode 100644 index a380d4e..0000000 --- a/Assets/LayoutRuleData.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7003a1d5af84144159d90a90c145fd81 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/test.unity b/Assets/test.unity deleted file mode 100644 index 078be4c..0000000 --- a/Assets/test.unity +++ /dev/null @@ -1,301 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.4465785, g: 0.49641246, b: 0.57481706, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &103789768 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 103789770} - - component: {fileID: 103789769} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &103789769 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 103789768} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &103789770 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 103789768} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &193565308 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 193565311} - - component: {fileID: 193565310} - - component: {fileID: 193565309} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &193565309 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193565308} - m_Enabled: 1 ---- !u!20 &193565310 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193565308} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &193565311 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193565308} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/test.unity.meta b/Assets/test.unity.meta deleted file mode 100644 index 98cf21c..0000000 --- a/Assets/test.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: bd9dfb12b74fb4436be830ff3d5abb0d -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 538a8715631a3a4775f9e28d5fcd33f2c98386e0 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 14:27:34 +0900 Subject: [PATCH 07/24] =?UTF-8?q?fix:=20AssetFilterBase=E3=81=AEIsMatch?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E3=82=B7=E3=82=B0?= =?UTF-8?q?=E3=83=8D=E3=83=81=E3=83=A3=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AssetFilterBaseの抽象メソッドIsMatchにaddressとaddressableAssetGroup パラメータを追加し、全ての継承クラスで対応する修正を実施 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AssetGroups/AssetFilterImpl/AssetFilterBase.cs | 13 +++---------- .../DependentObjectBasedAssetFilter.cs | 4 +++- .../AssetFilterImpl/ExtensionBasedAssetFilter.cs | 3 ++- .../AssetFilterImpl/FindAssetsBasedAssetFilter.cs | 3 ++- .../AssetFilterImpl/ObjectBasedAssetFilter.cs | 3 ++- .../AssetFilterImpl/RegexBasedAssetFilter.cs | 3 ++- .../AssetFilterImpl/TypeBasedAssetFilter.cs | 3 ++- 7 files changed, 16 insertions(+), 16 deletions(-) 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 abea9b2..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,16 +24,8 @@ protected AssetFilterBase() public abstract bool Validate(out AssetFilterValidationError error); /// - public bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, UnityEditor.AddressableAssets.Settings.AddressableAssetGroup addressableAssetGroup) - { - return IsMatch(assetPath, assetType, isFolder); - } - - /// - /// Legacy IsMatch method for backward compatibility. - /// Override this method in derived classes to implement filtering logic. - /// - 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/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; From 41b3d1300e26f99f4af39132364623a39dc828d3 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 14:48:17 +0900 Subject: [PATCH 08/24] =?UTF-8?q?fix:=20AssetFilter=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=81=AEIsMatch=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 全てのAssetFilterテストファイルでIsMatchメソッドの新しいシグネチャに対応 - addressとaddressableAssetGroupパラメータを追加 - 両パラメータにはnullを指定 - 必要なusing文を追加 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../DependentObjectBasedAssetFilterTest.cs | 5 +++-- .../ExtensionBasedAssetFilterTest.cs | 15 ++++++++------- .../FindAssetsBasedAssetFilterTest.cs | 19 ++++++++++--------- .../ObjectBasedAssetFilterTest.cs | 15 ++++++++------- .../RegexBasedAssetFilterTest.cs | 11 ++++++----- .../TypeBasedAssetFilterTest.cs | 15 ++++++++------- 6 files changed, 43 insertions(+), 37 deletions(-) diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs index 2a71c5b..a2be57e 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/DependentObjectBasedAssetFilterTest.cs @@ -2,6 +2,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; using Object = UnityEngine.Object; @@ -18,7 +19,7 @@ public bool IsMatch(string relativeAssetPath, Type assetType) filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.PrefabTex64); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [TestCase(TestAssetRelativePaths.Shared.Texture64, typeof(Texture2D), false, ExpectedResult = true)] @@ -36,7 +37,7 @@ bool onlyDirectDependencies filter.OnlyDirectDependencies = onlyDirectDependencies; filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs index 8a31529..1c1a5b6 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ExtensionBasedAssetFilterTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -16,7 +17,7 @@ public void IsMatch_RegisterMatchedExtension_ReturnTrue() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = "png"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -25,7 +26,7 @@ public void IsMatch_RegisterMatchedExtensionWithDot_ReturnTrue() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = ".png"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -34,7 +35,7 @@ public void IsMatch_RegisterNotMatchedExtension_ReturnFalse() var filter = new ExtensionBasedAssetFilter(); filter.Extension.Value = "jpg"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -45,7 +46,7 @@ public void IsMatch_RegisterExtensionsAndContainsMatched_ReturnTrue() filter.Extension.AddValue("png"); filter.Extension.AddValue("jpg"); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -56,7 +57,7 @@ public void IsMatch_RegisterExtensionsAndNotContainsMatched_ReturnFalse() filter.Extension.AddValue("jpg"); filter.Extension.AddValue("exr"); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -66,7 +67,7 @@ public void IsMatch_InvertMatchAndRegisterMatchedExtension_ReturnFalse() filter.Extension.Value = "png"; filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -76,7 +77,7 @@ public void IsMatch_InvertMatchAndRegisterNotMatchedExtension_ReturnTrue() filter.Extension.Value = "jpg"; filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs index 89d28a5..323c9c1 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/FindAssetsBasedAssetFilterTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -13,9 +14,9 @@ public void IsMatch_ValidFilter_ReturnTrue() var filter = new FindAssetsBasedAssetFilter(); filter.Filter = "t:texture tex_test"; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -25,9 +26,9 @@ public void IsMatch_ValidFilterWithValidFolder_ReturnTrue() filter.Filter = "t:texture tex_test"; filter.TargetFolder.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Folder); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.True); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture256, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -36,7 +37,7 @@ public void IsMatch_InValidFilter_ReturnFalse() var filter = new FindAssetsBasedAssetFilter(); filter.Filter = "t:texture tex_test_notexists"; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -46,7 +47,7 @@ public void IsMatch_ValidFilterWithInvalidFolder_ReturnFalse() filter.Filter = "t:texture tex_test"; filter.TargetFolder.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Dummy.PrefabDummy, typeof(GameObject), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Dummy.PrefabDummy, typeof(GameObject), false, null, null), Is.False); } [TestCase(null)] @@ -56,7 +57,7 @@ public void IsMatch_FilterIsNullOrWhiteSpace_ReturnFalse(string filterText) var filter = new FindAssetsBasedAssetFilter(); filter.Filter = filterText; filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } } } diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs index 45d9ae9..0a8d964 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/ObjectBasedAssetFilterTest.cs @@ -6,6 +6,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; using Object = UnityEngine.Object; @@ -19,7 +20,7 @@ public void IsMatch_RegisterMatchedObject_ReturnTrue() var filter = new ObjectBasedAssetFilter(); filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); } [TestCase(FolderTargetingMode.IncludedNonFolderAssets, TestAssetRelativePaths.Shared.Texture64, typeof(Texture2D), @@ -37,7 +38,7 @@ public bool IsMatch_ObjectIsFolder(FolderTargetingMode targetingMode, string rel filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Folder); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [TestCase(FolderTargetingMode.IncludedNonFolderAssets, TestAssetRelativePaths.Dummy1.Folder, typeof(DefaultAsset), ExpectedResult = false)] @@ -56,7 +57,7 @@ public bool IsMatch_ObjectIsFolder_ContainsFilterDirectoryName_ReturnFalse(Folde filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder); filter.SetupForMatching(); var assetPath = TestAssetPaths.CreateAbsoluteAssetPath(relativeAssetPath); - return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset)); + return filter.IsMatch(assetPath, assetType, assetType == typeof(DefaultAsset), null, null); } [Test] @@ -65,7 +66,7 @@ public void IsMatch_RegisterNotMatchedObject_ReturnFalse() var filter = new ObjectBasedAssetFilter(); filter.Object.Value = AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture128, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -76,7 +77,7 @@ public void IsMatch_RegisterObjectsAndContainsMatched_ReturnTrue() filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture64)); filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture128)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -87,7 +88,7 @@ public void IsMatch_RegisterObjectsAndNotContainsMatched_ReturnFalse() filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture128)); filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Shared.Texture256)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Shared.Texture64, typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -97,7 +98,7 @@ public void IsMatch_AnotherDirectoryContainsFilterDirectoryName_ReturnFalse() filter.Object.IsListMode = true; filter.Object.AddValue(AssetDatabase.LoadAssetAtPath(TestAssetPaths.Dummy.Folder)); filter.SetupForMatching(); - Assert.That(filter.IsMatch(TestAssetPaths.Dummy1.PrefabDummy, typeof(GameObject), false), Is.False); + Assert.That(filter.IsMatch(TestAssetPaths.Dummy1.PrefabDummy, typeof(GameObject), false, null, null), Is.False); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs index 574d171..4755e26 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/RegexBasedAssetFilterTest.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; using UnityEditor; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -17,7 +18,7 @@ public void IsMatch_RegisterMatchedRegex_ReturnTrue() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/Test/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -26,7 +27,7 @@ public void IsMatch_RegisterNotMatchedRegex_ReturnFalse() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/Test2/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -35,7 +36,7 @@ public void IsMatch_RegisterInvalidRegex_ReturnFalse() var filter = new RegexBasedAssetFilter(); filter.AssetPathRegex.Value = "^Assets/(Test/.+"; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null), Is.False); } [TestCase(AssetFilterCondition.ContainsMatched, "^Assets/Test/.+", "^Assets/Test2/.+", ExpectedResult = true)] @@ -57,7 +58,7 @@ public bool IsMatch_MultipleAssetPaths(AssetFilterCondition condition, string as filter.AssetPathRegex.AddValue(assetPath1); filter.AssetPathRegex.AddValue(assetPath2); filter.SetupForMatching(); - return filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false); + return filter.IsMatch("Assets/Test/Test.png", typeof(Texture2D), false, null, null); } [TestCase(true, "^Assets/Test", ExpectedResult = true)] @@ -71,7 +72,7 @@ public bool IsMatch_TargetIsFolder(bool matchWithFolder, string targetAssetPath) filter.MatchWithFolders = matchWithFolder; filter.AssetPathRegex.Value = "Assets/Test"; filter.SetupForMatching(); - return filter.IsMatch(targetAssetPath, typeof(DefaultAsset), true); + return filter.IsMatch(targetAssetPath, typeof(DefaultAsset), true, null, null); } [Test] diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs index ae68110..2b71ad8 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/TypeBasedAssetFilterTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl @@ -13,7 +14,7 @@ public void IsMatch_SetMatchedType_ReturnTrue() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture2D)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -22,7 +23,7 @@ public void IsMatch_SetDerivedType_ReturnTrue() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -31,7 +32,7 @@ public void IsMatch_SetNotMatchedType_ReturnFalse() var filter = new TypeBasedAssetFilter(); filter.Type.Value = TypeReference.Create(typeof(Texture3D)); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -42,7 +43,7 @@ public void IsMatch_ContainsMatched_ReturnTrue() filter.Type.AddValue(TypeReference.Create(typeof(Texture3D))); filter.Type.AddValue(TypeReference.Create(typeof(Texture2D))); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] @@ -53,7 +54,7 @@ public void IsMatch_NotContainsMatched_ReturnTrue() filter.Type.AddValue(TypeReference.Create(typeof(Texture3D))); filter.Type.AddValue(TypeReference.Create(typeof(Texture2D))); filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2DArray), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2DArray), false, null, null), Is.False); } [Test] @@ -63,7 +64,7 @@ public void IsMatch_InvertMatchAndSetMatchedType_ReturnFalse() filter.Type.Value = TypeReference.Create(typeof(Texture2D)); filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.False); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.False); } [Test] @@ -73,7 +74,7 @@ public void IsMatch_InvertMatchAndSetNotMatchedType_ReturnTrue() filter.Type.Value = TypeReference.Create(typeof(Texture3D)); filter.InvertMatch = true; filter.SetupForMatching(); - Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false), Is.True); + Assert.That(filter.IsMatch("Assets/Test.png", typeof(Texture2D), false, null, null), Is.True); } [Test] From d29a4364ecbbfe21ae65f2168ffd5e3b8f5ec1d3 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 14:54:45 +0900 Subject: [PATCH 09/24] =?UTF-8?q?feat:=20AddressBasedAssetFilter=E3=81=A8?= =?UTF-8?q?=E3=81=9D=E3=81=AEDrawer=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit アドレスに対して正規表現でフィルタリングするAddressBasedAssetFilterを実装 - RegexBasedAssetFilterを参考に実装 - アドレスパラメータを使用してマッチングを実行 - 対応するエディタUI用のDrawerも追加 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressBasedAssetFilter.cs | 158 ++++++++++++++++++ .../AddressBasedAssetFilter.cs.meta | 11 ++ .../AddressBasedAssetFilterDrawer.cs | 28 ++++ .../AddressBasedAssetFilterDrawer.cs.meta | 11 ++ 4 files changed, 208 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressBasedAssetFilterDrawer.cs.meta 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..bc88257 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs @@ -0,0 +1,158 @@ +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")] + 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/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 From 6fcee89a9a7de38ca55ade3b2887a3a2476b6e15 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 15:14:07 +0900 Subject: [PATCH 10/24] =?UTF-8?q?feat:=20AddressableAssetGroupBasedAssetFi?= =?UTF-8?q?lter=E3=81=A8=E3=81=9D=E3=81=AEDrawer=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 特定のAddressableAssetGroupに属するアセットをフィルタリングする機能を実装 - AddressableAssetGroupの参照をListablePropertyで保持 - 専用のListablePropertyGUIクラスも追加 - エディタUI用のDrawerを実装 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressableAssetGroupBasedAssetFilter.cs | 98 +++++++++++++++++++ ...ressableAssetGroupBasedAssetFilter.cs.meta | 11 +++ ...essableAssetGroupBasedAssetFilterDrawer.cs | 26 +++++ ...leAssetGroupBasedAssetFilterDrawer.cs.meta | 11 +++ ...ddressableAssetGroupListablePropertyGUI.cs | 24 +++++ ...sableAssetGroupListablePropertyGUI.cs.meta | 11 +++ 6 files changed, 181 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetFilterDrawer/AddressableAssetGroupBasedAssetFilterDrawer.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs create mode 100644 Assets/SmartAddresser/Editor/Foundation/ListableProperty/AddressableAssetGroupListablePropertyGUI.cs.meta 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..d7d1f1c --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs @@ -0,0 +1,98 @@ +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")] + 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/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/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 From ddf7ee29697b904557fc256caf29ad1ded20f02f Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 15:58:23 +0900 Subject: [PATCH 11/24] =?UTF-8?q?feat:=20Rule=E3=82=BF=E3=82=A4=E3=83=97?= =?UTF-8?q?=E3=81=AB=E5=9F=BA=E3=81=A5=E3=81=8FAssetFilter=E3=81=AE?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=88=B6=E9=99=90=E6=A9=9F=E8=83=BD=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RestrictedToRulesAttribute を追加し、特定のRuleタイプでのみ使用可能なAssetFilterを指定できるように - AddressBasedAssetFilter と AddressableAssetGroupBasedAssetFilter に制限を追加(Label、Versionルールでのみ使用可能) - AssetGroupPanelPresenter と AssetGroupCollectionPanelPresenter のコンストラクタでRuleTypeを受け取るように変更 - 各RulePresenterから適切なRuleTypeを渡すように修正 これにより、AddressRuleのGUIではAddressBasedAssetFilterとAddressableAssetGroupBasedAssetFilterが選択できなくなりました。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AssetGroupPanelDevelopmentWindow.cs | 3 +- .../AddressBasedAssetFilter.cs | 1 + .../AddressableAssetGroupBasedAssetFilter.cs | 1 + .../AssetGroups/RestrictedToRulesAttribute.cs | 46 +++++++++++++++++++ .../RestrictedToRulesAttribute.cs.meta | 11 +++++ .../AddressRuleEditorInspectorPresenter.cs | 3 +- .../LabelRuleEditorInspectorPresenter.cs | 3 +- .../VersionRuleEditorInspectorPresenter.cs | 3 +- .../AssetGroupCollectionPanelPresenter.cs | 6 ++- .../AssetGroups/AssetGroupPanelPresenter.cs | 20 +++++++- 10 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/RestrictedToRulesAttribute.cs.meta 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/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs index bc88257..4c5be71 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilter.cs @@ -15,6 +15,7 @@ namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl /// [Serializable] [AssetFilter("Address Filter", "Address Filter")] + [RestrictedToRules(RuleType.Label, RuleType.Version)] public sealed class AddressBasedAssetFilter : AssetFilterBase { [SerializeField] private bool _matchWithFolders; diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs index d7d1f1c..ecc4681 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilter.cs @@ -13,6 +13,7 @@ namespace SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl /// [Serializable] [AssetFilter("Addressable Group Filter", "Addressable Group Filter")] + [RestrictedToRules(RuleType.Label, RuleType.Version)] public sealed class AddressableAssetGroupBasedAssetFilter : AssetFilterBase { [SerializeField] 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/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/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/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/AssetGroupCollectionPanelPresenter.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/Shared/AssetGroups/AssetGroupCollectionPanelPresenter.cs index 92b3871..153efac 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? _ruleContext; 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? ruleContext = null) { _view = view; _history = history; _saveService = saveService; + _ruleContext = ruleContext; 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, _ruleContext); 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..d6d2f42 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? _ruleContext; 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? ruleContext = null) { _view = view; _history = history; _saveService = saveService; + _ruleContext = ruleContext; 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 (_ruleContext.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(_ruleContext.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(); } } } From b12dcb1fe13f6759002db3047cf29107b7d810df Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 16:18:25 +0900 Subject: [PATCH 12/24] =?UTF-8?q?feat:=20AddressBasedLabelProvider?= =?UTF-8?q?=E3=81=A8AddressBasedVersionProvider=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit アドレスベースでラベルとバージョンを生成するプロバイダーを実装: - AddressBasedProvider: 共通ロジックを持つベースクラス - AddressBasedLabelProvider: アドレスからラベルを生成 - AddressBasedVersionProvider: アドレスからバージョンを生成 AssetPathBasedProviderと同様の設計パターンを採用し、 フルアドレスまたはファイル名のみの使用、正規表現による置換機能をサポート 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../LabelRules/AddressBasedLabelProvider.cs | 29 ++++++ .../AddressBasedLabelProvider.cs.meta | 11 +++ .../AddressBasedVersionProvider.cs | 29 ++++++ .../AddressBasedVersionProvider.cs.meta | 11 +++ .../Models/Shared/AddressBasedProvider.cs | 97 +++++++++++++++++++ .../Shared/AddressBasedProvider.cs.meta | 11 +++ 6 files changed, 188 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProvider.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs.meta 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/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta new file mode 100644 index 0000000..461a301 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d41bbe608527c454f8f8c6be6a55cf09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: 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/Shared/AddressBasedProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs new file mode 100644 index 0000000..1aea8d6 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs @@ -0,0 +1,97 @@ +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 _useFullAddress = true; + [SerializeField] private bool _replaceWithRegex; + [SerializeField] private string _pattern; + [SerializeField] private string _replacement; + + private Regex _regex; + + /// + /// If true, uses the full address. If false, uses only the last segment after the last '/'. + /// + public bool UseFullAddress + { + get => _useFullAddress; + set => _useFullAddress = value; + } + + /// + /// 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 = _useFullAddress ? address : Path.GetFileName(address); + return _replaceWithRegex ? _regex.Replace(sourceValue, _replacement) : sourceValue; + } + catch + { + return null; + } + } + + public string GetDescription() + { + var result = _useFullAddress ? "Source: Full Address" : "Source: Address File Name"; + 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: From b7ad802f2c96422430873c8c61c49c8d5e125223 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 16:24:34 +0900 Subject: [PATCH 13/24] =?UTF-8?q?feat:=20AddressableAssetGroupNameBasedPro?= =?UTF-8?q?vider=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit アドレッサブルアセットグループ名でラベルとバージョンを生成するプロバイダーを実装: - AddressableAssetGroupNameBasedProvider: 共通ロジックを持つベースクラス - AddressableAssetGroupNameBasedLabelProvider: グループ名からラベルを生成 - AddressableAssetGroupNameBasedVersionProvider: グループ名からバージョンを生成 グループ名をそのまま使用、または正規表現による置換機能をサポート 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- ...essableAssetGroupNameBasedLabelProvider.cs | 33 +++++++ ...leAssetGroupNameBasedLabelProvider.cs.meta | 11 +++ ...sableAssetGroupNameBasedVersionProvider.cs | 33 +++++++ ...AssetGroupNameBasedVersionProvider.cs.meta | 11 +++ .../AddressableAssetGroupNameBasedProvider.cs | 85 +++++++++++++++++++ ...essableAssetGroupNameBasedProvider.cs.meta | 11 +++ 6 files changed, 184 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProvider.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProvider.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProvider.cs.meta 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/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/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: From f36caa864911083fbc9a0ebfeab42ec226fd992b Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 16:47:19 +0900 Subject: [PATCH 14/24] =?UTF-8?q?docs:=20README=E3=81=AB=E6=96=B0=E3=81=97?= =?UTF-8?q?=E3=81=84Asset=20Filter=E3=81=A8Provider=E3=81=AE=E8=AA=AC?= =?UTF-8?q?=E6=98=8E=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit コミット67a0f76以降の変更内容をドキュメントに反映: Asset Filter: - Address Filter: アドレスベースのフィルタリング - Addressable Group Filter: グループベースのフィルタリング - 両フィルタはAddressRuleでは使用不可 Provider: - Address Based Label/Version Provider: アドレスからラベル/バージョンを生成 - Addressable Asset Group Name Based Label/Version Provider: グループ名からラベル/バージョンを生成 API変更: - IAssetFilter.IsMatchメソッドにaddressとaddressableAssetGroupパラメータを追加 - Provider.ProvideメソッドにaddressとaddressableAssetGroupパラメータを追加 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- README.md | 16 ++++++++++++++-- README_JA.md | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8c52ce9..bd4c455 100644 --- a/README.md +++ b/README.md @@ -674,6 +674,8 @@ public static class Example | Extension Filter | Filters by extension.
Use case: Target assets that have png or jpg extension.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**Use Full Address**
If checked, uses the full address. If unchecked, uses only the part after the last '/' (file name).

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

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

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

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

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

**Use Full Address**
If checked, uses the full address. If unchecked, uses only the part after the last '/' (file name).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**Use Full Address**
チェックをつけると、フルアドレスを使用します。チェックを外すと、最後の'/'以降の部分(ファイル名)のみを使用します。

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

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

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

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

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

**Use Full Address**
チェックをつけると、フルアドレスを使用します。チェックを外すと、最後の'/'以降の部分(ファイル名)のみを使用します。

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

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、グループ名を Replacement で Regex.Replace したものをバージョンとします。 | ## 独自のアセットフィルタ、プロバイダを作成する @@ -708,6 +714,7 @@ public static class Example ```cs using System; using SmartAddresser.Editor.Core.Models.Shared.AssetGroups.AssetFilterImpl; +using UnityEditor.AddressableAssets.Settings; public sealed class ExampleAssetFilter : AssetFilterAsset { @@ -718,9 +725,11 @@ public sealed class ExampleAssetFilter : AssetFilterAsset // メインスレッドで実行されるため、UnityのAPIを使用する処理はIsMatchではなくここで行う } - public override bool IsMatch(string assetPath, Type assetType, bool isFolder) + public override bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // 引数に与えられたアセットがこのフィルタにマッチしていたらtrueを返す + // address: アセットに割り当てられたアドレス(AddressRuleで呼ばれる場合はnullになります) + // addressableAssetGroup: アセットが属するAddressableアセットグループ(AddressRuleで呼ばれる場合はnullになります) // 注意: このメソッドはメインスレッド外で実行される可能性があるためUnityのAPIを使用してはいけない } @@ -745,6 +754,7 @@ public sealed class ExampleAssetFilter : AssetFilterAsset ```cs using System; using SmartAddresser.Editor.Core.Models.LayoutRules.AddressRules; +using UnityEditor.AddressableAssets.Settings; using UnityEngine; public sealed class ExampleAddressProvider : AddressProviderAsset @@ -756,9 +766,11 @@ public sealed class ExampleAddressProvider : AddressProviderAsset // メインスレッドで実行されるため、UnityのAPIを使用する処理はProvideではなくここで行う } - public override string Provide(string assetPath, Type assetType, bool isFolder) + public override string Provide(string assetPath, Type assetType, bool isFolder, string address, AddressableAssetGroup addressableAssetGroup) { // 引数に与えられたアセットに対応するアドレスを返す + // address: アセットに割り当てられたアドレス + // addressableAssetGroup: アセットが属するAddressableアセットグループ // 該当するアドレスが無い場合にはnullを返す // 注意: このメソッドはメインスレッド外で実行される可能性があるためUnityのAPIを使用してはいけない } From 6317e4ebbcf97af11e2779d50e7b3960f4a3c702 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Mon, 30 Jun 2025 16:48:10 +0900 Subject: [PATCH 15/24] =?UTF-8?q?refactor:=20AssetFilterAsset=E3=81=AE?= =?UTF-8?q?=E5=BE=8C=E6=96=B9=E4=BA=92=E6=8F=9B=E6=80=A7=E3=81=AE=E3=81=9F?= =?UTF-8?q?=E3=82=81=E3=81=AE=E5=AE=9F=E8=A3=85=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IsMatchメソッドの古いシグネチャ(address, addressableAssetGroupパラメータなし)を削除し、 新しいシグネチャのみを使用するように変更。これにより全てのAssetFilterで 新しいパラメータを使用できるようになった。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AssetGroups/AssetFilterImpl/AssetFilterAsset.cs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) 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 2dc5866..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,16 +20,8 @@ public virtual bool Validate(out AssetFilterValidationError error) } /// - public bool IsMatch(string assetPath, Type assetType, bool isFolder, string address, UnityEditor.AddressableAssets.Settings.AddressableAssetGroup addressableAssetGroup) - { - return IsMatch(assetPath, assetType, isFolder); - } - - /// - /// Legacy IsMatch method for backward compatibility. - /// Override this method in derived classes to implement filtering logic. - /// - 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(); From ec0e35ddf81a2db0744b05a718bcd1fa1a9df287 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Tue, 1 Jul 2025 14:42:54 +0900 Subject: [PATCH 16/24] =?UTF-8?q?feat:=20=E6=96=B0=E3=81=97=E3=81=84Provid?= =?UTF-8?q?er=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=81=AEDrawer=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AddressBasedLabelProviderDrawer - AddressBasedVersionProviderDrawer - AddressableAssetGroupNameBasedLabelProviderDrawer - AddressableAssetGroupNameBasedVersionProviderDrawer これらのDrawerクラスにより、エディタ上で各Providerの設定をGUIで行えるようになります。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressBasedLabelProviderDrawer.cs | 35 +++++++++++++++++++ ...eAssetGroupNameBasedLabelProviderDrawer.cs | 32 +++++++++++++++++ .../AddressBasedVersionProviderDrawer.cs | 35 +++++++++++++++++++ ...ssetGroupNameBasedVersionProviderDrawer.cs | 32 +++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs 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..6d8e164 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs @@ -0,0 +1,35 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Core.Models.Shared; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; +using UnityEngine; + +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 useFullAddressLabel = ObjectNames.NicifyVariableName(nameof(target.UseFullAddress)); + target.UseFullAddress = EditorGUILayout.Toggle(useFullAddressLabel, target.UseFullAddress); + + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..0d1c326 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs @@ -0,0 +1,32 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Core.Models.Shared; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; +using UnityEngine; + +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); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..0e2ea51 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs @@ -0,0 +1,35 @@ +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(AddressBasedVersionProvider))] + public sealed class AddressBasedVersionProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressBasedVersionProvider target) + { + var useFullAddressLabel = ObjectNames.NicifyVariableName(nameof(target.UseFullAddress)); + target.UseFullAddress = EditorGUILayout.Toggle(useFullAddressLabel, target.UseFullAddress); + + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..ebba3a2 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs @@ -0,0 +1,32 @@ +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); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file From b0c0b4edccac50c811d74bc5e808a5ea6f1b3bdc Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Tue, 1 Jul 2025 14:49:22 +0900 Subject: [PATCH 17/24] =?UTF-8?q?feat:=20=E6=96=B0=E3=81=97=E3=81=84Provid?= =?UTF-8?q?er=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=81=AEDrawer=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AddressBasedLabelProviderDrawer - AddressBasedVersionProviderDrawer - AddressableAssetGroupNameBasedLabelProviderDrawer - AddressableAssetGroupNameBasedVersionProviderDrawer これらのDrawerクラスにより、エディタ上で各Providerの設定をGUIで行えるようになります。 --- .../AddressBasedLabelProviderDrawer.cs | 35 +++++++++++++++++++ ...eAssetGroupNameBasedLabelProviderDrawer.cs | 32 +++++++++++++++++ .../AddressBasedVersionProviderDrawer.cs | 35 +++++++++++++++++++ ...ssetGroupNameBasedVersionProviderDrawer.cs | 32 +++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs 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..6d8e164 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs @@ -0,0 +1,35 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Core.Models.Shared; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; +using UnityEngine; + +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 useFullAddressLabel = ObjectNames.NicifyVariableName(nameof(target.UseFullAddress)); + target.UseFullAddress = EditorGUILayout.Toggle(useFullAddressLabel, target.UseFullAddress); + + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..0d1c326 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs @@ -0,0 +1,32 @@ +using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; +using SmartAddresser.Editor.Core.Models.Shared; +using SmartAddresser.Editor.Foundation.CustomDrawers; +using UnityEditor; +using UnityEngine; + +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); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..0e2ea51 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs @@ -0,0 +1,35 @@ +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(AddressBasedVersionProvider))] + public sealed class AddressBasedVersionProviderDrawer : GUIDrawer + { + protected override void GUILayout(AddressBasedVersionProvider target) + { + var useFullAddressLabel = ObjectNames.NicifyVariableName(nameof(target.UseFullAddress)); + target.UseFullAddress = EditorGUILayout.Toggle(useFullAddressLabel, target.UseFullAddress); + + var replaceWithRegexLabel = ObjectNames.NicifyVariableName(nameof(target.ReplaceWithRegex)); + target.ReplaceWithRegex = EditorGUILayout.Toggle(replaceWithRegexLabel, target.ReplaceWithRegex); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file 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..ebba3a2 --- /dev/null +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs @@ -0,0 +1,32 @@ +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); + + GUI.enabled = 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); + } + + GUI.enabled = true; + } + } +} \ No newline at end of file From 8a01f804628a51cb4b8684488c93a0a9eaeef38a Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Tue, 1 Jul 2025 15:06:32 +0900 Subject: [PATCH 18/24] =?UTF-8?q?refactor:=20AddressBasedProvider=E3=81=8B?= =?UTF-8?q?=E3=82=89UseFullAddress=E3=83=97=E3=83=AD=E3=83=91=E3=83=86?= =?UTF-8?q?=E3=82=A3=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AddressBasedProviderクラスからUseFullAddressプロパティとフィールドを削除 - 常にフルアドレスを使用するように変更 - 関連するDrawerクラスからUseFullAddressのUI要素を削除 --- .../Core/Models/Shared/AddressBasedProvider.cs | 14 ++------------ .../AddressBasedLabelProviderDrawer.cs | 3 --- .../AddressBasedLabelProviderDrawer.cs.meta | 11 +++++++++++ ...eAssetGroupNameBasedLabelProviderDrawer.cs.meta | 11 +++++++++++ .../AddressBasedVersionProviderDrawer.cs | 3 --- .../AddressBasedVersionProviderDrawer.cs.meta | 11 +++++++++++ ...ssetGroupNameBasedVersionProviderDrawer.cs.meta | 11 +++++++++++ 7 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs.meta create mode 100644 Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs.meta diff --git a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs index 1aea8d6..c45f86b 100644 --- a/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs +++ b/Assets/SmartAddresser/Editor/Core/Models/Shared/AddressBasedProvider.cs @@ -8,22 +8,12 @@ namespace SmartAddresser.Editor.Core.Models.Shared [Serializable] public abstract class AddressBasedProvider { - [SerializeField] private bool _useFullAddress = true; [SerializeField] private bool _replaceWithRegex; [SerializeField] private string _pattern; [SerializeField] private string _replacement; private Regex _regex; - /// - /// If true, uses the full address. If false, uses only the last segment after the last '/'. - /// - public bool UseFullAddress - { - get => _useFullAddress; - set => _useFullAddress = value; - } - /// /// If true, replaces the address value through regular expressions. /// @@ -76,7 +66,7 @@ public string Provide(string address) try { - var sourceValue = _useFullAddress ? address : Path.GetFileName(address); + var sourceValue = address; return _replaceWithRegex ? _regex.Replace(sourceValue, _replacement) : sourceValue; } catch @@ -87,7 +77,7 @@ public string Provide(string address) public string GetDescription() { - var result = _useFullAddress ? "Source: Full Address" : "Source: Address File Name"; + var result = "Source: Address"; if (_replaceWithRegex) result += $", Regex: Replace \"{_pattern}\" with \"{_replacement}\""; diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs index 6d8e164..0dc9a3e 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs @@ -14,9 +14,6 @@ public sealed class AddressBasedLabelProviderDrawer : GUIDrawer Date: Tue, 1 Jul 2025 22:08:38 +0900 Subject: [PATCH 19/24] =?UTF-8?q?test:=20=E5=90=84=E7=A8=AEProvider?= =?UTF-8?q?=E5=8F=8A=E3=81=B3AssetFilter=E3=81=AE=E3=83=A6=E3=83=8B?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AddressBasedProvider関連のテスト - AddressableAssetGroupNameBasedProvider関連のテスト - LabelProvider及びVersionProviderのテスト - AssetFilter実装のテスト - READMEの微修正 --- .../Core/Models/LayoutRules/LabelRules.meta | 8 + .../AddressBasedLabelProviderTest.cs | 129 ++++++++ .../AddressBasedLabelProviderTest.cs.meta | 11 + ...bleAssetGroupNameBasedLabelProviderTest.cs | 166 ++++++++++ ...setGroupNameBasedLabelProviderTest.cs.meta | 11 + .../Core/Models/LayoutRules/VersionRules.meta | 8 + .../AddressBasedVersionProviderTest.cs | 146 +++++++++ .../AddressBasedVersionProviderTest.cs.meta | 11 + ...eAssetGroupNameBasedVersionProviderTest.cs | 199 ++++++++++++ ...tGroupNameBasedVersionProviderTest.cs.meta | 11 + .../Models/Shared/AddressBasedProviderTest.cs | 147 +++++++++ .../Shared/AddressBasedProviderTest.cs.meta | 11 + ...ressableAssetGroupNameBasedProviderTest.cs | 167 ++++++++++ ...bleAssetGroupNameBasedProviderTest.cs.meta | 11 + .../AddressBasedAssetFilterTest.cs | 304 ++++++++++++++++++ .../AddressBasedAssetFilterTest.cs.meta | 11 + ...dressableAssetGroupBasedAssetFilterTest.cs | 252 +++++++++++++++ ...ableAssetGroupBasedAssetFilterTest.cs.meta | 11 + README.md | 4 +- README_JA.md | 4 +- 20 files changed, 1618 insertions(+), 4 deletions(-) create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs.meta create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs create mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressableAssetGroupBasedAssetFilterTest.cs.meta 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..05c499a --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs @@ -0,0 +1,129 @@ +using System; +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 AddressBasedLabelProvider _provider; + private ILabelProvider _labelProvider; + + [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 \"\"")); + } + + [Test] + public void Provide_WithAddressableAssetGroup_IgnoresGroup() + { + // AddressBasedLabelProviderはAddressableAssetGroupを使用しない + _labelProvider.Setup(); + var group = ScriptableObject.CreateInstance(); + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "test/address", group); + + Assert.That(result, Is.EqualTo("test/address")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithComplexRegexPattern_WorksCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"assets/([^/]+)/([^/]+)"; + _provider.Replacement = "$2_$1"; + _labelProvider.Setup(); + + var result1 = _labelProvider.Provide("dummy", typeof(object), false, "assets/textures/player", null); + var result2 = _labelProvider.Provide("dummy", typeof(object), false, "assets/models/enemy", null); + + Assert.That(result1, Is.EqualTo("player_textures")); + Assert.That(result2, Is.EqualTo("enemy_models")); + } + } +} \ No newline at end of file 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..35a59cd --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs @@ -0,0 +1,166 @@ +using System; +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 AddressableAssetGroupNameBasedLabelProvider _provider; + private ILabelProvider _labelProvider; + + [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")); + + UnityEngine.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")); + + UnityEngine.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_WithEmptyGroupName_ReturnsNull() + { + _labelProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = ""; + + var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.Null); + + UnityEngine.Object.DestroyImmediate(group); + } + + [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); + + UnityEngine.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 \"\"")); + } + + [Test] + public void Provide_IgnoresAssetPathAndType() + { + // AddressableAssetGroupNameBasedLabelProviderはアセットパスやタイプを使用しない + _labelProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "TestGroup"; + + var result1 = _labelProvider.Provide("path1", typeof(Texture2D), false, "addr1", group); + var result2 = _labelProvider.Provide("path2", typeof(GameObject), true, "addr2", group); + + Assert.That(result1, Is.EqualTo("TestGroup")); + Assert.That(result2, Is.EqualTo("TestGroup")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithComplexRegexPattern_WorksCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"^(Dev|Test|Prod)_(.+)_Group$"; + _provider.Replacement = "$2_$1"; + _labelProvider.Setup(); + + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + var group3 = ScriptableObject.CreateInstance(); + group1.Name = "Dev_Characters_Group"; + group2.Name = "Test_Weapons_Group"; + group3.Name = "MainAssets"; + + var result1 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group1); + var result2 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group2); + var result3 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group3); + + Assert.That(result1, Is.EqualTo("Characters_Dev")); + Assert.That(result2, Is.EqualTo("Weapons_Test")); + Assert.That(result3, Is.EqualTo("MainAssets")); // パターンにマッチしない + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + UnityEngine.Object.DestroyImmediate(group3); + } + } +} \ No newline at end of file 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/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..7c64f80 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs @@ -0,0 +1,146 @@ +using System; +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 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\"")); + } + + [Test] + public void Provide_WithAddressableAssetGroup_IgnoresGroup() + { + // AddressBasedVersionProviderはAddressableAssetGroupを使用しない + _versionProvider.Setup(); + var group = ScriptableObject.CreateInstance(); + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v2.0.0", group); + + Assert.That(result, Is.EqualTo("v2.0.0")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void Provide_ExtractVersionFromPath_WorksCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @".*/v(\d+)_(\d+)_(\d+)/.*"; + _provider.Replacement = "$1.$2.$3"; + _versionProvider.Setup(); + + var result1 = _versionProvider.Provide("dummy", typeof(object), false, "assets/v1_0_0/textures/player", null); + var result2 = _versionProvider.Provide("dummy", typeof(object), false, "models/v2_5_1/characters", null); + + Assert.That(result1, Is.EqualTo("1.0.0")); + Assert.That(result2, Is.EqualTo("2.5.1")); + } + + [Test] + public void Provide_WithSemanticVersionPattern_WorksCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @".*@(\d+\.\d+\.\d+(-[a-z]+\.\d+)?)$"; + _provider.Replacement = "$1"; + _versionProvider.Setup(); + + var result1 = _versionProvider.Provide("dummy", typeof(object), false, "character/player@1.0.0", null); + var result2 = _versionProvider.Provide("dummy", typeof(object), false, "weapon/sword@2.1.0-beta.1", null); + var result3 = _versionProvider.Provide("dummy", typeof(object), false, "item/potion", null); + + Assert.That(result1, Is.EqualTo("1.0.0")); + Assert.That(result2, Is.EqualTo("2.1.0-beta.1")); + Assert.That(result3, Is.EqualTo("item/potion")); // パターンにマッチしない + } + } +} \ No newline at end of file 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..3136f8f --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs @@ -0,0 +1,199 @@ +using System; +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")); + + UnityEngine.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")); + + UnityEngine.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_WithEmptyGroupName_ReturnsNull() + { + _versionProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = ""; + + var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); + + Assert.That(result, Is.Null); + + UnityEngine.Object.DestroyImmediate(group); + } + + [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); + + UnityEngine.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\"")); + } + + [Test] + public void Provide_IgnoresAssetPathAndType() + { + // AddressableAssetGroupNameBasedVersionProviderはアセットパスやタイプを使用しない + _versionProvider.Setup(); + + var group = ScriptableObject.CreateInstance(); + group.Name = "v1.0.0"; + + var result1 = _versionProvider.Provide("path1", typeof(Texture2D), false, "addr1", group); + var result2 = _versionProvider.Provide("path2", typeof(GameObject), true, "addr2", group); + + Assert.That(result1, Is.EqualTo("v1.0.0")); + Assert.That(result2, Is.EqualTo("v1.0.0")); + + UnityEngine.Object.DestroyImmediate(group); + } + + [Test] + public void Provide_WithComplexVersionPattern_WorksCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @"^(.+)_v(\d+)_(\d+)_(\d+)(_[a-z]+)?$"; + _provider.Replacement = "$2.$3.$4$5"; + _versionProvider.Setup(); + + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + var group3 = ScriptableObject.CreateInstance(); + var group4 = ScriptableObject.CreateInstance(); + group1.Name = "Characters_v1_0_0"; + group2.Name = "Weapons_v2_1_0_beta"; + group3.Name = "Items_v3_2_5"; + group4.Name = "SimpleGroup"; + + var result1 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group1); + var result2 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group2); + var result3 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group3); + var result4 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group4); + + Assert.That(result1, Is.EqualTo("1.0.0")); + Assert.That(result2, Is.EqualTo("2.1.0_beta")); + Assert.That(result3, Is.EqualTo("3.2.5")); + Assert.That(result4, Is.EqualTo("SimpleGroup")); // パターンにマッチしない + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + UnityEngine.Object.DestroyImmediate(group3); + UnityEngine.Object.DestroyImmediate(group4); + } + + [Test] + public void Provide_WithSemanticVersioning_ExtractsCorrectly() + { + _provider.ReplaceWithRegex = true; + _provider.Pattern = @".*\[(\d+\.\d+\.\d+(?:-[a-zA-Z]+(?:\.\d+)?)?)\].*"; + _provider.Replacement = "$1"; + _versionProvider.Setup(); + + var group1 = ScriptableObject.CreateInstance(); + var group2 = ScriptableObject.CreateInstance(); + var group3 = ScriptableObject.CreateInstance(); + group1.Name = "Assets[1.0.0]"; + group2.Name = "BetaAssets[2.0.0-beta.1]"; + group3.Name = "Production[3.1.0-rc]"; + + var result1 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group1); + var result2 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group2); + var result3 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group3); + + Assert.That(result1, Is.EqualTo("1.0.0")); + Assert.That(result2, Is.EqualTo("2.0.0-beta.1")); + Assert.That(result3, Is.EqualTo("3.1.0-rc")); + + UnityEngine.Object.DestroyImmediate(group1); + UnityEngine.Object.DestroyImmediate(group2); + UnityEngine.Object.DestroyImmediate(group3); + } + } +} \ No newline at end of file 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/AddressBasedProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs new file mode 100644 index 0000000..ab3f107 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs @@ -0,0 +1,147 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.Shared; + +namespace SmartAddresser.Tests.Editor.Core.Models.Shared +{ + internal sealed class AddressBasedProviderTest + { + // AddressBasedProviderは抽象クラスなので、テスト用の具象クラスを作成 + private class TestAddressBasedProvider : AddressBasedProvider + { + } + + [Test] + public void Provide_WithoutRegex_ReturnsOriginalAddress() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = false; + provider.Setup(); + + var result = provider.Provide("assets/textures/player"); + + Assert.That(result, Is.EqualTo("assets/textures/player")); + } + + [Test] + public void Provide_WithRegex_ReturnsReplacedAddress() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"assets/(.+)/(.+)"; + provider.Replacement = "$2_$1"; + provider.Setup(); + + var result = provider.Provide("assets/textures/player"); + + Assert.That(result, Is.EqualTo("player_textures")); + } + + [Test] + public void Provide_WithRegexRemovePrefix_ReturnsModifiedAddress() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"^assets/"; + provider.Replacement = ""; + provider.Setup(); + + var result = provider.Provide("assets/textures/player"); + + Assert.That(result, Is.EqualTo("textures/player")); + } + + [Test] + public void Provide_WithEmptyAddress_ReturnsNull() + { + var provider = new TestAddressBasedProvider(); + provider.Setup(); + + var result1 = provider.Provide(""); + var result2 = provider.Provide(null); + + Assert.That(result1, Is.Null); + Assert.That(result2, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegexPattern_ReturnsNull() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = "["; // 不正な正規表現パターン + provider.Replacement = "replacement"; + provider.Setup(); + + var result = provider.Provide("assets/textures/player"); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithRegexThrowingException_ReturnsNull() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"(.+)"; + provider.Replacement = "$99"; // 存在しないグループ参照 + provider.Setup(); + + var result = provider.Provide("assets/textures/player"); + + // 正規表現の置換でエラーが発生した場合はnullを返す + Assert.That(result, Is.Null); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = false; + + var description = provider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Address")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"^assets/"; + provider.Replacement = ""; + + var description = provider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"^assets/\" with \"\"")); + } + + [Test] + public void Setup_WithInvalidRegexPattern_HandlesGracefully() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = "["; // 不正な正規表現パターン + provider.Replacement = "replacement"; + + // Setupメソッドは例外をスローしない + Assert.DoesNotThrow(() => provider.Setup()); + } + + [Test] + public void Provide_MultipleCallsWithSamePattern_ReturnsSameResult() + { + var provider = new TestAddressBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"(.+)/(.+)"; + provider.Replacement = "$2/$1"; + provider.Setup(); + + var result1 = provider.Provide("folder/file"); + var result2 = provider.Provide("folder/file"); + + Assert.That(result1, Is.EqualTo("file/folder")); + Assert.That(result2, Is.EqualTo("file/folder")); + } + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta new file mode 100644 index 0000000..1c4f6b3 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1a2b3c4d5e6f7890abcdef1234567890 +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/AddressableAssetGroupNameBasedProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs new file mode 100644 index 0000000..4bd99ea --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs @@ -0,0 +1,167 @@ +using NUnit.Framework; +using SmartAddresser.Editor.Core.Models.Shared; + +namespace SmartAddresser.Tests.Editor.Core.Models.Shared +{ + internal sealed class AddressableAssetGroupNameBasedProviderTest + { + // AddressableAssetGroupNameBasedProviderは抽象クラスなので、テスト用の具象クラスを作成 + private class TestAddressableAssetGroupNameBasedProvider : AddressableAssetGroupNameBasedProvider + { + } + + [Test] + public void Provide_WithoutRegex_ReturnsOriginalGroupName() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = false; + provider.Setup(); + + var result = provider.Provide("DefaultGroup"); + + Assert.That(result, Is.EqualTo("DefaultGroup")); + } + + [Test] + public void Provide_WithRegex_ReturnsReplacedGroupName() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"Group_(.+)"; + provider.Replacement = "$1_Modified"; + provider.Setup(); + + var result = provider.Provide("Group_Assets"); + + Assert.That(result, Is.EqualTo("Assets_Modified")); + } + + [Test] + public void Provide_WithRegexRemovePrefix_ReturnsModifiedGroupName() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"^Prefix_"; + provider.Replacement = ""; + provider.Setup(); + + var result = provider.Provide("Prefix_MainGroup"); + + Assert.That(result, Is.EqualTo("MainGroup")); + } + + [Test] + public void Provide_WithEmptyGroupName_ReturnsNull() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.Setup(); + + var result1 = provider.Provide(""); + var result2 = provider.Provide(null); + + Assert.That(result1, Is.Null); + Assert.That(result2, Is.Null); + } + + [Test] + public void Provide_WithInvalidRegexPattern_ReturnsNull() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = "[("; // 不正な正規表現パターン + provider.Replacement = "replacement"; + provider.Setup(); + + var result = provider.Provide("TestGroup"); + + Assert.That(result, Is.Null); + } + + [Test] + public void Provide_WithRegexThrowingException_ReturnsNull() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"(.+)"; + provider.Replacement = "$999"; // 存在しないグループ参照 + provider.Setup(); + + var result = provider.Provide("TestGroup"); + + // 正規表現の置換でエラーが発生した場合はnullを返す + Assert.That(result, Is.Null); + } + + [Test] + public void GetDescription_WithoutRegex_ReturnsBasicDescription() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = false; + + var description = provider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); + } + + [Test] + public void GetDescription_WithRegex_ReturnsDetailedDescription() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"^Group_"; + provider.Replacement = ""; + + var description = provider.GetDescription(); + + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"^Group_\" with \"\"")); + } + + [Test] + public void Setup_WithInvalidRegexPattern_HandlesGracefully() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = "[("; // 不正な正規表現パターン + provider.Replacement = "replacement"; + + // Setupメソッドは例外をスローしない + Assert.DoesNotThrow(() => provider.Setup()); + } + + [Test] + public void Provide_WithComplexRegexPattern_WorksCorrectly() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"^(Dev|Test)_(.+)_Group$"; + provider.Replacement = "$2"; + provider.Setup(); + + var result1 = provider.Provide("Dev_Characters_Group"); + var result2 = provider.Provide("Test_Weapons_Group"); + var result3 = provider.Provide("Production_Assets_Group"); + + Assert.That(result1, Is.EqualTo("Characters")); + Assert.That(result2, Is.EqualTo("Weapons")); + Assert.That(result3, Is.EqualTo("Production_Assets_Group")); // パターンにマッチしない + } + + [Test] + public void Provide_MultipleCallsWithSamePattern_ReturnsSameResult() + { + var provider = new TestAddressableAssetGroupNameBasedProvider(); + provider.ReplaceWithRegex = true; + provider.Pattern = @"_v\d+$"; + provider.Replacement = ""; + provider.Setup(); + + var result1 = provider.Provide("Assets_v1"); + var result2 = provider.Provide("Assets_v1"); + var result3 = provider.Provide("Assets_v2"); + + Assert.That(result1, Is.EqualTo("Assets")); + Assert.That(result2, Is.EqualTo("Assets")); + Assert.That(result3, Is.EqualTo("Assets")); + } + } +} \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta new file mode 100644 index 0000000..4ec6c75 --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b3c4d5e6f7890abcdef123456789012 +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..3fb2f6b --- /dev/null +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs @@ -0,0 +1,304 @@ +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_WithEmptyAddress_ReturnsFalse() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = ".*"; + _filter.SetupForMatching(); + + var result1 = _filter.IsMatch("dummy", typeof(object), false, "", null); + var result2 = _filter.IsMatch("dummy", typeof(object), false, null, null); + + Assert.That(result1, Is.False); + Assert.That(result2, Is.False); + } + + [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_HandlesGracefully() + { + _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_WithComplexPattern_WorksCorrectly() + { + _filter.Condition = AssetFilterCondition.ContainsMatched; + _filter.AddressRegex.Value = @"^assets/v\d+\.\d+\.\d+/.*"; + _filter.SetupForMatching(); + + var result1 = _filter.IsMatch("dummy", typeof(object), false, "assets/v1.0.0/character", null); + var result2 = _filter.IsMatch("dummy", typeof(object), false, "assets/v2.1.3/weapon", null); + var result3 = _filter.IsMatch("dummy", typeof(object), false, "assets/vX.Y.Z/item", null); + var result4 = _filter.IsMatch("dummy", typeof(object), false, "other/v1.0.0/test", null); + + Assert.That(result1, Is.True); + Assert.That(result2, Is.True); + Assert.That(result3, Is.False); + Assert.That(result4, Is.False); + } + + [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); + } + } +} \ No newline at end of file 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/README.md b/README.md index bd4c455..626bd88 100644 --- a/README.md +++ b/README.md @@ -689,7 +689,7 @@ public static class Example |---------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Constant Label Provider | Provides an constant label.

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

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

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

**Use Full Address**
If checked, uses the full address. If unchecked, uses only the part after the last '/' (file name).

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

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

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

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

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

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

**Use Full Address**
If checked, uses the full address. If unchecked, uses only the part after the last '/' (file name).

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

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

**Replace With Regex**
If checked, the group name will be replaced with regex using Pattern and Replacement. | ## Create your own Asset Filters / Providers diff --git a/README_JA.md b/README_JA.md index 570ca4c..c327eac 100644 --- a/README_JA.md +++ b/README_JA.md @@ -694,7 +694,7 @@ public static class Example |---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Constant Label Provider | 固定値でラベルを付与します。

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

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

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

**Use Full Address**
チェックをつけると、フルアドレスを使用します。チェックを外すと、最後の'/'以降の部分(ファイル名)のみを使用します。

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

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

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

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

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

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

**Use Full Address**
チェックをつけると、フルアドレスを使用します。チェックを外すと、最後の'/'以降の部分(ファイル名)のみを使用します。

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

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

**Replace With Regex**
チェックをつけると、Pattern を元に正規表現を作成し、グループ名を Replacement で Regex.Replace したものをバージョンとします。 | ## 独自のアセットフィルタ、プロバイダを作成する From 4eb16ca6de480bd3d97319efdb3eda3e1f6cb54a Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Thu, 3 Jul 2025 10:45:11 +0900 Subject: [PATCH 20/24] =?UTF-8?q?test:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E8=A4=87=E9=9B=91=E3=81=AARegex=E3=83=91=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=83=B3=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AddressBasedとAddressableAssetGroupNameBasedの各Provider系テストから、実用性の低い複雑なRegexパターンのテストケースを削除しました。 基本的な動作確認に必要なテストケースは残しています。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressBasedLabelProviderTest.cs | 48 ++----- ...bleAssetGroupNameBasedLabelProviderTest.cs | 89 ++----------- .../AddressBasedVersionProviderTest.cs | 66 ++-------- ...eAssetGroupNameBasedVersionProviderTest.cs | 120 ++---------------- 4 files changed, 45 insertions(+), 278 deletions(-) diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs index 05c499a..0dbc809 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressBasedLabelProviderTest.cs @@ -1,4 +1,3 @@ -using System; using NUnit.Framework; using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; using UnityEditor.AddressableAssets.Settings; @@ -8,8 +7,8 @@ namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.LabelRules { internal sealed class AddressBasedLabelProviderTest { - private AddressBasedLabelProvider _provider; private ILabelProvider _labelProvider; + private AddressBasedLabelProvider _provider; [SetUp] public void Setup() @@ -25,7 +24,7 @@ public void Provide_WithoutRegex_ReturnsAddress() _labelProvider.Setup(); var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); - + Assert.That(result, Is.EqualTo("character/player")); } @@ -38,7 +37,7 @@ public void Provide_WithRegex_ReturnsModifiedAddress() _labelProvider.Setup(); var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); - + Assert.That(result, Is.EqualTo("player_label")); } @@ -48,7 +47,7 @@ public void Provide_WithNullAddress_ReturnsNull() _labelProvider.Setup(); var result = _labelProvider.Provide("dummy/path", typeof(object), false, null, null); - + Assert.That(result, Is.Null); } @@ -58,7 +57,7 @@ public void Provide_WithEmptyAddress_ReturnsNull() _labelProvider.Setup(); var result = _labelProvider.Provide("dummy/path", typeof(object), false, "", null); - + Assert.That(result, Is.Null); } @@ -71,7 +70,7 @@ public void Provide_WithInvalidRegex_ReturnsNull() _labelProvider.Setup(); var result = _labelProvider.Provide("dummy/path", typeof(object), false, "character/player", null); - + Assert.That(result, Is.Null); } @@ -81,7 +80,7 @@ public void GetDescription_WithoutRegex_ReturnsBasicDescription() _provider.ReplaceWithRegex = false; var description = _labelProvider.GetDescription(); - + Assert.That(description, Is.EqualTo("Source: Address")); } @@ -93,37 +92,8 @@ public void GetDescription_WithRegex_ReturnsDetailedDescription() _provider.Replacement = ""; var description = _labelProvider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"^prefix/\" with \"\"")); - } - [Test] - public void Provide_WithAddressableAssetGroup_IgnoresGroup() - { - // AddressBasedLabelProviderはAddressableAssetGroupを使用しない - _labelProvider.Setup(); - var group = ScriptableObject.CreateInstance(); - - var result = _labelProvider.Provide("dummy/path", typeof(object), false, "test/address", group); - - Assert.That(result, Is.EqualTo("test/address")); - - UnityEngine.Object.DestroyImmediate(group); - } - - [Test] - public void Provide_WithComplexRegexPattern_WorksCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @"assets/([^/]+)/([^/]+)"; - _provider.Replacement = "$2_$1"; - _labelProvider.Setup(); - - var result1 = _labelProvider.Provide("dummy", typeof(object), false, "assets/textures/player", null); - var result2 = _labelProvider.Provide("dummy", typeof(object), false, "assets/models/enemy", null); - - Assert.That(result1, Is.EqualTo("player_textures")); - Assert.That(result2, Is.EqualTo("enemy_models")); + Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"^prefix/\" with \"\"")); } } -} \ 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 index 35a59cd..89cf4d1 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/LabelRules/AddressableAssetGroupNameBasedLabelProviderTest.cs @@ -1,4 +1,3 @@ -using System; using NUnit.Framework; using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; using UnityEditor.AddressableAssets.Settings; @@ -8,8 +7,8 @@ namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.LabelRules { internal sealed class AddressableAssetGroupNameBasedLabelProviderTest { - private AddressableAssetGroupNameBasedLabelProvider _provider; private ILabelProvider _labelProvider; + private AddressableAssetGroupNameBasedLabelProvider _provider; [SetUp] public void Setup() @@ -23,15 +22,15 @@ 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")); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -41,15 +40,15 @@ public void Provide_WithRegex_ReturnsModifiedGroupName() _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")); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -58,23 +57,8 @@ 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_WithEmptyGroupName_ReturnsNull() - { - _labelProvider.Setup(); - - var group = ScriptableObject.CreateInstance(); - group.Name = ""; - - var result = _labelProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); - Assert.That(result, Is.Null); - - UnityEngine.Object.DestroyImmediate(group); } [Test] @@ -84,15 +68,15 @@ public void Provide_WithInvalidRegex_ReturnsNull() _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); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -101,7 +85,7 @@ public void GetDescription_WithoutRegex_ReturnsBasicDescription() _provider.ReplaceWithRegex = false; var description = _labelProvider.GetDescription(); - + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); } @@ -113,54 +97,9 @@ public void GetDescription_WithRegex_ReturnsDetailedDescription() _provider.Replacement = ""; var description = _labelProvider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"_v\\d+$\" with \"\"")); - } - - [Test] - public void Provide_IgnoresAssetPathAndType() - { - // AddressableAssetGroupNameBasedLabelProviderはアセットパスやタイプを使用しない - _labelProvider.Setup(); - - var group = ScriptableObject.CreateInstance(); - group.Name = "TestGroup"; - - var result1 = _labelProvider.Provide("path1", typeof(Texture2D), false, "addr1", group); - var result2 = _labelProvider.Provide("path2", typeof(GameObject), true, "addr2", group); - - Assert.That(result1, Is.EqualTo("TestGroup")); - Assert.That(result2, Is.EqualTo("TestGroup")); - - UnityEngine.Object.DestroyImmediate(group); - } - [Test] - public void Provide_WithComplexRegexPattern_WorksCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @"^(Dev|Test|Prod)_(.+)_Group$"; - _provider.Replacement = "$2_$1"; - _labelProvider.Setup(); - - var group1 = ScriptableObject.CreateInstance(); - var group2 = ScriptableObject.CreateInstance(); - var group3 = ScriptableObject.CreateInstance(); - group1.Name = "Dev_Characters_Group"; - group2.Name = "Test_Weapons_Group"; - group3.Name = "MainAssets"; - - var result1 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group1); - var result2 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group2); - var result3 = _labelProvider.Provide("dummy", typeof(object), false, "dummy", group3); - - Assert.That(result1, Is.EqualTo("Characters_Dev")); - Assert.That(result2, Is.EqualTo("Weapons_Test")); - Assert.That(result3, Is.EqualTo("MainAssets")); // パターンにマッチしない - - UnityEngine.Object.DestroyImmediate(group1); - UnityEngine.Object.DestroyImmediate(group2); - UnityEngine.Object.DestroyImmediate(group3); + Assert.That(description, + Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"_v\\d+$\" with \"\"")); } } -} \ 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 index 7c64f80..7fd920c 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressBasedVersionProviderTest.cs @@ -1,8 +1,5 @@ -using System; using NUnit.Framework; using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; -using UnityEditor.AddressableAssets.Settings; -using UnityEngine; namespace SmartAddresser.Tests.Editor.Core.Models.LayoutRules.VersionRules { @@ -25,7 +22,7 @@ public void Provide_WithoutRegex_ReturnsAddress() _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")); } @@ -38,7 +35,7 @@ public void Provide_WithRegex_ReturnsModifiedAddress() _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")); } @@ -48,7 +45,7 @@ public void Provide_WithNullAddress_ReturnsNull() _versionProvider.Setup(); var result = _versionProvider.Provide("dummy/path", typeof(object), false, null, null); - + Assert.That(result, Is.Null); } @@ -58,7 +55,7 @@ public void Provide_WithEmptyAddress_ReturnsNull() _versionProvider.Setup(); var result = _versionProvider.Provide("dummy/path", typeof(object), false, "", null); - + Assert.That(result, Is.Null); } @@ -71,7 +68,7 @@ public void Provide_WithInvalidRegex_ReturnsNull() _versionProvider.Setup(); var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v1.0.0/character", null); - + Assert.That(result, Is.Null); } @@ -81,7 +78,7 @@ public void GetDescription_WithoutRegex_ReturnsBasicDescription() _provider.ReplaceWithRegex = false; var description = _versionProvider.GetDescription(); - + Assert.That(description, Is.EqualTo("Source: Address")); } @@ -93,54 +90,9 @@ public void GetDescription_WithRegex_ReturnsDetailedDescription() _provider.Replacement = "$1"; var description = _versionProvider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"v(\\d+\\.\\d+\\.\\d+)\" with \"$1\"")); - } - - [Test] - public void Provide_WithAddressableAssetGroup_IgnoresGroup() - { - // AddressBasedVersionProviderはAddressableAssetGroupを使用しない - _versionProvider.Setup(); - var group = ScriptableObject.CreateInstance(); - - var result = _versionProvider.Provide("dummy/path", typeof(object), false, "v2.0.0", group); - - Assert.That(result, Is.EqualTo("v2.0.0")); - - UnityEngine.Object.DestroyImmediate(group); - } - - [Test] - public void Provide_ExtractVersionFromPath_WorksCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @".*/v(\d+)_(\d+)_(\d+)/.*"; - _provider.Replacement = "$1.$2.$3"; - _versionProvider.Setup(); - - var result1 = _versionProvider.Provide("dummy", typeof(object), false, "assets/v1_0_0/textures/player", null); - var result2 = _versionProvider.Provide("dummy", typeof(object), false, "models/v2_5_1/characters", null); - - Assert.That(result1, Is.EqualTo("1.0.0")); - Assert.That(result2, Is.EqualTo("2.5.1")); - } - - [Test] - public void Provide_WithSemanticVersionPattern_WorksCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @".*@(\d+\.\d+\.\d+(-[a-z]+\.\d+)?)$"; - _provider.Replacement = "$1"; - _versionProvider.Setup(); - var result1 = _versionProvider.Provide("dummy", typeof(object), false, "character/player@1.0.0", null); - var result2 = _versionProvider.Provide("dummy", typeof(object), false, "weapon/sword@2.1.0-beta.1", null); - var result3 = _versionProvider.Provide("dummy", typeof(object), false, "item/potion", null); - - Assert.That(result1, Is.EqualTo("1.0.0")); - Assert.That(result2, Is.EqualTo("2.1.0-beta.1")); - Assert.That(result3, Is.EqualTo("item/potion")); // パターンにマッチしない + Assert.That(description, + Is.EqualTo("Source: Address, Regex: Replace \"v(\\d+\\.\\d+\\.\\d+)\" with \"$1\"")); } } -} \ 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 index 3136f8f..a5cabde 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/LayoutRules/VersionRules/AddressableAssetGroupNameBasedVersionProviderTest.cs @@ -1,4 +1,3 @@ -using System; using NUnit.Framework; using SmartAddresser.Editor.Core.Models.LayoutRules.VersionRules; using UnityEditor.AddressableAssets.Settings; @@ -23,15 +22,15 @@ 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")); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -41,15 +40,15 @@ public void Provide_WithRegex_ReturnsModifiedGroupName() _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")); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -58,23 +57,8 @@ 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_WithEmptyGroupName_ReturnsNull() - { - _versionProvider.Setup(); - - var group = ScriptableObject.CreateInstance(); - group.Name = ""; - var result = _versionProvider.Provide("dummy/path", typeof(object), false, "dummy/address", group); - Assert.That(result, Is.Null); - - UnityEngine.Object.DestroyImmediate(group); } [Test] @@ -84,15 +68,15 @@ public void Provide_WithInvalidRegex_ReturnsNull() _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); - UnityEngine.Object.DestroyImmediate(group); + Object.DestroyImmediate(group); } [Test] @@ -101,7 +85,7 @@ public void GetDescription_WithoutRegex_ReturnsBasicDescription() _provider.ReplaceWithRegex = false; var description = _versionProvider.GetDescription(); - + Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); } @@ -113,87 +97,9 @@ public void GetDescription_WithRegex_ReturnsDetailedDescription() _provider.Replacement = "$1"; var description = _versionProvider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"v(.+)_Group\" with \"$1\"")); - } - - [Test] - public void Provide_IgnoresAssetPathAndType() - { - // AddressableAssetGroupNameBasedVersionProviderはアセットパスやタイプを使用しない - _versionProvider.Setup(); - - var group = ScriptableObject.CreateInstance(); - group.Name = "v1.0.0"; - - var result1 = _versionProvider.Provide("path1", typeof(Texture2D), false, "addr1", group); - var result2 = _versionProvider.Provide("path2", typeof(GameObject), true, "addr2", group); - - Assert.That(result1, Is.EqualTo("v1.0.0")); - Assert.That(result2, Is.EqualTo("v1.0.0")); - - UnityEngine.Object.DestroyImmediate(group); - } - - [Test] - public void Provide_WithComplexVersionPattern_WorksCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @"^(.+)_v(\d+)_(\d+)_(\d+)(_[a-z]+)?$"; - _provider.Replacement = "$2.$3.$4$5"; - _versionProvider.Setup(); - - var group1 = ScriptableObject.CreateInstance(); - var group2 = ScriptableObject.CreateInstance(); - var group3 = ScriptableObject.CreateInstance(); - var group4 = ScriptableObject.CreateInstance(); - group1.Name = "Characters_v1_0_0"; - group2.Name = "Weapons_v2_1_0_beta"; - group3.Name = "Items_v3_2_5"; - group4.Name = "SimpleGroup"; - - var result1 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group1); - var result2 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group2); - var result3 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group3); - var result4 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group4); - - Assert.That(result1, Is.EqualTo("1.0.0")); - Assert.That(result2, Is.EqualTo("2.1.0_beta")); - Assert.That(result3, Is.EqualTo("3.2.5")); - Assert.That(result4, Is.EqualTo("SimpleGroup")); // パターンにマッチしない - - UnityEngine.Object.DestroyImmediate(group1); - UnityEngine.Object.DestroyImmediate(group2); - UnityEngine.Object.DestroyImmediate(group3); - UnityEngine.Object.DestroyImmediate(group4); - } - [Test] - public void Provide_WithSemanticVersioning_ExtractsCorrectly() - { - _provider.ReplaceWithRegex = true; - _provider.Pattern = @".*\[(\d+\.\d+\.\d+(?:-[a-zA-Z]+(?:\.\d+)?)?)\].*"; - _provider.Replacement = "$1"; - _versionProvider.Setup(); - - var group1 = ScriptableObject.CreateInstance(); - var group2 = ScriptableObject.CreateInstance(); - var group3 = ScriptableObject.CreateInstance(); - group1.Name = "Assets[1.0.0]"; - group2.Name = "BetaAssets[2.0.0-beta.1]"; - group3.Name = "Production[3.1.0-rc]"; - - var result1 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group1); - var result2 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group2); - var result3 = _versionProvider.Provide("dummy", typeof(object), false, "dummy", group3); - - Assert.That(result1, Is.EqualTo("1.0.0")); - Assert.That(result2, Is.EqualTo("2.0.0-beta.1")); - Assert.That(result3, Is.EqualTo("3.1.0-rc")); - - UnityEngine.Object.DestroyImmediate(group1); - UnityEngine.Object.DestroyImmediate(group2); - UnityEngine.Object.DestroyImmediate(group3); + Assert.That(description, + Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"v(.+)_Group\" with \"$1\"")); } } -} \ No newline at end of file +} From a380d755c5745baa7916384336e4466231bf21b6 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Thu, 3 Jul 2025 10:46:41 +0900 Subject: [PATCH 21/24] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/Shared/AddressBasedProviderTest.cs | 147 --------------- .../Shared/AddressBasedProviderTest.cs.meta | 11 -- ...ressableAssetGroupNameBasedProviderTest.cs | 167 ------------------ ...bleAssetGroupNameBasedProviderTest.cs.meta | 11 -- 4 files changed, 336 deletions(-) delete mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs delete mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta delete mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs delete mode 100644 Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs deleted file mode 100644 index ab3f107..0000000 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs +++ /dev/null @@ -1,147 +0,0 @@ -using NUnit.Framework; -using SmartAddresser.Editor.Core.Models.Shared; - -namespace SmartAddresser.Tests.Editor.Core.Models.Shared -{ - internal sealed class AddressBasedProviderTest - { - // AddressBasedProviderは抽象クラスなので、テスト用の具象クラスを作成 - private class TestAddressBasedProvider : AddressBasedProvider - { - } - - [Test] - public void Provide_WithoutRegex_ReturnsOriginalAddress() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = false; - provider.Setup(); - - var result = provider.Provide("assets/textures/player"); - - Assert.That(result, Is.EqualTo("assets/textures/player")); - } - - [Test] - public void Provide_WithRegex_ReturnsReplacedAddress() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"assets/(.+)/(.+)"; - provider.Replacement = "$2_$1"; - provider.Setup(); - - var result = provider.Provide("assets/textures/player"); - - Assert.That(result, Is.EqualTo("player_textures")); - } - - [Test] - public void Provide_WithRegexRemovePrefix_ReturnsModifiedAddress() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"^assets/"; - provider.Replacement = ""; - provider.Setup(); - - var result = provider.Provide("assets/textures/player"); - - Assert.That(result, Is.EqualTo("textures/player")); - } - - [Test] - public void Provide_WithEmptyAddress_ReturnsNull() - { - var provider = new TestAddressBasedProvider(); - provider.Setup(); - - var result1 = provider.Provide(""); - var result2 = provider.Provide(null); - - Assert.That(result1, Is.Null); - Assert.That(result2, Is.Null); - } - - [Test] - public void Provide_WithInvalidRegexPattern_ReturnsNull() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = "["; // 不正な正規表現パターン - provider.Replacement = "replacement"; - provider.Setup(); - - var result = provider.Provide("assets/textures/player"); - - Assert.That(result, Is.Null); - } - - [Test] - public void Provide_WithRegexThrowingException_ReturnsNull() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"(.+)"; - provider.Replacement = "$99"; // 存在しないグループ参照 - provider.Setup(); - - var result = provider.Provide("assets/textures/player"); - - // 正規表現の置換でエラーが発生した場合はnullを返す - Assert.That(result, Is.Null); - } - - [Test] - public void GetDescription_WithoutRegex_ReturnsBasicDescription() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = false; - - var description = provider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Address")); - } - - [Test] - public void GetDescription_WithRegex_ReturnsDetailedDescription() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"^assets/"; - provider.Replacement = ""; - - var description = provider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Address, Regex: Replace \"^assets/\" with \"\"")); - } - - [Test] - public void Setup_WithInvalidRegexPattern_HandlesGracefully() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = "["; // 不正な正規表現パターン - provider.Replacement = "replacement"; - - // Setupメソッドは例外をスローしない - Assert.DoesNotThrow(() => provider.Setup()); - } - - [Test] - public void Provide_MultipleCallsWithSamePattern_ReturnsSameResult() - { - var provider = new TestAddressBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"(.+)/(.+)"; - provider.Replacement = "$2/$1"; - provider.Setup(); - - var result1 = provider.Provide("folder/file"); - var result2 = provider.Provide("folder/file"); - - Assert.That(result1, Is.EqualTo("file/folder")); - Assert.That(result2, Is.EqualTo("file/folder")); - } - } -} \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta deleted file mode 100644 index 1c4f6b3..0000000 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressBasedProviderTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1a2b3c4d5e6f7890abcdef1234567890 -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/AddressableAssetGroupNameBasedProviderTest.cs b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs deleted file mode 100644 index 4bd99ea..0000000 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs +++ /dev/null @@ -1,167 +0,0 @@ -using NUnit.Framework; -using SmartAddresser.Editor.Core.Models.Shared; - -namespace SmartAddresser.Tests.Editor.Core.Models.Shared -{ - internal sealed class AddressableAssetGroupNameBasedProviderTest - { - // AddressableAssetGroupNameBasedProviderは抽象クラスなので、テスト用の具象クラスを作成 - private class TestAddressableAssetGroupNameBasedProvider : AddressableAssetGroupNameBasedProvider - { - } - - [Test] - public void Provide_WithoutRegex_ReturnsOriginalGroupName() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = false; - provider.Setup(); - - var result = provider.Provide("DefaultGroup"); - - Assert.That(result, Is.EqualTo("DefaultGroup")); - } - - [Test] - public void Provide_WithRegex_ReturnsReplacedGroupName() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"Group_(.+)"; - provider.Replacement = "$1_Modified"; - provider.Setup(); - - var result = provider.Provide("Group_Assets"); - - Assert.That(result, Is.EqualTo("Assets_Modified")); - } - - [Test] - public void Provide_WithRegexRemovePrefix_ReturnsModifiedGroupName() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"^Prefix_"; - provider.Replacement = ""; - provider.Setup(); - - var result = provider.Provide("Prefix_MainGroup"); - - Assert.That(result, Is.EqualTo("MainGroup")); - } - - [Test] - public void Provide_WithEmptyGroupName_ReturnsNull() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.Setup(); - - var result1 = provider.Provide(""); - var result2 = provider.Provide(null); - - Assert.That(result1, Is.Null); - Assert.That(result2, Is.Null); - } - - [Test] - public void Provide_WithInvalidRegexPattern_ReturnsNull() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = "[("; // 不正な正規表現パターン - provider.Replacement = "replacement"; - provider.Setup(); - - var result = provider.Provide("TestGroup"); - - Assert.That(result, Is.Null); - } - - [Test] - public void Provide_WithRegexThrowingException_ReturnsNull() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"(.+)"; - provider.Replacement = "$999"; // 存在しないグループ参照 - provider.Setup(); - - var result = provider.Provide("TestGroup"); - - // 正規表現の置換でエラーが発生した場合はnullを返す - Assert.That(result, Is.Null); - } - - [Test] - public void GetDescription_WithoutRegex_ReturnsBasicDescription() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = false; - - var description = provider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name")); - } - - [Test] - public void GetDescription_WithRegex_ReturnsDetailedDescription() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"^Group_"; - provider.Replacement = ""; - - var description = provider.GetDescription(); - - Assert.That(description, Is.EqualTo("Source: Addressable Asset Group Name, Regex: Replace \"^Group_\" with \"\"")); - } - - [Test] - public void Setup_WithInvalidRegexPattern_HandlesGracefully() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = "[("; // 不正な正規表現パターン - provider.Replacement = "replacement"; - - // Setupメソッドは例外をスローしない - Assert.DoesNotThrow(() => provider.Setup()); - } - - [Test] - public void Provide_WithComplexRegexPattern_WorksCorrectly() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"^(Dev|Test)_(.+)_Group$"; - provider.Replacement = "$2"; - provider.Setup(); - - var result1 = provider.Provide("Dev_Characters_Group"); - var result2 = provider.Provide("Test_Weapons_Group"); - var result3 = provider.Provide("Production_Assets_Group"); - - Assert.That(result1, Is.EqualTo("Characters")); - Assert.That(result2, Is.EqualTo("Weapons")); - Assert.That(result3, Is.EqualTo("Production_Assets_Group")); // パターンにマッチしない - } - - [Test] - public void Provide_MultipleCallsWithSamePattern_ReturnsSameResult() - { - var provider = new TestAddressableAssetGroupNameBasedProvider(); - provider.ReplaceWithRegex = true; - provider.Pattern = @"_v\d+$"; - provider.Replacement = ""; - provider.Setup(); - - var result1 = provider.Provide("Assets_v1"); - var result2 = provider.Provide("Assets_v1"); - var result3 = provider.Provide("Assets_v2"); - - Assert.That(result1, Is.EqualTo("Assets")); - Assert.That(result2, Is.EqualTo("Assets")); - Assert.That(result3, Is.EqualTo("Assets")); - } - } -} \ No newline at end of file diff --git a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta deleted file mode 100644 index 4ec6c75..0000000 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AddressableAssetGroupNameBasedProviderTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b3c4d5e6f7890abcdef123456789012 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: \ No newline at end of file From b6cee6c10d4cca852b675b0eee3a25c6ecdfecab Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Thu, 3 Jul 2025 10:51:55 +0900 Subject: [PATCH 22/24] =?UTF-8?q?test:=20AddressBasedAssetFilterTest?= =?UTF-8?q?=E3=81=8B=E3=82=89=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 空のアドレスのテストケース(IsMatch_WithEmptyAddress_ReturnsFalse)を削除 - 複雑な正規表現パターンのテストケース(IsMatch_WithComplexPattern_WorksCorrectly)を削除 - メソッド名を改善(SetupForMatching_WithInvalidRegex_DoesNotThrow) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../AddressBasedAssetFilterTest.cs | 38 ++----------------- 1 file changed, 3 insertions(+), 35 deletions(-) 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 index 3fb2f6b..63533ac 100644 --- a/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs +++ b/Assets/SmartAddresser/Tests/Editor/Core/Models/Shared/AssetGroups/AssetFilterImpl/AddressBasedAssetFilterTest.cs @@ -114,21 +114,7 @@ public void IsMatch_WithMultipleRegex_NotMatchAll_ReturnsTrue() Assert.That(result, Is.True); } - - [Test] - public void IsMatch_WithEmptyAddress_ReturnsFalse() - { - _filter.Condition = AssetFilterCondition.ContainsMatched; - _filter.AddressRegex.Value = ".*"; - _filter.SetupForMatching(); - - var result1 = _filter.IsMatch("dummy", typeof(object), false, "", null); - var result2 = _filter.IsMatch("dummy", typeof(object), false, null, null); - - Assert.That(result1, Is.False); - Assert.That(result2, Is.False); - } - + [Test] public void IsMatch_WithFolder_WhenMatchWithFoldersIsFalse_ReturnsFalse() { @@ -156,7 +142,7 @@ public void IsMatch_WithFolder_WhenMatchWithFoldersIsTrue_ReturnsTrue() } [Test] - public void SetupForMatching_WithInvalidRegex_HandlesGracefully() + public void SetupForMatching_WithInvalidRegex_DoesNotThrow() { _filter.AddressRegex.IsListMode = true; _filter.AddressRegex.AddValue("valid.*"); @@ -260,24 +246,6 @@ public void IsMatch_WithAddressableAssetGroup_IgnoresGroup() UnityEngine.Object.DestroyImmediate(group); } - [Test] - public void IsMatch_WithComplexPattern_WorksCorrectly() - { - _filter.Condition = AssetFilterCondition.ContainsMatched; - _filter.AddressRegex.Value = @"^assets/v\d+\.\d+\.\d+/.*"; - _filter.SetupForMatching(); - - var result1 = _filter.IsMatch("dummy", typeof(object), false, "assets/v1.0.0/character", null); - var result2 = _filter.IsMatch("dummy", typeof(object), false, "assets/v2.1.3/weapon", null); - var result3 = _filter.IsMatch("dummy", typeof(object), false, "assets/vX.Y.Z/item", null); - var result4 = _filter.IsMatch("dummy", typeof(object), false, "other/v1.0.0/test", null); - - Assert.That(result1, Is.True); - Assert.That(result2, Is.True); - Assert.That(result3, Is.False); - Assert.That(result4, Is.False); - } - [Test] public void IsMatch_EmptyRegexList_AlwaysFalseForContainsMatched() { @@ -301,4 +269,4 @@ public void IsMatch_EmptyRegexList_AlwaysTrueForMatchAll() Assert.That(result, Is.True); } } -} \ No newline at end of file +} From 6444eb93cec87b616f3c0d75e70c2e52235043e0 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Thu, 3 Jul 2025 11:11:13 +0900 Subject: [PATCH 23/24] =?UTF-8?q?refactor:=20Drawer=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=81=A7GUI.enabled=E3=82=92EditorGUI.DisabledScope?= =?UTF-8?q?=E3=81=AB=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 全てのProviderDrawerクラスで、GUI.enabledの直接的な操作から EditorGUI.DisabledScopeを使用したusing文の方式に変更。 これによりコードがより現代的なUnityのベストプラクティスに準拠。 🤖 Generated with Claude Code Co-Authored-By: Claude --- .../AddressBasedLabelProviderDrawer.cs | 8 ++------ ...dressableAssetGroupNameBasedLabelProviderDrawer.cs | 11 ++++------- .../Shared/AssetPathBasedProviderDrawerBase.cs | 5 +---- .../AddressBasedVersionProviderDrawer.cs | 8 ++------ ...essableAssetGroupNameBasedVersionProviderDrawer.cs | 6 ++---- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs index 0dc9a3e..a2dc503 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressBasedLabelProviderDrawer.cs @@ -1,8 +1,6 @@ using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; -using SmartAddresser.Editor.Core.Models.Shared; using SmartAddresser.Editor.Foundation.CustomDrawers; using UnityEditor; -using UnityEngine; namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.LabelRuleEditor { @@ -17,7 +15,7 @@ protected override void GUILayout(AddressBasedLabelProvider 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)); @@ -25,8 +23,6 @@ protected override void GUILayout(AddressBasedLabelProvider target) var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); } - - GUI.enabled = true; } } -} \ No newline at end of file +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs index 0d1c326..38b337d 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/LabelRuleEditor/AddressableAssetGroupNameBasedLabelProviderDrawer.cs @@ -1,8 +1,6 @@ using SmartAddresser.Editor.Core.Models.LayoutRules.LabelRules; -using SmartAddresser.Editor.Core.Models.Shared; using SmartAddresser.Editor.Foundation.CustomDrawers; using UnityEditor; -using UnityEngine; namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.LabelRuleEditor { @@ -10,14 +8,15 @@ namespace SmartAddresser.Editor.Core.Tools.Addresser.LayoutRuleEditor.LabelRuleE /// GUI Drawer for /// [CustomGUIDrawer(typeof(AddressableAssetGroupNameBasedLabelProvider))] - public sealed class AddressableAssetGroupNameBasedLabelProviderDrawer : GUIDrawer + 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); - GUI.enabled = target.ReplaceWithRegex; + using (new EditorGUI.DisabledScope(!target.ReplaceWithRegex)) using (new EditorGUI.IndentLevelScope()) { var patternLabel = ObjectNames.NicifyVariableName(nameof(target.Pattern)); @@ -25,8 +24,6 @@ protected override void GUILayout(AddressableAssetGroupNameBasedLabelProvider ta var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); } - - GUI.enabled = true; } } -} \ No newline at end of file +} 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 index 58be2f0..0f6fe57 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressBasedVersionProviderDrawer.cs @@ -1,8 +1,6 @@ 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 { @@ -17,7 +15,7 @@ protected override void GUILayout(AddressBasedVersionProvider 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)); @@ -25,8 +23,6 @@ protected override void GUILayout(AddressBasedVersionProvider target) var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); } - - GUI.enabled = true; } } -} \ No newline at end of file +} diff --git a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs index ebba3a2..6ccaff0 100644 --- a/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs +++ b/Assets/SmartAddresser/Editor/Core/Tools/Addresser/LayoutRuleEditor/VersionRuleEditor/AddressableAssetGroupNameBasedVersionProviderDrawer.cs @@ -17,7 +17,7 @@ protected override void GUILayout(AddressableAssetGroupNameBasedVersionProvider 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)); @@ -25,8 +25,6 @@ protected override void GUILayout(AddressableAssetGroupNameBasedVersionProvider var replacementLabel = ObjectNames.NicifyVariableName(nameof(target.Replacement)); target.Replacement = EditorGUILayout.TextField(replacementLabel, target.Replacement); } - - GUI.enabled = true; } } -} \ No newline at end of file +} From 2b1cfe7fdd8d1e310c827aa729a7d7848de33083 Mon Sep 17 00:00:00 2001 From: Haruki Yano Date: Thu, 3 Jul 2025 11:17:46 +0900 Subject: [PATCH 24/24] =?UTF-8?q?refactor:=20AssetGroupPresenter=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E3=81=AEruleContext=E3=83=95=E3=82=A3?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=83=89=E3=82=92ruleType=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AssetGroupCollectionPanelPresenterとAssetGroupPanelPresenterで使用されていた _ruleContextフィールド名を_ruleTypeに統一。パラメータ名も同様に変更。 --- .../AssetGroups/AssetGroupCollectionPanelPresenter.cs | 8 ++++---- .../Shared/AssetGroups/AssetGroupPanelPresenter.cs | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) 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 153efac..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,7 +16,7 @@ internal sealed class AssetGroupCollectionPanelPresenter : IDisposable new Dictionary(); private readonly AutoIncrementHistory _history; - private readonly RuleType? _ruleContext; + private readonly RuleType? _ruleType; private readonly IAssetSaveService _saveService; private readonly CompositeDisposable _setupViewDisposables = new CompositeDisposable(); private readonly AssetGroupCollectionPanelView _view; @@ -25,12 +25,12 @@ internal sealed class AssetGroupCollectionPanelPresenter : IDisposable private IObservableList _groups; public AssetGroupCollectionPanelPresenter(AssetGroupCollectionPanelView view, AutoIncrementHistory history, - IAssetSaveService saveService, RuleType? ruleContext = null) + IAssetSaveService saveService, RuleType? ruleType = null) { _view = view; _history = history; _saveService = saveService; - _ruleContext = ruleContext; + _ruleType = ruleType; SetupViewEventHandlers(); } @@ -80,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, _ruleContext); + 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 d6d2f42..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,7 +20,7 @@ internal sealed class AssetGroupPanelPresenter : IDisposable new Dictionary(); private readonly AutoIncrementHistory _history; - private readonly RuleType? _ruleContext; + private readonly RuleType? _ruleType; private readonly IAssetSaveService _saveService; private readonly CompositeDisposable _setupViewDisposables = new CompositeDisposable(); private readonly AssetGroupPanelView _view; @@ -30,12 +30,12 @@ internal sealed class AssetGroupPanelPresenter : IDisposable private IList _groups; public AssetGroupPanelPresenter(AssetGroupPanelView view, AutoIncrementHistory history, - IAssetSaveService saveService, RuleType? ruleContext = null) + IAssetSaveService saveService, RuleType? ruleType = null) { _view = view; _history = history; _saveService = saveService; - _ruleContext = ruleContext; + _ruleType = ruleType; SetupViewEventHandlers(); } @@ -249,7 +249,7 @@ void AddFilter() .Where(x => x.GetCustomAttribute() == null); // Filter by rule context if set - if (_ruleContext.HasValue) + if (_ruleType.HasValue) types = types.Where(type => { var restrictedAttribute = type.GetCustomAttribute(); @@ -257,7 +257,7 @@ void AddFilter() if (restrictedAttribute == null) return true; // If restriction attribute exists, check if current rule type is allowed - return restrictedAttribute.AllowedRuleTypes.Contains(_ruleContext.Value); + return restrictedAttribute.AllowedRuleTypes.Contains(_ruleType.Value); }); // Show filter selection menu.