public void ResetTranformRoot() { if (m_SetTransformRootSave != null) { m_SetTransformRootSave.LoadLocal(gameObjectTransform); } }
public void Load(Animator animator) { if (!animator.isInitialized) { animator.Rebind(); } if (currentAnimatorStateInfo != null && currentAnimatorStateInfo.Length == animator.layerCount && nextAnimatorStateInfo != null && nextAnimatorStateInfo.Length == animator.layerCount) { bool changed = false; for (int i = 0; i < animator.layerCount; i++) { var info = animator.GetCurrentAnimatorStateInfo(i); if (info.fullPathHash != currentAnimatorStateInfo[i].fullPathHash || info.shortNameHash != currentAnimatorStateInfo[i].shortNameHash || info.normalizedTime != currentAnimatorStateInfo[i].normalizedTime || info.length != currentAnimatorStateInfo[i].length) { changed = true; break; } info = animator.GetNextAnimatorStateInfo(i); if (info.fullPathHash != nextAnimatorStateInfo[i].fullPathHash || info.shortNameHash != nextAnimatorStateInfo[i].shortNameHash || info.normalizedTime != nextAnimatorStateInfo[i].normalizedTime || info.length != nextAnimatorStateInfo[i].length) { changed = true; break; } } if (changed) { for (int i = 0; i < animator.layerCount; i++) { animator.Play(currentAnimatorStateInfo[i].fullPathHash, i, currentAnimatorStateInfo[i].normalizedTime); } animator.Update(0f); for (int i = 0; i < animator.layerCount; i++) { if (nextAnimatorStateInfo[i].fullPathHash != 0) { animator.CrossFade(nextAnimatorStateInfo[i].fullPathHash, 1f - currentAnimatorStateInfo[i].normalizedTime, i, nextAnimatorStateInfo[i].normalizedTime); } } animator.Update(0f); gameObjectTransform.LoadLocal(animator.gameObject.transform); } } }
private void ToolsTemplatePose() { var transforms = EditorCommon.GetHierarchyTransform(activeRootObject.transform); Undo.RecordObjects(transforms.ToArray(), "Template Pose"); var animator = activeRootObject.GetComponent <Animator>(); if (animator != null && !animator.isInitialized) { animator.Rebind(); } var save = new TransformPoseSave.SaveData(activeRootObject.transform); string[] paths = new string[transforms.Count]; for (int i = 0; i < transforms.Count; i++) { paths[i] = AnimationUtility.CalculateTransformPath(transforms[i], activeRootObject.transform); } #region Human if (animator != null && animator.isHuman) { var uAnimator = new UAnimator(); var humanPoseHandler = new HumanPoseHandler(animator.avatar, uAnimator.GetAvatarRoot(animator)); var humanPose = new HumanPose(); humanPoseHandler.GetHumanPose(ref humanPose); { var musclePropertyName = new MusclePropertyName(); if (toolPoseTemplate.haveRootT) { humanPose.bodyPosition = toolPoseTemplate.rootT; } if (toolPoseTemplate.haveRootQ) { humanPose.bodyRotation = toolPoseTemplate.rootQ; } if (toolPoseTemplate.musclePropertyNames != null && toolPoseTemplate.muscleValues != null) { Assert.IsTrue(toolPoseTemplate.musclePropertyNames.Length == toolPoseTemplate.muscleValues.Length); for (int i = 0; i < toolPoseTemplate.musclePropertyNames.Length; i++) { var muscleIndex = EditorCommon.ArrayIndexOf(musclePropertyName.PropertyNames, toolPoseTemplate.musclePropertyNames[i]); if (muscleIndex < 0) { continue; } humanPose.muscles[muscleIndex] = toolPoseTemplate.muscleValues[i]; } } if (toolPoseTemplate.tdofIndices != null && toolPoseTemplate.tdofValues != null) { //not support } } humanPoseHandler.SetHumanPose(ref humanPose); } #endregion #region Generic if (toolPoseTemplate.transformPaths != null && toolPoseTemplate.transformPaths != null) { Assert.IsTrue(toolPoseTemplate.transformPaths.Length == toolPoseTemplate.transformValues.Length); for (int i = 0; i < toolPoseTemplate.transformPaths.Length; i++) { var index = EditorCommon.ArrayIndexOf(paths, toolPoseTemplate.transformPaths[i]); if (index < 0) { continue; } transforms[index].localPosition = toolPoseTemplate.transformValues[i].position; transforms[index].localRotation = toolPoseTemplate.transformValues[i].rotation; transforms[index].localScale = toolPoseTemplate.transformValues[i].scale; } } #endregion #region BlendShape if (toolPoseTemplate.blendShapePaths != null && toolPoseTemplate.blendShapeValues != null) { foreach (var renderer in activeRootObject.GetComponentsInChildren <SkinnedMeshRenderer>(true)) { if (renderer == null || renderer.sharedMesh == null || renderer.sharedMesh.blendShapeCount <= 0) { continue; } Undo.RecordObject(renderer, "Template Pose"); var path = AnimationUtility.CalculateTransformPath(renderer.transform, activeRootObject.transform); var index = EditorCommon.ArrayIndexOf(toolPoseTemplate.blendShapePaths, path); if (index < 0) { continue; } var names = new string[renderer.sharedMesh.blendShapeCount]; for (int i = 0; i < renderer.sharedMesh.blendShapeCount; i++) { names[i] = renderer.sharedMesh.GetBlendShapeName(i); } for (int i = 0; i < toolPoseTemplate.blendShapeValues[index].names.Length; i++) { var nameindex = EditorCommon.ArrayIndexOf(names, toolPoseTemplate.blendShapeValues[index].names[i]); if (nameindex < 0) { continue; } renderer.SetBlendShapeWeight(nameindex, toolPoseTemplate.blendShapeValues[index].weights[i]); } } } #endregion save.LoadLocal(activeRootObject.transform); }
public void Load(Animator animator) { if (!animator.isInitialized) { animator.Rebind(); } if (currentAnimatorStateInfo != null && currentAnimatorStateInfo.Length == animator.layerCount && nextAnimatorStateInfo != null && nextAnimatorStateInfo.Length == animator.layerCount) { bool changed = false; for (int i = 0; i < animator.layerCount; i++) { var info = animator.GetCurrentAnimatorStateInfo(i); if (info.fullPathHash != currentAnimatorStateInfo[i].fullPathHash || info.shortNameHash != currentAnimatorStateInfo[i].shortNameHash || info.normalizedTime != currentAnimatorStateInfo[i].normalizedTime || info.length != currentAnimatorStateInfo[i].length) { changed = true; break; } info = animator.GetNextAnimatorStateInfo(i); if (info.fullPathHash != nextAnimatorStateInfo[i].fullPathHash || info.shortNameHash != nextAnimatorStateInfo[i].shortNameHash || info.normalizedTime != nextAnimatorStateInfo[i].normalizedTime || info.length != nextAnimatorStateInfo[i].length) { changed = true; break; } } if (changed) { for (int i = 0; i < animator.layerCount; i++) { animator.Play(currentAnimatorStateInfo[i].fullPathHash, i, currentAnimatorStateInfo[i].normalizedTime); } animator.Update(0f); for (int i = 0; i < animator.layerCount; i++) { if (nextAnimatorStateInfo[i].fullPathHash != 0) { animator.CrossFade(nextAnimatorStateInfo[i].fullPathHash, 1f - currentAnimatorStateInfo[i].normalizedTime, i, nextAnimatorStateInfo[i].normalizedTime); } } } animator.Update(0f); gameObjectTransform.LoadLocal(animator.gameObject.transform); #region RendererForceUpdate if (animator.gameObject != null) //Is there a bug that will not be updated while pausing? Therefore, it forcibly updates it. { foreach (var renderer in animator.gameObject.GetComponentsInChildren <Renderer>(true)) { if (renderer == null || !renderer.gameObject.activeInHierarchy || !renderer.enabled) { continue; } renderer.enabled = !renderer.enabled; renderer.enabled = !renderer.enabled; } } #endregion } }