Home > database >  How to make an object move endlessly?
How to make an object move endlessly?

Time:12-16

I want to move an object from position A to position B on X axis endlessly. But it does move and comeback only once. How to make it continuosly? I've tried Vector3.Lerp or just creating new Vector3 but it only teleports.

`

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingTarget : MonoBehaviour
{
    [SerializeField] private Vector3 firstPosition = new Vector3(-14f, 2.5f, 17f);
    [SerializeField] private Vector3 secondPosition = new Vector3(14f, 2.5f, 17f);
    
   
    public float speed = 10f;
  

    void Start()
    {
       transform.position = firstPosition;
    }
    
    void Update()
    {

      

      
            transform.position = Vector3.MoveTowards(transform.position, secondPosition, Time.deltaTime * speed);
       
        if(transform.position == secondPosition)
        {
            secondPosition = firstPosition;
        }

       



    }
}

`

CodePudding user response:

As alternative you could also use Mathf.PingPong like e.g.

// By default afaik a full cycle takes 2 seconds so in order to normalize
// this to one second we will divide by this times 2 later
public float cycleDuration = 1;

private void Update ()
{
    transform.position = Vector3.Lerp(firstPosition, secondPosition, Mathf.PingPong(Time.time / (cycleDuration * 2f), 1f));
}

In case your object is spawned later in the game you might want to rather always start at the first position and do

private float timer;

private void Update ()
{
    transform.position = Vector3.Lerp(firstPosition, secondPosition, Mathf.PingPong(timer / (cycleDuration * 2f), 1f));

    timer  = Time.deltaTime;
}

CodePudding user response:

I don't use Unity, but since nobody else answered....

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingTarget : MonoBehaviour
{
    [SerializeField] private Vector3 firstPosition = new Vector3(-14f, 2.5f, 17f);
    [SerializeField] private Vector3 secondPosition = new Vector3(14f, 2.5f, 17f);
    private Vector3 target;

    public float speed = 10f;

    void Start()
    {
       transform.position = firstPosition;
       target = secondPosition;
    }
    
    void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * speed);
       
        if (transform.position == firstPosition)
        {
            target = secondPosition;
        }
        else if (transform.position == secondPosition)
        {
            target = firstPosition;
        }
    }
}
  • Related