Multiple objects follow the object in front

private float amplitudeY = 3.0f;
private float omegaZ = 5.0f;
private float omegaY = 1.0f;
private float timeI;
public EnemySpawn eSpawn;

	public int place;

	//keeps current position of objects
	public List<Vector3> posList = new List<Vector3>();

	public void Snaker()
	{
		Vector3 leader = eSpawn.eSnake [0].transform.position;

		posList.Add (new Vector3 (eSpawn.eSnake[0].transform.position.x,
		                          eSpawn.eSnake[0].transform.position.y,
		                          eSpawn.eSnake[0].transform.position.z));
		Vector3 v = posList [0];
		Vector3 toLeader = leader - transform.position;
		Quaternion wantDir = Quaternion.LookRotation(toLeader);

		timeI += Time.deltaTime;
		float z = omegaZ * timeI;
		float y = Mathf.Abs (amplitudeY * Mathf.Sin (omegaY * timeI));
		eSpawn.eSnake [place].transform.position = new Vector3 (0.0f, v.y - y, v.z - z);
		transform.rotation = Quaternion.RotateTowards(transform.rotation, wantDir, 360*Time.deltaTime);
		transform.position = leader - (toLeader.normalized * 1.5f);


	}

Currently thats what I have.

Unfortunately what happens is object 1 follows object 0 just fine, but objects 2-5 all stack onto object 1.

How can I add a space between each of the objects?

I believe you problem is your toLeader. For all your other variables, you appear to be determining relationships through your through an array, but your toLeader variable is set to the specific object that this script is attached to. my best guess is that the line needs to become

Vector3 toLeader = leader - eSpawn.eSnake [place].transform.position;

Why not just use built in unity hinges on each object with a spring on each?

I believe this is some kind of snake game?
Wouldn’t it be easier for you to keep track of how “long” your snake is, and then use that number to make the object follow the one just in front of it?
So object 1 follows object 0- object 2 follows object 1, and so on?

If this is not a snake game, you could still use the “numbers” to give each object some kind of offset so that they won’t stay on top of each other.

public List posList = new List();

	public void Snaker()
	{
		posList.Add (eSpawn.eSnake [0].transform.position);
		posList.Add (eSpawn.eSnake [1].transform.position);
		posList.Add (eSpawn.eSnake [2].transform.position);
		posList.Add (eSpawn.eSnake [3].transform.position);
		posList.Add (eSpawn.eSnake [4].transform.position);

		Vector3 v0 = posList [0];
		Vector3 v1 = posList [1];
		Vector3 v2 = posList [2];
		Vector3 v3 = posList [3];
		Vector3 v4 = posList [4];


		float amplitudeY = 3.0f;
		float omegaY = 1.0f;
		timeI += Time.deltaTime;
		float y = Mathf.Abs(amplitudeY * Mathf.Sin(omegaY * timeI));
		
		eSpawn.eSnake [0].transform.position = new Vector3 (0.0f, v0.y + y, v0.z -1.0f * timeI);
		eSpawn.eSnake [1].transform.position = new Vector3 (0.0f, v1.y + y, v1.z -1.0f * timeI);
		eSpawn.eSnake [2].transform.position = new Vector3 (0.0f, v2.y + y, v2.z -1.0f * timeI);
		eSpawn.eSnake [3].transform.position = new Vector3 (0.0f, v3.y + y, v3.z -1.0f * timeI);
		eSpawn.eSnake [4].transform.position = new Vector3 (0.0f, v4.y + y, v4.z -1.0f * timeI);
		

	}

It’s not the cleanest thing ever. But I basically did what @NasarethMekuri said to do. Only problem is they all move the exact same.