diff --git a/Assets/VRM/UniVRM/Editor/Tests/VRMBlendShapeKeyTest.cs b/Assets/VRM/UniVRM/Editor/Tests/VRMBlendShapeKeyTest.cs index f72a18d20..a3aed5069 100644 --- a/Assets/VRM/UniVRM/Editor/Tests/VRMBlendShapeKeyTest.cs +++ b/Assets/VRM/UniVRM/Editor/Tests/VRMBlendShapeKeyTest.cs @@ -10,21 +10,22 @@ namespace VRM { static BlendShapeKey CreateBlendShapeKey(string name, BlendShapePreset preset) { - var argTypes = new Type[] { typeof(string), typeof(BlendShapePreset) }; + var argTypes = new Type[] {typeof(string), typeof(BlendShapePreset)}; // private constructor var constructor = typeof(BlendShapeKey).GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, argTypes, null); - return (BlendShapeKey)constructor.Invoke(new object[] { name, preset }); + return (BlendShapeKey) constructor.Invoke(new object[] {name, preset}); } [Test] public void KeyTest() { - var key = CreateBlendShapeKey("Blink", BlendShapePreset.Blink); - Assert.AreEqual(key, CreateBlendShapeKey("Blink", BlendShapePreset.Blink)); + var key = BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink); Assert.AreEqual(key, BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink)); + Assert.AreEqual(key, CreateBlendShapeKey("Blink", BlendShapePreset.Blink)); Assert.AreEqual(key, CreateBlendShapeKey("xxx", BlendShapePreset.Blink)); + Assert.AreEqual(key.Name, "Blink"); var dict = new Dictionary(); dict[key] = 1.0f; @@ -35,17 +36,23 @@ namespace VRM dict.Clear(); - var key2 = BlendShapeKey.CreateUnknown("Blink"); // name: Blink, Preset: Unknown + var key2 = BlendShapeKey.CreateUnknown("Blink"); // Name: Blink, Preset: Unknown dict[key2] = 1.0f; Assert.AreEqual(key2, CreateBlendShapeKey("Blink", BlendShapePreset.Unknown)); Assert.AreNotEqual(key2, BlendShapeKey.CreateUnknown("blink")); Assert.AreNotEqual(key2, CreateBlendShapeKey("Blink", BlendShapePreset.Blink)); Assert.AreNotEqual(key2, BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink)); + Assert.AreEqual(key2.Name, "Blink"); Assert.IsFalse(dict.ContainsKey(BlendShapeKey.CreateUnknown("blink"))); Assert.IsFalse(dict.ContainsKey(CreateBlendShapeKey("Blink", BlendShapePreset.Blink))); Assert.IsFalse(dict.ContainsKey(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink))); + + var key3 = CreateBlendShapeKey("xxx", BlendShapePreset.Blink); // Unknown 以外は独自の名前を持てない + Assert.AreEqual(key3, BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink)); + Assert.AreNotEqual(key3, CreateBlendShapeKey("xxx", BlendShapePreset.Unknown)); + Assert.AreEqual(key3.Name, "Blink"); } } } diff --git a/Assets/VRM/UniVRM/Scripts/BlendShape/BlendShapeKey.cs b/Assets/VRM/UniVRM/Scripts/BlendShape/BlendShapeKey.cs index d8b5611b0..344904f21 100644 --- a/Assets/VRM/UniVRM/Scripts/BlendShape/BlendShapeKey.cs +++ b/Assets/VRM/UniVRM/Scripts/BlendShape/BlendShapeKey.cs @@ -4,58 +4,24 @@ using System.Collections.Generic; namespace VRM { [Serializable] - public struct BlendShapeKey : IEquatable, IComparable + public readonly struct BlendShapeKey : IEquatable, IComparable { /// /// Enum.ToString() のGC回避用キャッシュ /// - private static readonly Dictionary m_presetNameDictionary = + private static readonly Dictionary PresetNameCacheDictionary = new Dictionary(); - /// /// BlendShapePresetと同名の名前を持つ独自に追加したBlendShapeを区別するためのprefix /// private static readonly string UnknownPresetPrefix = "Unknown_"; - private readonly string m_name; - - public string Name - { - get { return m_name; } - } + public string Name { get; } public readonly BlendShapePreset Preset; - string m_id; - - string ID - { - get - { - if (string.IsNullOrEmpty(m_id)) - { - if (Preset != BlendShapePreset.Unknown) - { - if (m_presetNameDictionary.ContainsKey(Preset)) - { - m_id = m_presetNameDictionary[Preset]; - } - else - { - m_presetNameDictionary.Add(Preset, Preset.ToString()); - m_id = m_presetNameDictionary[Preset]; - } - } - else - { - m_id = UnknownPresetPrefix + m_name; - } - } - - return m_id; - } - } + private readonly string m_id; /// /// name と preset のペアからBlendShapeKeyを生成するが、 @@ -77,24 +43,26 @@ namespace VRM /// private BlendShapeKey(string name, BlendShapePreset preset) { - m_name = name; Preset = preset; if (Preset != BlendShapePreset.Unknown) { - if (m_presetNameDictionary.ContainsKey((Preset))) + if (PresetNameCacheDictionary.TryGetValue(Preset, out var presetName)) { - m_id = m_presetNameDictionary[Preset]; + m_id = Name = presetName; } else { - m_presetNameDictionary.Add(Preset, Preset.ToString()); - m_id = m_presetNameDictionary[Preset]; + // BlendShapePreset.Unknown 以外の場合、 name は捨てられる + m_id = Name = Preset.ToString(); + + PresetNameCacheDictionary.Add(Preset, Name); } } else { - m_id = UnknownPresetPrefix + m_name; + Name = !string.IsNullOrEmpty(name) ? name : ""; + m_id = UnknownPresetPrefix + Name; } } @@ -105,7 +73,7 @@ namespace VRM /// public static BlendShapeKey CreateFromPreset(BlendShapePreset preset) { - return new BlendShapeKey(preset.ToString(), preset); + return new BlendShapeKey("", preset); } /// @@ -135,19 +103,19 @@ namespace VRM public override string ToString() { - return ID.Replace(UnknownPresetPrefix, "").ToUpper(); + return m_id.Replace(UnknownPresetPrefix, ""); } public bool Equals(BlendShapeKey other) { - return ID == other.ID; + return m_id == other.m_id; } public override bool Equals(object obj) { if (obj is BlendShapeKey) { - return Equals((BlendShapeKey)obj); + return Equals((BlendShapeKey) obj); } else { @@ -157,7 +125,7 @@ namespace VRM public override int GetHashCode() { - return ID.GetHashCode(); + return m_id.GetHashCode(); } public bool Match(BlendShapeClip clip)