すべての経路で ForceTransformUniqueName.Process するようにした

This commit is contained in:
ousttrue
2025-04-09 00:23:02 +09:00
parent 487183978f
commit fbb9932d0c
6 changed files with 17 additions and 52 deletions

View File

@@ -91,54 +91,19 @@ namespace UniHumanoid
public bool hasTranslationDoF;
public BoneLimit[] human;
public HumanDescription ToHumanDescription(Transform root, bool forceRename)
public IEnumerable<(Transform, HumanBodyBones)> ToHumanoidMap(Transform root)
{
if (forceRename)
var map = new Dictionary<string, Transform>();
foreach (var t in root.GetComponentsInChildren<Transform>())
{
ForceTransformUniqueName.Process(root);
map[t.name] = t;
}
var transforms = root.GetComponentsInChildren<Transform>();
var skeletonBones = new SkeletonBone[transforms.Length];
var index = 0;
foreach (var t in transforms)
{
skeletonBones[index] = t.ToSkeletonBone();
index++;
}
var humanBones = new HumanBone[human.Length];
index = 0;
foreach (var bonelimit in human)
{
humanBones[index] = bonelimit.ToHumanBone();
index++;
}
return new HumanDescription
{
skeleton = skeletonBones,
human = humanBones,
armStretch = armStretch,
legStretch = legStretch,
upperArmTwist = upperArmTwist,
lowerArmTwist = lowerArmTwist,
upperLegTwist = upperLegTwist,
lowerLegTwist = lowerLegTwist,
feetSpacing = feetSpacing,
hasTranslationDoF = hasTranslationDoF,
};
}
public Avatar CreateAvatar(Transform root)
{
return AvatarBuilder.BuildHumanAvatar(root.gameObject, ToHumanDescription(root, true));
return human.Select(x => (map[x.boneName], x.humanBone));
}
public Avatar CreateAvatarAndSetup(Transform root)
{
var avatar = CreateAvatar(root);
var avatar = HumanoidLoader.LoadHumanoidAvatar(root, ToHumanoidMap(root));
avatar.name = name;
if (root.TryGetComponent<Animator>(out var animator))
@@ -304,7 +269,7 @@ namespace UniHumanoid
modAvatarDesc(avatarDescription);
}
avatarDescription.SetHumanBones(map);
var avatar = avatarDescription.CreateAvatar(dst.transform);
var avatar = HumanoidLoader.LoadHumanoidAvatar(dst.transform, avatarDescription.ToHumanoidMap(dst.transform));
avatar.name = "created";
return avatar;
}
@@ -330,7 +295,7 @@ namespace UniHumanoid
var avatarDescription = UniHumanoid.AvatarDescription.Create();
avatarDescription.SetHumanBones(map);
var avatar = avatarDescription.CreateAvatar(src.transform);
var avatar = HumanoidLoader.LoadHumanoidAvatar(src.transform, avatarDescription.ToHumanoidMap(src.transform));
avatar.name = "created";
return avatar;
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UniGLTF.Utils;
using UnityEngine;
namespace UniHumanoid
@@ -9,7 +10,7 @@ namespace UniHumanoid
{
public static Avatar LoadHumanoidAvatar(Transform root, IEnumerable<(Transform, HumanBodyBones)> boneMap)
{
UniGLTF.Utils.ForceTransformUniqueName.Process(root);
ForceTransformUniqueName.Process(root);
var description = new HumanDescription
{

View File

@@ -111,7 +111,7 @@ namespace UniHumanoid
//
// avatar
//
Avatar = description.CreateAvatar(Root.transform);
Avatar = HumanoidLoader.LoadHumanoidAvatar(Root.transform, description.ToHumanoidMap(Root.transform));
Avatar.name = "Avatar";
AvatarDescription = description;
var animator = Root.AddComponent<Animator>();

View File

@@ -124,7 +124,7 @@ namespace UniHumanoid
{
throw new System.ArgumentException("no animator");
}
animator.avatar = description.CreateAvatar(root);
animator.avatar = HumanoidLoader.LoadHumanoidAvatar(root, description.ToHumanoidMap(root));
// create SkinnedMesh for bone visualize
var renderer = SkeletonMeshUtility.CreateRenderer(animator);

View File

@@ -259,7 +259,7 @@ namespace VRM
{
AvatarDescription = VRM.humanoid.ToDescription(Nodes);
AvatarDescription.name = "AvatarDescription";
HumanoidAvatar = AvatarDescription.CreateAvatar(Root.transform);
HumanoidAvatar = UniHumanoid.HumanoidLoader.LoadHumanoidAvatar(Root.transform, AvatarDescription.ToHumanoidMap(Root.transform));
if (!HumanoidAvatar.isValid || !HumanoidAvatar.isHuman)
{
throw new Exception("fail to create avatar");

View File

@@ -104,9 +104,9 @@ namespace UniVRM10
return default;
}
public Dictionary<HumanBodyBones, Transform> GetHumanMap()
public List<(Transform, HumanBodyBones)> GetHumanMap()
{
var humanMap = new Dictionary<HumanBodyBones, Transform>();
var humanMap = new List<(Transform, HumanBodyBones)>();
if (m_vrma is UniGLTF.Extensions.VRMC_vrm_animation.VRMC_vrm_animation animation && animation.Humanoid != null)
{
foreach (HumanBodyBones bone in UniGLTF.Utils.CachedEnum.GetValues<HumanBodyBones>())
@@ -114,7 +114,7 @@ namespace UniVRM10
var node = GetNodeIndex(animation.Humanoid, bone);
if (node.HasValue)
{
humanMap.Add(bone, Nodes[node.Value]);
humanMap.Add((Nodes[node.Value], bone));
}
}
}
@@ -259,11 +259,10 @@ namespace UniVRM10
var humanMap = GetHumanMap();
if (humanMap.Count > 0)
{
var description = AvatarDescription.Create(humanMap);
//
// avatar
//
var avatar = description.CreateAvatar(Root.transform);
var avatar = HumanoidLoader.LoadHumanoidAvatar(Root.transform, humanMap);
avatar.name = "Avatar";
// AvatarDescription = description;
var animator = Root.AddComponent<Animator>();