To change object Position Smoothly
hey Firends! i am working on a game in which i want my object to change its position verticaly after trigger. i have done this, but when it is triggered it jump suddnely. i want it to change its position smoothly using some time And Here is my Code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Target : MonoBehaviour {
// Use this for initialization
public Text text;
public int maxHits = 3;
public int CountScore=0;
public float moveAmount;
public Vector2 TargetPosition;
public Ball ball;
static float t = 0.0f;
void Start(){
TargetPosition = transform.position;
Debug.Log ("first position" + TargetPosition);
}
void OnTriggerEnter2D (Collider2D Collision) {
CountScore++;
Debug.Log (CountScore);
//Moving Target position According to hits
if (maxHits!=null) {
TargetPosition.y += moveAmount;
MoveTargetPosition ();
maxHits--;
}
}
//move target function
void MoveTargetPosition(){
Debug.Log ("my position" + TargetPosition);
transform.position = new Vector2(TargetPosition.x, this.TargetPosition.y);
}
}
Please help and thanx in Advance.
Answer by Backside2357 · Dec 29, 2017 at 12:15 PM
Maybe the Vector3.Lerp(vectorA, vectorB, t)
function is what you are looking for? The parameter t is a value between 0 and 1, where the Lerp function returns vectorA for t=0 and vectorB for t=1 and something inbetween (linear) for inbetween t values. The t value could then be computed using Time functions.
Well I would delete the $$anonymous$$oveTargetPosition function and ins$$anonymous$$d would set a bool value where the function was called:
do$$anonymous$$ove = true;
And also set the variable t to 0:
t = 0;
It would also be necessary to make a copy of the current position:
CurrentPosition = transform.position;
Then, in the standard $$anonymous$$onoBehaviour Update function you write something like this:
if( do$$anonymous$$ove )
{
t += Time.deltaTime;
if(t >= duration)
{
transform.position = TargetPosition;
do$$anonymous$$ove = false;
}
else
{
transform.position = Vector2.Lerp(CurrentPosition, TargetPosition, t / duration);
}
}
duration is a constant you need to define and set to the value you want.
Thanx For Your Time it Did'nt Worked. the object moves same like before. it jumps suddenly. i want to move the object smothly within a duration
That is strange. But I found the time to create a simple example script:
Add a cube to your scene
Create a C# script with the name Smooth$$anonymous$$ove
Replace the content of the script with the code posted below
Attach the script to the cube
In Play$$anonymous$$ode, click the "Do $$anonymous$$ove" checkbox and play with the "Duration" value
Understand how the script works and adapt it to your needs
Code (Smooth$$anonymous$$ove .cs):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Smooth$$anonymous$$ove : $$anonymous$$onoBehaviour {
public bool do$$anonymous$$ove = false;
public float duration = 2.0f;
private float t = 0;
private Vector3 originPosition;
private Vector3 targetPosition;
// Use this for initialization
void Start () {
originPosition = transform.position;
targetPosition = originPosition + new Vector3(10, 0, 0);
}
// Update is called once per frame
void Update () {
if (do$$anonymous$$ove)
{
t += Time.deltaTime;
if (t >= duration)
{
transform.position = targetPosition;
do$$anonymous$$ove = false;
}
else
{
transform.position = Vector3.Lerp(originPosition, targetPosition, t / duration);
}
}
else
{
t = 0;
transform.position = originPosition;
}
}
}
@Backside2357 Thanx For your time it hellped me. now the object is moving smoothly Thanx Again :)
Your answer
Follow this Question
Related Questions
How to All instantiated objects to change position if any object hits defined border 2 Answers
how do I use an Idle animation clip in a 2d blend tree? 0 Answers
Can't jump while running, and animation won't transition 0 Answers
Hello, help with animation between scenes 0 Answers
Transition Between Animations Delay 0 Answers