void OnEnable() { ik = (InverseKinematics)target; }
// Restore a saved pose for the Skeleton public void RestorePose(Pose pose) { var bones = gameObject.GetComponentsInChildren <Bone>(); /// WILL BE DEPRECIATED IN FUTURE RELEASE AS ControlPoint IS NO LONGER SUPPORTED /// var cps = gameObject.GetComponentsInChildren <ControlPoint>(); var poseSkin2Ds = gameObject.GetComponentsInChildren <Skin2D>(); #if UNITY_EDITOR Undo.RegisterCompleteObjectUndo(bones, "Assign Pose"); Undo.RegisterCompleteObjectUndo(cps, "Assign Pose"); Undo.RegisterCompleteObjectUndo(poseSkin2Ds, "Assign Pose"); #endif if (bones.Length > 0) { for (int i = 0; i < pose.rotations.Length; i++) { bool hasRot = false; for (int b = 0; b < bones.Length; b++) { if (bones[b].name == pose.rotations[i].name) { #if UNITY_EDITOR Undo.RecordObject(bones[b].transform, "Assign Pose"); #endif // Set the bone rotation to the pose rotation bones[b].transform.localRotation = pose.rotations[i].rotation; #if UNITY_EDITOR EditorUtility.SetDirty(bones[b].transform); #endif hasRot = true; } } if (!hasRot) { if (verboseLogs) { Debug.Log("This skeleton has no bone '" + pose.rotations[i].name + "' enabled"); } } } for (int j = 0; j < pose.positions.Length; j++) { bool hasPos = false; for (int o = 0; o < bones.Length; o++) { if (bones[o].name == pose.positions[j].name) { #if UNITY_EDITOR Undo.RecordObject(bones[o].transform, "Assign Pose"); #endif // Set the bone position to the pose position bones[o].transform.localPosition = pose.positions[j].position; #if UNITY_EDITOR EditorUtility.SetDirty(bones[o].transform); #endif hasPos = true; } } if (!hasPos) { if (verboseLogs) { Debug.Log("This skeleton has no bone '" + pose.positions[j].name + "' enabled"); } } } for (int k = 0; k < pose.targets.Length; k++) { bool hasTarget = false; for (int n = 0; n < bones.Length; n++) { if (bones[n].name == pose.targets[k].name) { InverseKinematics ik = bones[n].GetComponent <InverseKinematics>(); if (ik != null) { #if UNITY_EDITOR Undo.RecordObject(ik.target, "Assign Pose"); #endif // Set IK position to the pose IK target position ik.target.transform.localPosition = pose.targets[k].position; #if UNITY_EDITOR EditorUtility.SetDirty(ik.target.transform); #endif } else { if (verboseLogs) { Debug.Log("This skeleton has no ik for bone '" + bones[n].name + "' enabled"); } } hasTarget = true; } } if (!hasTarget) { if (verboseLogs) { Debug.Log("This skeleton has no bone '" + pose.targets[k].name + "' enabled"); } } } if (pose.sortOrders.Length > 0) { for (int so = 0; so < pose.sortOrders.Length; so++) { bool hasSortingOrder = false; for (int p = 0; p < bones.Length; p++) { List <Renderer> rens = new List <Renderer>(); for (int c = 0; c < bones[p].transform.childCount; c++) { Renderer ren = bones[p].transform.GetChild(c).GetComponent <Renderer>(); if (ren != null) { rens.Add(ren); } } if (rens.Count > 0) { for (int r = 0; r < rens.Count; r++) { string pathToRenderer = rens[r].name; Transform nextParent = rens[r].transform.parent; while (nextParent != bones[p].transform) { pathToRenderer = nextParent.name + "/" + name; nextParent = nextParent.parent; } if (bones[p].name + "/" + pathToRenderer == pose.sortOrders[so].name) { #if UNITY_EDITOR Undo.RecordObject(rens[r], "Assign Pose"); #endif rens[r].sortingOrder = pose.sortOrders[so].sortingOrder; #if UNITY_EDITOR EditorUtility.SetDirty(rens[r]); #endif hasSortingOrder = true; } } } else { if (verboseLogs) { Debug.Log("There are no Renderers in this Bone: " + name + "/" + bones[p].name + " enabled"); } } } if (!hasSortingOrder) { if (verboseLogs) { Debug.Log("There is no sorting order '" + pose.sortOrders[so].name + "' enabled"); } } } } else { Debug.Log("There are no sorting orders for this Pose."); } } if (pose.controlPoints.Length > 0) { for (int l = 0; l < pose.controlPoints.Length; l++) { bool hasControlPoint = false; /// WILL BE DEPRECIATED IN FUTURE RELEASE AS CONTROL POINT IS NO LONGER SUPPORTED /// if (cps.Length > 0) { for (int c = 0; c < cps.Length; c++) { if (cps[c].name == pose.controlPoints[l].name) { #if UNITY_EDITOR Undo.RecordObject(cps[c].transform, "Assign Pose"); #endif // Set the control point transform position to the control point position cps[c].transform.localPosition = pose.controlPoints[l].position; #if UNITY_EDITOR EditorUtility.SetDirty(cps[c].transform); #endif hasControlPoint = true; } } } // Move control points in Skin2D component if (poseSkin2Ds.Length > 0) { for (int s = 0; s < poseSkin2Ds.Length; s++) { if (poseSkin2Ds[s].points != null && poseSkin2Ds[s].controlPoints != null && poseSkin2Ds[s].controlPoints.Length > 0 && pose.controlPoints[l].name.StartsWith(poseSkin2Ds[s].name + " Control Point")) { #if UNITY_EDITOR Undo.RecordObject(poseSkin2Ds[s], "Assign Pose"); Undo.RecordObject(poseSkin2Ds[s].points, "Assign Pose"); #endif // Get control point index by name in pose int index = GetControlPointIndex(pose.controlPoints[l].name); poseSkin2Ds[s].controlPoints[index].position = pose.controlPoints[l].position; poseSkin2Ds[s].points.SetPoint(poseSkin2Ds[s].controlPoints[index]); #if UNITY_EDITOR EditorUtility.SetDirty(poseSkin2Ds[s]); EditorUtility.SetDirty(poseSkin2Ds[s].points); #endif hasControlPoint = true; // Debug.Log("Found " + pose.controlPoints[l].name + " set to " + index + poseSkin2Ds[s].points.GetPoint(poseSkin2Ds[s].controlPoints[index])); } } } if (!hasControlPoint) { if (verboseLogs) { Debug.Log("There is no control point '" + pose.controlPoints[l].name + "'" + " enabled."); } } } } }