/// <summary> /// 回転とスケールを除去したヒエラルキーのコピーを作成する(MeshをBakeする) /// </summary> /// <param name="go">対象のヒエラルキーのルート</param> /// <param name="bakeCurrentBlendShape">BlendShapeを0クリアするか否か。false の場合 BlendShape の現状を Bake する</param> /// <param name="createAvatar">Avatarを作る関数</param> /// <returns></returns> public static (GameObject, Dictionary <Transform, Transform>) Execute(GameObject go, CreateAvatarFunc createAvatar) { // // 正規化されたヒエラルキーを作る // var(normalized, boneMap) = NormalizeHierarchy(go, createAvatar); // // 各メッシュから回転・スケールを取り除いてBinding行列を再計算する // foreach (var src in go.transform.Traverse()) { Transform dst; if (!boneMap.TryGetValue(src, out dst)) { continue; } NormalizeSkinnedMesh(src, dst, boneMap); NormalizeNoneSkinnedMesh(src, dst); } return(normalized, boneMap); }
static (GameObject, Dictionary <Transform, Transform>) NormalizeHierarchy(GameObject go, CreateAvatarFunc createAvatar) { var boneMap = new Dictionary <Transform, Transform>(); // // 回転・スケールの無いヒエラルキーをコピーする // var normalized = new GameObject(go.name + "(normalized)"); normalized.transform.position = go.transform.position; CopyAndBuild(go.transform, normalized.transform, boneMap); // // 新しいヒエラルキーからAvatarを作る // { var animator = normalized.AddComponent <Animator>(); var avatar = createAvatar(go, normalized, boneMap); avatar.name = go.name + ".normalized"; animator.avatar = avatar; } return(normalized, boneMap); }