- Home /
Swap tree prefabs at runtime
I'm trying to write a script that will switch tree prefabs on a terrain when you push a button (young trees become old trees). Trouble is, I'm having a hard time reaching the treetype prefabs in my terrain: I can't even get to the point of pulling out the names of the existing trees. I'm pretty new to coding, and I'm getting stumped. Help?
var TerrainTest : Terrain;
var testname : Array;
var treeObject : GameObject;
var treetypes1 : TreePrototype;
function Start () {
treetypes1.prefab = treeObject;
TerrainTest.terrainData.treePrototypes[0] = treetypes1;
Debug.Log(treetypes1);
}
So, I've figured how to get the name of the current prototype, but I still can't figure out how to change it.
var blah = Terrain.activeTerrain.terrainData.treePrototypes[0].prefab
Answer by Itinerant · Oct 10, 2012 at 04:55 PM
Alright, I've solved my problem, so now to report back for future searchers. Solution courtesy of this thread in the forums.
The trick is to declare a new array of type TreePrototype, use a Resource.Load to add in prefabs, and then swap it with the existing TreePrototype. If done in the editor, this is a persistent change. Ie, if you swap tree1 for tree2 while playing, when you go back into editor mode it'll still be tree2.
Here's my pared down code. Remember, prefabs should be placed in a 'Resources' folder:
var treeType : TreePrototype[];
function Start(){ treeType = Terrain.activeTerrain.terrainData.treePrototypes; }
function Update () {
if(Input.GetKeyDown("a")){
treeType[0].prefab = Resources.Load("PrefabName"); Terrain.activeTerrain.terrainData.treePrototypes = treeType; } }
Your answer
Follow this Question
Related Questions
Terrain Tree Prefab Orientation Prob 3 Answers
How do I get a speedtree color? 0 Answers
How do I resize a tree prefab 0 Answers
Getting treePrototype information from RayCasting collisions onto terrain? 2 Answers
The tree "Tree" couldn't be instanced because the prefab contains no valid mesh renderer. 1 Answer