Вы должны хранить все ссылки на препятствия, когда вы порождаете их что-то вроде
private List<GameObject> obstacles = new List<GameObject>();
// ...
var obst = Instantiate(obstaclePrefab);
// do your translations and rotation etc
obstacles.Add(obst);
, чем вы могли бы дополнительно иметь словарь для хранения начальных относительных позиций, таких как
private Dictionary<GameObject, Vector3> obstacleOffsets = new Dictionary<GameObject, Vector3>();
// ...
obstacleOffsets.Add(obst, obst.transform.position - sphereTranform.position);
чем позже вы можете использовать это смещение для позиционирования препятствий
foreach (GameObject obstacle in obstacles)
{
var originalOffset = obstacleOffsets[obstacle];
obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}
Конечно, вы также можете использовать только Dictionary
like
foreach (var kvp in obstacleOffsets)
{
var obstacle = kvp.Key;
var originalOffset = kvp.Value;
obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}
Result (интересное сжатие GIF ^^)

Примечание
Не забывайте, что всякий раз, когда вы должны уничтожить препятствие, высначала удалите его из списка / словаря!
obstacles.Remove(obstacle);
obstacleOffsets.Remove(obstacle);