- Home /
Getting the position of an object in an AnimationClip ?
Hello
I have a situation where I need to get the position of an object (a simple transform) inside an AnimationClip, is there a way to do that ?
Basically I create a helper transform along with my character animation in a 3d application like Blender and want to fetch the position at runtime. Now, I want to do this for all AnimationClip(s) in the controller as this object has a different position in each AnimationClip, so ideally at start, I would like to loop through all AnimationClip(s) and save the position of the object.
Btw I'm aware of StateMachineBehaviours, and that inside the OnEnterState I can get the Animator component and from there do a animator.transform.FindChild("MyObject"); but logically StateMachineBehaviors are only run when the state is being executed, so if I'm not executing that state I don't see a way to get the contents of the AnimationClip.
Thanks
Answer by bcv · Dec 13, 2016 at 02:23 AM
OK it took a while but for those wondering how I managed to solve this.
It's worth mentioning that my character uses Mecanim, and simply inside the character I do the following:
Animator myCharAnimator = GetComponent<Animator>();
foreach (AnimationClip clip in myCharAnimator.runtimeAnimatorController.animationClips)
{
clip.SampleAnimation(transform.gameObject, 0.1f);
Transform helperTransform = transform.FindChild("helperTr");
// Save transform
// Output
Debug.Log("Position of keyed helper transform is: "+helperTransform.position.toString("F4"));
}
For those wondering what's this for, in any 3d application I can create and key empty transforms (they are called EMPTYs in Blender for example) to allow them to be used for many purposes, for example if you have an animation where the character needs to interact with multiple other characters you just create those transforms where the non player characters need to be positioned and inside Unity you'll know the exact position that those other characters need to be relative from the player position, in order to play the animation exactly as in the 3d app.
Not sure if this is the best way to do it but it works for this case, if anyone has any other approaches let me know.
Cheers