# Make value change to anoter over time and back loop

Hello. How could I make a value to go from -1 to 1, then from 1 to -1 and back again. It should be a infinite loop. And every step (from -1 to 1 or from 1 to -1) should be happening over a given time? Thank you!

You can use Mathf.PingPong() or Mathf.Sin() in Update():

``````var val = Mathf.PingPong(Time.time * speed, 2.0) - 1.0;
``````

or:

``````var val = Mathf.Sin(time.time * speed);
``````

Mathf.Sin() will give a sinusoidal change between -1.0 and 1.0;

The way I do this is the following (taken from a Pac Man game I’m working on where the sprites cycle in a back-and-forth munching loop):

``````	// Set animation frame
const int NUM_FRAMES = 4; // In our Pac Man animation, we have 4 frames.
//We want the frames to go 0,1,2,3,2,1 and repeat.
const float ANIM_SPEED = 0.4f; // Modify this parameter to determine the speed at which the frames progress

int frame = ((int) (this.transform.x * ANIM_SPEED)) % NUM_FRAMES;

if (frame > NUM_FRAMES * 0.5)
frame = NUM_FRAMES - frame;

// "frame" will now cycle from 0 to 3 and back again in reverse according to the "x" of the transform.
``````

Edit: So in your case, you have 4 desired values. -1, 0, 1, 0, then repeat. For that, you can do:

``````	int counter = 0;

void Update() {
counter++; // I assume this is going up in some fashion
int ticktock = (counter % 4); // ticktock is now 0 to 3
if (ticktock > 2)
ticktock = 1;		// ticktock is now 0 to 2
ticktock--;			//ticktock is now -1 to 1
}
``````

Another way is to use an array to store the values you want to toggle through. This is perhaps one of the easier ways to understand:

``````	int counter = 0;

void Update() {
const int[] values = {-1, 0, 1, -1}
int ticktock = values[(counter++) % 4];
// ticktock is now at the desired value
}
``````

Wait stuff is different depending on are you using c# or unity script.

``````int a = 1;

for(;;){
//infinite loop
// if unity script use yield waitforseconds any function, if c#create new IEnumerator function, copy the for loop the
//re because only in that function you can use yield waiforsecobds

//start coroutine from start or whatever

a *= -1;
}
``````