public void SaveAnimatorState(Animator animator, UMAData umaData)
            {
                umaData.FireAnimatorStateSavedEvent();

                int layerCount = animator.layerCount;

                stateHashes = new int[layerCount];
                stateTimes  = new float[layerCount];
                parameters  = new AnimatorControllerParameter[animator.parameterCount];
                layerWeights.Clear();

                for (int i = 0; i < layerCount; i++)
                {
                    var state = animator.GetCurrentAnimatorStateInfo(i);
                    stateHashes[i] = state.fullPathHash;
                    stateTimes[i]  = Mathf.Max(0, state.normalizedTime + Time.deltaTime / state.length);
                    layerWeights.Add(i, animator.GetLayerWeight(i));
                }

                Array.Copy(animator.parameters, parameters, animator.parameterCount);

                foreach (AnimatorControllerParameter param in parameters)
                {
                    switch (param.type)
                    {
                    case AnimatorControllerParameterType.Bool:
                        param.defaultBool = animator.GetBool(param.nameHash);
                        break;

                    case AnimatorControllerParameterType.Float:
                        param.defaultFloat = animator.GetFloat(param.nameHash);
                        break;

                    case AnimatorControllerParameterType.Int:
                        param.defaultInt = animator.GetInteger(param.nameHash);
                        break;
                    }
                }
            }
예제 #2
0
            public void SaveAnimatorState(Animator animator, UMAData umaData)
            {
                if (animator == null)
                {
                    wasCopied = false;
                    return;
                }
                umaData.FireAnimatorStateSavedEvent();

                if (animator.runtimeAnimatorController == null)
                {
                    return;
                }

                int layerCount = 0;

                if (animator.isInitialized)
                {
                    layerCount = animator.layerCount;
                }
                stateHashes = new int[layerCount];
                stateTimes  = new float[layerCount];
                if (animator.isInitialized)
                {
                    parameters = new AnimatorControllerParameter[animator.parameterCount];
                    Array.Copy(animator.parameters, parameters, animator.parameterCount);

                    foreach (AnimatorControllerParameter param in parameters)
                    {
                        switch (param.type)
                        {
                        case AnimatorControllerParameterType.Bool:
                            param.defaultBool = animator.GetBool(param.nameHash);
                            break;

                        case AnimatorControllerParameterType.Float:
                            param.defaultFloat = animator.GetFloat(param.nameHash);
                            break;

                        case AnimatorControllerParameterType.Int:
                            param.defaultInt = animator.GetInteger(param.nameHash);
                            break;
                        }
                    }
                }
                layerWeights.Clear();

                for (int i = 0; i < layerCount; i++)
                {
                    var state = animator.GetCurrentAnimatorStateInfo(i);
                    stateHashes[i] = state.fullPathHash;
#if UNITY_EDITOR
                    float time = state.normalizedTime;
                    if (!FreezeTime)
                    {
                        time += Time.deltaTime / state.length;
                    }
#else
                    float time = state.normalizedTime + Time.deltaTime / state.length;
#endif
                    stateTimes[i] = Mathf.Max(0, time);
                    layerWeights.Add(i, animator.GetLayerWeight(i));
                }

                wasCopied = true;
            }