Your main error is, you do not iterate over all stored objects. objCount has the total amount stored which is not really helpful for loading the data.
Here is a small example how you could improve your LoadData. Obj is not really helpful as a description. And PlayerPrefs.getInt has an overload where the second parameter is the default value that you get when the key does not exists.
enum Spawnable {Seed, Sprout, Flower, Tree}
public void Start() {
PlayerPrefs.SetInt("Item_" + Spawnable.Seed, 3);
PlayerPrefs.SetInt("Item_" + Spawnable.Sprout, 1);
PlayerPrefs.SetInt("Item_" + Spawnable.Tree, 2);
LoadData();
}
void LoadData() {
Spawnable highestTier = 0;
int totalSpawnCount = 0;
foreach (Spawnable toSpawn in Enum.GetValues(typeof(Spawnable)).Cast<Spawnable>()) {
int spawnAmount = PlayerPrefs.GetInt("Item_" + toSpawn, 0);
highestTier = spawnAmount > 0 ? toSpawn : highestTier;
for (int amount = 1; amount <= spawnAmount; amount++) {
Debug.Log(toSpawn);
totalSpawnCount++;
}
}
Debug.LogFormat("Highest Tier is {0}", highestTier);
Debug.LogFormat("Total amount of spawned items is: {0}", totalSpawnCount);
}
The improvement is, all your objects are in order in a descriptive list and your evolve function might benefit from it as well.
The initial data is set as example in Start but it is missing the Flower to demonstrate how missing values are handled. The console is telling you how many objects are spawned from each type, you can just switch it to your own instantiate logic.