diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs index b0356fd70..df8e4832e 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs @@ -8,14 +8,9 @@ namespace UniGLTF { public static class NodeImporter { - static int n = 0; public static GameObject ImportNode(glTFNode node, int nodeIndex) { var nodeName = node.name; - if (nodeName == "ENDSITE") - { - nodeName = $"ENDSITE{n++}"; - } if (!string.IsNullOrEmpty(nodeName) && nodeName.Contains("/")) { Debug.LogWarningFormat("node {0} contains /. replace _", node.name); @@ -125,7 +120,7 @@ namespace UniGLTF // invisible in loading renderer.enabled = false; - if (mesh.ShouldSetRendererNodeAsBone) + if (mesh.ShouldSetRendererNodeAsBone ) { renderer.bones = new[] { renderer.transform }; diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index 061c60b4e..233ef9224 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -75,6 +75,57 @@ namespace UniHumanoid } } + class UniqueName + { + HashSet m_uniqueNameSet = new HashSet(); + int m_counter = 1; + + public void ForceUniqueName(Transform t) + { + if (!m_uniqueNameSet.Contains(t.name)) + { + m_uniqueNameSet.Add(t.name); + return; + } + + if (t.parent != null && t.childCount == 0) + { + /// AvatarBuilder:BuildHumanAvatar で同名の Transform があるとエラーになる。 + /// + /// AvatarBuilder 'GLTF': Ambiguous Transform '32/root/torso_1/torso_2/torso_3/torso_4/torso_5/torso_6/torso_7/neck_1/neck_2/head/ENDSITE' and '32/root/torso_1/torso_2/torso_3/torso_4/torso_5/torso_6/torso_7/l_shoulder/l_up_arm/l_low_arm/l_hand/ENDSITE' found in hierarchy for human bone 'Head'. Transform name mapped to a human bone must be unique. + /// UnityEngine.AvatarBuilder:BuildHumanAvatar (UnityEngine.GameObject,UnityEngine.HumanDescription) + /// UniHumanoid.AvatarDescription:CreateAvatar (UnityEngine.Transform) + /// + /// 主に BVH の EndSite 由来の GameObject 名が重複することへの対策 + /// ex: parent-ENDSITE + var newName = $"{t.parent.name}-{t.name}"; + if (!m_uniqueNameSet.Contains(newName)) + { + Debug.LogWarning($"force rename: {t.name} => {newName}"); + t.name = newName; + m_uniqueNameSet.Add(newName); + return; + } + } + + // 連番 + for (int i = 0; i < 100; ++i) + { + // ex: name.1 + var newName = $"{t.name}{m_counter++}"; + if (!m_uniqueNameSet.Contains(newName)) + { + Debug.LogWarning($"force rename: {t.name} => {newName}"); + t.name = newName; + m_uniqueNameSet.Add(newName); + return; + } + } + + throw new NotImplementedException(); + } + } + [Serializable] public class AvatarDescription : ScriptableObject { @@ -90,12 +141,15 @@ namespace UniHumanoid public HumanDescription ToHumanDescription(Transform root) { + var uniqueName = new UniqueName(); var transforms = root.GetComponentsInChildren(); var skeletonBones = new SkeletonBone[transforms.Length]; var index = 0; foreach (var t in transforms) { skeletonBones[index] = t.ToSkeletonBone(); + uniqueName.ForceUniqueName(t); + index++; }