public void Save(Animator animator) { gameObjectTransform = new TransformPoseSave.SaveData(animator.gameObject.transform); currentAnimatorStateInfo = new AnimatorStateInfo[animator.layerCount]; nextAnimatorStateInfo = new AnimatorStateInfo[animator.layerCount]; for (int i = 0; i < animator.layerCount; i++) { currentAnimatorStateInfo[i] = animator.GetCurrentAnimatorStateInfo(i); nextAnimatorStateInfo[i] = animator.GetNextAnimatorStateInfo(i); } animatorParamaters = new SaveParamater[animator.parameterCount]; for (int i = 0; i < animator.parameterCount; i++) { var param = animator.parameters[i]; animatorParamaters[i] = new SaveParamater() { nameHash = param.nameHash, type = param.type, }; switch (param.type) { case AnimatorControllerParameterType.Float: animatorParamaters[i].value = animator.GetFloat(param.nameHash); break; case AnimatorControllerParameterType.Int: animatorParamaters[i].value = animator.GetInteger(param.nameHash); break; case AnimatorControllerParameterType.Bool: animatorParamaters[i].value = animator.GetBool(param.nameHash); break; case AnimatorControllerParameterType.Trigger: break; default: Assert.IsTrue(false); break; } } }
public void SetTransformStart() { gameObjectTransform.SetParent(sourceObject.transform.parent); ResetOriginal(); gameObjectTransform.SetPositionAndRotation(va.transformPoseSave.startPosition, va.transformPoseSave.startRotation); gameObjectTransform.localScale = va.transformPoseSave.startLocalScale; m_SetTransformRootSave = new TransformPoseSave.SaveData(gameObjectTransform); SetOffset(va.transformPoseSave.startLocalPosition, va.transformPoseSave.startLocalRotation); }
public void SetTransformOutside() { gameObjectTransform.SetParent(null); //ResetOriginal(); Waste gameObjectTransform.SetPositionAndRotation(new Vector3(10000f, 10000f, 10000f), Quaternion.identity); gameObjectTransform.localScale = Vector3.one; m_SetTransformRootSave = new TransformPoseSave.SaveData(gameObjectTransform); SetOffset(Vector3.zero, Quaternion.identity); }
public void SetTransformOrigin() { gameObjectTransform.SetParent(null); ResetOriginal(); gameObjectTransform.localPosition = Vector3.zero; gameObjectTransform.localRotation = Quaternion.identity; gameObjectTransform.localScale = Vector3.one; m_SetTransformRootSave = new TransformPoseSave.SaveData(gameObjectTransform); SetOffset(Vector3.zero, Quaternion.identity); }
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); }