Well, for starters:
- A prefab is a copy of an instance, therefore, it is cheaper than a GameObject created at runtime.
- Setting aside that in your case both methods represent the same for you in editing. In general it is better to have a prefab asset that can be recycled over and over again on scenes, and update everyone when you have to modify it.
For loading stage, you could have those spells as persistent data, and just load them once, say on the splash screen. For that, you would need a data structure, such as an Object Pool, where you can recycle your spells everytime you want to. Example:
public astract class Spell : MonoBehaviour
{
void OnEnable()
{
Cast();
}
void Awake()
{
DontDestroyOnLoad(gameObject); // With this, you keep it persistent and it gets on a scene called DontDestroyOnLoad.
}
public abstract void Cast();
}
public class Fire : Spell
{
public override void Cast()
{
Debug.Log("Casting Fire...");
}
}
public class Ice : Spell
{
public override void Cast()
{
Debug.Log("Casting Ice...");
}
}
So, instead of destroying spells at runtime, just deactivate their GameObjects, so you don't have memory leaks during object's instantiation and destruction.
If you are interested to know how an Object Pool would me made for this, let me know so I update my answer, or check Sebastian Lague's Video about it, just make it also persistent for all scenes.
Hope it helps.