diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 22142b83d..3fc02af30 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog]. ### Fixed - Apply On Play may not working well `#305` +- Some components unexpectedly can be added multiple times `#306` ### Security diff --git a/CHANGELOG.md b/CHANGELOG.md index dd83d67c1..fc3b9a3a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ The format is based on [Keep a Changelog]. - Animating Behaviour.m_Enabled not working `#287` - Error Report Window may not refreshed after build error `#299` - Apply On Play may not working well `#305` +- Some components unexpectedly can be added multiple times `#306` ### Security diff --git a/Runtime/Activator.cs b/Runtime/Activator.cs index dd59d5acb..658d105fe 100644 --- a/Runtime/Activator.cs +++ b/Runtime/Activator.cs @@ -13,6 +13,7 @@ namespace Anatawa12.AvatarOptimizer [AddComponentMenu("")] [ExecuteAlways] [DefaultExecutionOrder(-9989)] + [DisallowMultipleComponent] internal class Activator : MonoBehaviour { private void OnValidate() @@ -34,6 +35,7 @@ private void RemoveSelf() [AddComponentMenu("")] [ExecuteAlways] [DefaultExecutionOrder(-9997)] + [DisallowMultipleComponent] internal class AvatarActivator : MonoBehaviour { private void Update() diff --git a/Runtime/ClearEndpointPosition.cs b/Runtime/ClearEndpointPosition.cs index e312f6649..05bce3ac3 100644 --- a/Runtime/ClearEndpointPosition.cs +++ b/Runtime/ClearEndpointPosition.cs @@ -5,6 +5,7 @@ namespace Anatawa12.AvatarOptimizer { [AddComponentMenu("Avatar Optimizer/AAO Clear Endpoint Position")] [RequireComponent(typeof(VRCPhysBoneBase))] + [DisallowMultipleComponent] internal class ClearEndpointPosition : AvatarTagComponent { } diff --git a/Runtime/MakeChildren.cs b/Runtime/MakeChildren.cs index 0348e740f..0f7f6bcf8 100644 --- a/Runtime/MakeChildren.cs +++ b/Runtime/MakeChildren.cs @@ -4,6 +4,7 @@ namespace Anatawa12.AvatarOptimizer { [AddComponentMenu("Avatar Optimizer/AAO Make Children")] + [DisallowMultipleComponent] internal class MakeChildren : AvatarTagComponent { [CL4EELocalized("MakeChildren:prop:executeEarly", "MakeChildren:tooltip:executeEarly")] diff --git a/Runtime/MergeToonLitMaterial.cs b/Runtime/MergeToonLitMaterial.cs index ce45ea64d..fd7f89b55 100644 --- a/Runtime/MergeToonLitMaterial.cs +++ b/Runtime/MergeToonLitMaterial.cs @@ -4,6 +4,7 @@ namespace Anatawa12.AvatarOptimizer { [AddComponentMenu("Avatar Optimizer/AAO Merge Toon Lit Material")] + [DisallowMultipleComponent] internal class MergeToonLitMaterial : EditSkinnedMeshComponent { public MergeInfo[] merges = Array.Empty(); diff --git a/Test~/AddComponentMenuTest.cs b/Test~/ComponentSettingsTest.cs similarity index 72% rename from Test~/AddComponentMenuTest.cs rename to Test~/ComponentSettingsTest.cs index a404db590..4ed03c23c 100644 --- a/Test~/AddComponentMenuTest.cs +++ b/Test~/ComponentSettingsTest.cs @@ -7,7 +7,7 @@ namespace Anatawa12.AvatarOptimizer.Test { - public class AddComponentMenuTest + public class ComponentSettingsTest { [Test] [TestCaseSource(nameof(ComponentTypes))] @@ -18,6 +18,14 @@ public void CheckAddComponentMenuIsInAvatarOptimizer(Type type) Assert.That(addComponentMenu.componentMenu, Does.StartWith("Avatar Optimizer/AAO ").Or.Empty); } + [Test] + [TestCaseSource(nameof(ComponentTypes))] + public void CheckDisallowMultipleComponentIsSpecified(Type type) + { + var addComponentMenu = type.GetCustomAttribute(); + Assert.That(addComponentMenu, Is.Not.Null); + } + static IEnumerable ComponentTypes() { return diff --git a/Test~/AddComponentMenuTest.cs.meta b/Test~/ComponentSettingsTest.cs.meta similarity index 100% rename from Test~/AddComponentMenuTest.cs.meta rename to Test~/ComponentSettingsTest.cs.meta