using System.Collections.Generic; using UnityEngine; using UnityEngine.Animations.Rigging; namespace UnityEditor.Animations.Rigging { internal static class AnimationRiggingEditorUtils { public static void RigSetup(Transform transform) { var rigBuilder = transform.GetComponent(); if (rigBuilder == null) rigBuilder = Undo.AddComponent(transform.gameObject); else Undo.RecordObject(rigBuilder, "Rig Builder Component Added."); var name = "Rig"; var cnt = 1; while (rigBuilder.transform.Find(string.Format("{0} {1}", name, cnt)) != null) { cnt++; } name = string.Format("{0} {1}", name, cnt); var rigGameObject = new GameObject(name); Undo.RegisterCreatedObjectUndo(rigGameObject, name); rigGameObject.transform.SetParent(rigBuilder.transform); var rig = Undo.AddComponent(rigGameObject); rigBuilder.layers.Add(new RigLayer(rig)); if (PrefabUtility.IsPartOfPrefabInstance(rigBuilder)) EditorUtility.SetDirty(rigBuilder); } public static void BoneRendererSetup(Transform transform) { var boneRenderer = transform.GetComponent(); if (boneRenderer == null) boneRenderer = Undo.AddComponent(transform.gameObject); else Undo.RecordObject(boneRenderer, "Bone renderer setup."); var animator = transform.GetComponent(); var renderers = transform.GetComponentsInChildren(); var bones = new List(); if (animator != null && renderers != null && renderers.Length > 0) { for (int i = 0; i < renderers.Length; ++i) { var renderer = renderers[i]; for (int j = 0; j < renderer.bones.Length; ++j) { var bone = renderer.bones[j]; if (!bones.Contains(bone)) { bones.Add(bone); for (int k = 0; k < bone.childCount; k++) { if (!bones.Contains(bone.GetChild(k))) bones.Add(bone.GetChild(k)); } } } } } else { bones.AddRange(transform.GetComponentsInChildren()); } boneRenderer.transforms = bones.ToArray(); if (PrefabUtility.IsPartOfPrefabInstance(boneRenderer)) EditorUtility.SetDirty(boneRenderer); } public static void RestoreBindPose(Transform transform) { var animator = transform.GetComponentInParent(); var root = (animator) ? animator.transform : transform; var renderers = root.GetComponentsInChildren(); if (renderers.Length == 0) { Debug.LogError( string.Format( "Could not restore bind pose because no SkinnedMeshRenderers " + "were found on {0} or any of its children.", root.name)); return; } Undo.RegisterFullObjectHierarchyUndo(root.gameObject, "Restore bind pose"); var bones = new Dictionary(); foreach (var renderer in renderers) { for (int i = 0; i < renderer.bones.Length; ++i) { if (!bones.ContainsKey(renderer.bones[i])) bones.Add(renderer.bones[i], renderer.sharedMesh.bindposes[i]); } } var transforms = transform.GetComponentsInChildren(); var restoredPose = false; foreach (var t in transforms) { if (!bones.ContainsKey(t)) continue; // The root bone is the only bone in the skeleton // hierarchy that does not have a parent bone. var isRootBone = !bones.ContainsKey(t.parent); var matrix = bones[t]; var wMatrix = matrix.inverse; if (!isRootBone) { if (t.parent) matrix *= bones[t.parent].inverse; matrix = matrix.inverse; t.localScale = new Vector3( matrix.GetColumn(0).magnitude, matrix.GetColumn(1).magnitude, matrix.GetColumn(2).magnitude ); t.localPosition = matrix.MultiplyPoint(Vector3.zero); } t.rotation = wMatrix.rotation; restoredPose = true; } if (!restoredPose) { Debug.LogWarning( string.Format( "No valid bindpose(s) have been found for the selected transform: {0}.", transform.name)); } } } }