UniqueName

This commit is contained in:
ousttrue 2023-03-03 13:20:02 +09:00
parent 3160585713
commit 82ef3edd71
2 changed files with 55 additions and 6 deletions

View File

@ -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 };

View File

@ -75,6 +75,57 @@ namespace UniHumanoid
}
}
class UniqueName
{
HashSet<string> m_uniqueNameSet = new HashSet<string>();
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<Transform>();
var skeletonBones = new SkeletonBone[transforms.Length];
var index = 0;
foreach (var t in transforms)
{
skeletonBones[index] = t.ToSkeletonBone();
uniqueName.ForceUniqueName(t);
index++;
}