Animation transform lock
Hi all,
I'm trying to freeze the Y position of a prefab instantiated into a scene while the Default non-looped animation plays, then when the animation finishes I would like the Y position to be unfrozen.
So far I have the below code which freezes the Y position of the prefab when it is instantiated, and it plays its Default animation once as intended from the Animator controller.
My problem is I have no idea how to unfreeze the Y position when the animation is finished, as I'm unable to figure out what code to use to check when the animation is playing and when its finished. I'm using an Animator Controller, and I did some searching already that used code from the Animation component, but I'm not using this, and when I tried to add it, it started complaining about setting animation clips to Legacy. I'm a bit lost now and am giving up on searching for myself.
Current code:
using UnityEngine;
using System.Collections;
public class PoopAnimator : MonoBehaviour {
Animation anim;
// Use this for initialization
void Start () {
anim = GetComponent<Animation>();
}
// Update is called once per frame
void Update()
{
gameObject.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezePosition;
}
}
Please help :)
Doing GetComponent() every frame is a bad habbit. Get rid of it. ;)
Ins$$anonymous$$d store a reference to a component and use GetComponent() in Start() to get it.
Answer by incorrect · Apr 19, 2016 at 08:30 PM
You can add Animation Events into your animation: one at the start to switch on your script, one at the end to switch it off.
I knew nothing about Animation Events before your answer, I looked them up and it works perfectly and oh so simply. Thanks!
Answer by Phosphorus2500 · Apr 20, 2016 at 07:18 PM
For anyone in the future just learning Unity like I am and needs to know this, the following is how I got around the issue: Animation Events.
Firstly, I created a new script and attached it to the object in question. The script is as follows:
using UnityEngine;
using System.Collections;
public class PoopAnimator : MonoBehaviour {
Rigidbody2D rigBod;
// Use this for initialization
void Start ()
{
rigBod = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
}
void FreezePoop() /*Function used in Animation Event where all constraints for the Rigidbody2D are frozen.*/
{
rigBod.constraints = RigidbodyConstraints2D.FreezePosition;
}
void UnfreezePoop() /*Function used in Animation Event where all constraints for the Rigidbody2D are unfrozen.*/
{
rigBod.constraints = RigidbodyConstraints2D.None;
}
}
Then, for the animation in question where I wanted the object's Y position frozen, I added two Animation Events. One at the beginning of the animation, and one at the end. I assigned the Freeze function to the starting Event, and the Unfreeze function to the finishing event. Hey-presto!
Your answer
![](https://koobas.hobune.stream/wayback/20220612075200im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Animation clip not playing but still affecting components of other clips 0 Answers
Animator doesn't change animation in Update() function 0 Answers
Animator in child receives float from parent but animation doesn't change when condition is met. 1 Answer
Animating physics problem 1 Answer
MobController 1 Answer