Пример #1
0
 public void ResetTranformRoot()
 {
     if (m_SetTransformRootSave != null)
     {
         m_SetTransformRootSave.LoadLocal(gameObjectTransform);
     }
 }
Пример #2
0
 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);
         }
     }
 }
Пример #3
0
        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
     }
 }