- Home /
Randomizing tile textures
This is what I tried. Successfully generated a 10x10 grid of tiles. The tiles are coming out textureless, however. Help!!!
var Cliff : Material; var Dirt : Material; var Grass : Material; var Rock : Material; var Tile : Transform;
var aTextures : Array;
function Start() {
aTextures = new Array(Cliff, Dirt, Grass, Rock);
for (x=0;x<10;x++)
{
for (y=0;y<10;y++)
{
Instantiate(Tile, Vector3(x*10 ,y*10 , 0), Quaternion.Euler(90,0,0));
Tile.renderer.materials[1] = aTextures[Random.Range(0, aTextures.length)];
}
}
}
Answer by Eric5h5 · May 14, 2011 at 03:55 PM
A couple things; one, you're trying to change renderer.materials on the actual prefab, instead of the instance. Instead do this:
var thisTile = Instantiate(Tile...
thisTile.renderer...
Two, renderer.materials doesn't work that way. It's likely you meant renderer.material anyway, but in case you actually are using multiple materials per tile, then you need to do something like
var materialsArray = tile.renderer.materials;
materialsArray[1] = ...
tile.renderer.materials = materialsArray;
Ah, okay, thanks. The script reference was really vague on the material part.
Answer by JuggmasterZero · May 14, 2011 at 07:01 PM
Okay, I got it working by setting the first material instead of trying to do the second. Here's the code:
var matCliff : Material; var matDirt : Material; var matGrass : Material; var matRock : Material; var preTile : Transform; var aMaterials : Array;
function Start() { for (x=0;x<10;x++) { for (y=0;y<10;y++) { aMaterials = Array(matCliff, matDirt, matGrass, matRock); var thisTile = Instantiate(preTile, Vector3(x*10 ,y*10 , 0), Quaternion.Euler(90,0,0)); thisTile.renderer.material = aMaterials[Random.Range(0, aMaterials.length)]; } } }
After I got that working, I was messing around with the code to highlight tiles. Here's that code:
function OnMouseOver() { renderer.materials[1].color = Color(.5,.5,.5,.5); }
function OnMouseExit() { renderer.materials[1].color = Color(.5,.5,.5,0); }
Why does this code work and trying to assign a material this way does not?
That's because renderer.materials[] returns a copy of the materials, and you are just changing the copy, not the materials themselves.
https://docs.unity3d.com/ScriptReference/Renderer-materials.html
Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Terrain Generation 1 Answer
How to create destructible tile based 2D terrain like 'Broforce' does ? 2 Answers
Terrain with lots of objects 1 Answer
Connecting tiled terrains 2 Answers