Is there any difference in having objects stored in a scene versus instantiating them in Awake of the scene, or are both approaches doing effectively the same thing behind the scenes?
In my experience, Instantiate() is never faster than pre-loading objects, but the difference is negligible in typical use. Unless you’re loading in hundreds or thousands of objects, I wouldn’t worry about it.
Instantiate() causes a very small performance hit, in both time and memory; it’s only going to matter if you’re doing a lot of it. If you’re on mobile, it’ll matter a bit sooner, but it’s about the same deal.
If you’re worried about optimization:
- Find ways to pre-load more objects in the scene.
- Find ways to “pool” objects, so that they can be recycled. Instead of destroying them when you’re done, make them inactive and reset them when you need them again.
(When I make object pools, the important ones are still backed by Instantiate() in the event that I run out of objects.)
Sometimes, it’s the best tool for the job. Like kromenak mentioned in comments, it’s handy to load in prefabs that you’d like to see consistently in every scene: cameras, game managers, and the like.