void LateUpdate() { if (stored) { return; } // If analysis done remove all animations if (currentAnimationIndex == animationNames.Length) { if (analyzer != null) { // Stop and remove animations from the character analyzer.RemoveAnimations(animation); // Update global information analyzer.UpdateGlobalInfo(); // Store analysis // writing an object to file ObjectSerializer os = new ObjectSerializer(); os.serializedObject = analyzer.analyzedAnimations; os.writeObjectToFile(fileName); stored = true; if (analyzer.log) { analyzer.ReadAnalysisFromFile(fileName); } } // End execution return; } //if (currentAnimation != null // && Mathf.Abs(currentAnimation.time) < currentActionTime //) // We compute the root displacement //rootMotion.ComputeRootMotion(); if (changed && currentAnimationName != null) { //currentAnimation.time = 0; //agent.animation.Sample(); //rootMotion.ComputeRootMotion(); AnotatedAnimation animInfo = analyzer.GetAnotatedAnimation(currentAnimationName); // analyze initial state analyzer.analyzeInitState(animInfo); currentSample = 1; } // If its the first animation or the current animation ended, if (currentAnimation == null || Mathf.Abs(currentAnimation.time) >= currentActionTime ) { if (currentAnimationName != null) { Debug.Log("Time difference = " + (currentAnimation.time - currentActionTime)); // We correct the pose to the one we really want to analyze //currentAnimation.time = currentActionTime; //agent.animation.Sample(); //rootMotion.ComputeRootMotion(); AnotatedAnimation endedAnimInfo = analyzer.GetAnotatedAnimation(currentAnimationName); // Analyze end state analyzer.analyzeState(endedAnimInfo, analyzer.samples - 1, currentAnimation.normalizedTime); // Analyze the movement analyzer.analyzeMovement(endedAnimInfo); // Update global values analyzer.updateGlobalInfo(endedAnimInfo); } // Get new animation currentAnimationIndex++; // If there is no more animations we stop if (currentAnimationIndex == animationNames.Length) { return; } string animationName = animationNames[currentAnimationIndex]; if (blending) { // We blend out the previous animation // if it exists and it is not the first one if (currentAnimation != null) { if (currentAnimationIndex > 0) { agent.animation.Blend(currentAnimation.name, 0.0f, currentBlendingTime); } else { agent.animation.Stop(); agent.animation.Sample(); } } } // We set up the speed of the new animation AnimationState newAnimationState = agent.animation[animationName]; newAnimationState.speed = 1.0f; // We set the animation at the beginning newAnimationState.time = 0; newAnimationState.enabled = true; // We save the new animation currentAnimation = newAnimationState; currentAnimationName = animationName; // We get the info of the new animation AnotatedAnimation animInfo = analyzer.GetAnotatedAnimation(animationName); // We compute the time of the action and the time of the blending float newActionTime = animInfo.time * animInfo.totalLength; float newBlendingTime = animInfo.totalLength * animInfo.footPlantLenght; if (animInfo.type != LocomotionMode.Walk) { newBlendingTime = 0.5f; } currentActionTime = newActionTime; if (previousBlendingTime < newBlendingTime) { currentBlendingTime = previousBlendingTime; } else { currentBlendingTime = newBlendingTime; } previousBlendingTime = newBlendingTime; if (blending) { //We play/blend in the new animation if it's not the first one if (currentAnimationIndex > 0) { agent.animation.Blend(currentAnimation.name, 1.0f, currentBlendingTime); } else { agent.animation.Play(currentAnimation.name); agent.animation.Sample(); } } else { agent.animation.Play(currentAnimation.name); } changed = true; currentSample = 0; } else { changed = false; if (currentAnimationName != null) { AnotatedAnimation animInfo = analyzer.GetAnotatedAnimation(currentAnimationName); float previousSampleTime = (currentSample - 1) * animInfo.time / (analyzer.samples - 1); previousSampleTime *= animInfo.totalLength; float timeBetweenSamples = animInfo.time / (analyzer.samples - 1); float timeDifference = Mathf.Abs(currentAnimation.time) - previousSampleTime; if (timeDifference >= timeBetweenSamples) { // We correct the pose to the one we really want to analyze //currentAnimation.time = currentSample*animInfo.time/(analyzer.samples-1); //agent.animation.Sample(); analyzer.analyzeState(animInfo, currentSample, currentAnimation.normalizedTime); currentSample++; } } } }