From 1ef079ca58a13473462fe6edc4ef09eecb3f07e7 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 15 Sep 2022 12:52:56 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=82Enum.Parse=20=E3=82=92=E5=88=9D=E6=9C=9F?= =?UTF-8?q?=E5=8C=96=E3=81=AB=E7=A7=BB=E5=8B=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/UniHumanoid/AvatarDescription.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index 4a6ec07f1..061c60b4e 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; namespace UniHumanoid { + // TODO: BoneLimit.cs に分ける(v0.104以降) [Serializable] public struct BoneLimit { @@ -20,17 +21,33 @@ namespace UniHumanoid public Vector3 center; public float axisLength; - // HumanTrait.BoneName 呼び出し毎にGCが発生 + + // HumanTrait.BoneName は HumanBodyBones.ToString とほぼ一対一に対応するが、 + // 指のボーンについては " " の有無という微妙な違いがある。 + // このスペースは AvatarBuilder.BuildHumanAvatar において必用であり、 + // HumanBodyBones.ToString と区別する必要がある。 + // + // また、下記についてGCが発生するのでキャッシュします。 + // * HumanTrait.BoneName + // * traitName.Replace + // * Enum.Parse + // private static readonly Dictionary cachedHumanBodyBonesToBoneTraitNameMap = HumanTrait.BoneName.ToDictionary( traitName => (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), traitName.Replace(" ", "")), traitName => traitName); + // 逆引き + private static readonly Dictionary cachedBoneTraitNameToHumanBodyBonesMap = + HumanTrait.BoneName.ToDictionary( + traitName => traitName, + traitName => (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), traitName.Replace(" ", ""))); + public static BoneLimit From(HumanBone bone) { return new BoneLimit { - humanBone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), bone.humanName.Replace(" ", ""), true), + humanBone = cachedBoneTraitNameToHumanBodyBonesMap[bone.humanName], boneName = bone.boneName, useDefaultValues = bone.limit.useDefaultValues, min = bone.limit.min, @@ -40,17 +57,12 @@ namespace UniHumanoid }; } - public static String ToHumanBoneTraitName(HumanBodyBones b) - { - return cachedHumanBodyBonesToBoneTraitNameMap[b]; - } - public HumanBone ToHumanBone() { return new HumanBone { boneName = boneName, - humanName = ToHumanBoneTraitName(humanBone), + humanName = cachedHumanBodyBonesToBoneTraitNameMap[humanBone], limit = new HumanLimit { useDefaultValues = useDefaultValues,