- Home /
How to move a GameObject with an animation
I'd like to move my GameObject upstairs with an animation (just a moving animation, like it's smoothly moving up). However, I can't seem to figure out how this works. I've tried several methods, all of them are 'teleporting' (re-positioning) the GameObject. Here is my current code:
Some code may sound like bullshit, but it was all for testing purposes only
Vector2 startPosition = new Vector2(pMenu.transform.position.x, pMenu.transform.position.y);
Vector2 endPosition = new Vector2(pMenu.transform.position.x, 0.03f);
pMenu.rigidbody2D.velocity = new Vector2(pMenu.rigidbody2D.velocity.x, 0);
pMenu.transform.position = new Vector2(pMenu.transform.position.x, 0.03f);
pMenu.transform.position = Vector2.Lerp(startPosition, endPosition, 5000);
pMenu.transform.Translate(new Vector2(pMenu.rigidbody2D.velocity.x, 10));
pMenu.transform.Translate(new Vector2(0, 500) * Time.deltaTime);
How can I move the gameobject up, so it's like.. sliding up to the desired Y coordinate?
Answer by robertbu · Feb 09, 2014 at 05:53 PM
Animation usually refers to Unity's Animation system. What you are trying to do is move something over time either by transform or by Rigidbody2D. Here are a couple of lines of code to get you started. Note that each one needs to be called repeatedly in Update().
pMenu.transform.position = Vector3.Lerp(pMenu.transform.position, endPosition, speed * Time.deltaTime);
or:
pMenu.transform.position = Vector3.MoveTowards(pMenu.transform.position, endPosition, speed * Time.deltaTime);
You might also take a look at iTween or the MoveObject script in the Wiki.
Thanks, it works. However, how would I be able to detect if the object is on the correct Y-location? I tried an if-statement to check if the Y position of the object is in the Y-position I want it to be. But that doesn't work.
In the absence of your specific code and a description of your goals, I cannot say. Be careful comparing floating point values directly. Given the way things are moved and calculated often specific values are skipped. Frequently you want to do a range check using greater-than and/or less-then than rather than a direct equals.
Answer by mmeeks1 · Oct 26, 2017 at 11:03 AM
For the benefit of others who might stumble across this later, here is the solution that I came up with.
Create a new behavior/controller script to handle smooth motion and attach it to any/all objects that you want to translate smoothly around the scene. You can use the script I provide below. Once that is attached to the GameObject, simply call SetDestination on the object's GlideController and it will smoothly move to the specified location.
using UnityEngine;
public class GlideController : MonoBehaviour {
public float speed;
private Vector3 destination;
void Start () {
// Set the destination to be the object's position so it will not start off moving
SetDestination (gameObject.transform.position);
}
void Update () {
// If the object is not at the target destination
if (destination != gameObject.transform.position) {
// Move towards the destination each frame until the object reaches it
IncrementPosition ();
}
}
void IncrementPosition ()
{
// Calculate the next position
float delta = speed * Time.deltaTime;
Vector3 currentPosition = gameObject.transform.position;
Vector3 nextPosition = Vector3.MoveTowards (currentPosition, destination, delta);
// Move the object to the next position
gameObject.transform.position = nextPosition;
}
// Set the destination to cause the object to smoothly glide to the specified location
public void SetDestination (Vector3 value) {
destination = value;
}
}