Przerób spawnPoints na listę i zamiast erase używaj Remove.
Poza tym Random powinieneś brać od 0 do spawnPoints.Length (chyba, że celowo pomijasz pierwszy element).
Ja bym to zrobił po prostu tak (żeby nie kasować elementów tablicy spawnPoints):
using System.Collections.Generic;
// [...]
List<int> randomIndexes = new List<int>();
int idx = 0;
// generuj liste indeksow
for (int i = 0; i < spawnPoints.Length; i++) {
randomIndexes.Add(i);
}
idx = Random.Range(0, randomIndexes.Count); // indeks losowego indeksu z listy indeksow
A.transform.position = spawnPoints[randomIndexes[idx]].transform.position;
randomIndexes.Remove(randomIndexes[idx]); // usuwamy wylosowany indeks
// itd... :
idx = Random.Range(0, randomIndexes.Count);
B.transform.position = spawnPoints[randomIndexes[idx]].transform.position;
randomIndexes.Remove(randomIndexes[idx]);
idx = Random.Range(0, randomIndexes.Count);
C.transform.position = spawnPoints[randomIndexes[idx]].transform.position;
randomIndexes.Remove(randomIndexes[idx]);
idx = Random.Range(0, randomIndexes.Count);
D.transform.position = spawnPoints[randomIndexes[idx]].transform.position;
randomIndexes.Remove(randomIndexes[idx]);
Pisane z palca, może się nie kompilować. Oczywiście można to upiększyć (wpakować w jakąś metodę, żeby nie powtarzać w kółko tego samego kodu).