Monday, June 1, 2015

Are prefabs the only way to dynamically build a world in Unity?



I'm trying to understand how to setup my Unity prefabs and scripts to dynamically spawn a series of "encounters", with each encounter containing several GameObjects.


For example, imagine spawning the next several portions of an infinite-runner level. One encounter is a ramp, the other encounter is a pit with some coins.


This is what I am currently doing:



  1. A global SceneManager script has a handle to an EncounterFactory prefab. When needed, the SceneManager will begin constructing the game world.

  2. The EncounterFactory prefab contains a script that has a method SpawnRandomEncounter. The EncounterFactory also contains handles to several other prefabs for the objects that can be found in an encounter.

  3. The SpawnRandomEncounter method uses the prefabs linked to EncounterFactory and builds the expected GameObjects.


So when building out a new "encounter", the SceneManager clones the EncounterFactory (which serves as the parent object for the full encounter), and then calls SpawnRandomEncounter to build out the child objects.


This seems suboptimal. First, I need to have myriad prefabs for each thing that could be spawned. It also requires a meta-prefab to EncounterFactory. That is, a prefab who just allows me to spawn other prefabs.



Is there a better way to dynamically build out a game world or level in Unity? Or is it prefabs upon prefabs upon prefabs?


For example, I'm aware that I can find an existing object by name. (e.g. find EncounterTemplate5 and clone that.) However, that requires that EncounterTemplate5 exist in the game world. (So it can be cloned.)



Answer



First off, do you know about having a Resources folder? Assets put in there can be loaded in code by name, instead of needing to reference them within the scene. Putting dynamically loaded assets in a folder called "Resources" makes dynamically loading assets a lot more flexible.


The assets that you load from Resources don't have to be prefabs, although you usually want them to be in order to already have their various components and whatnot already setup. However if making everything a prefab is onerous for some reason then you could load the obj mesh (or whatever) and then AddComponent


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...