- Home /
Question by
DarksDaemon · Feb 12, 2013 at 03:00 AM ·
prefabrandommaterials
How would I randomize the materials of an object using this script.
using UnityEngine;
using System.Collections.Generic;
public class SkylineManager1 : MonoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 minSize, maxSize;
private Vector3 nextPosition;
private Queue<Transform> objectQueue;
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++){
objectQueue.Enqueue((Transform)Instantiate
(prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
}
enabled = false;
}
void Update () {
if(objectQueue.Peek().localPosition.x + recycleOffset < Runner1.distanceTraveled){
Recycle();
}
}
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
nextPosition.x += scale.x;
objectQueue.Enqueue(o);
}
private void GameStart () {
nextPosition = transform.localPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
enabled = true;
}
private void GameOver () {
enabled = false;
}
}
Trying to work out how to randomize the materials of each object that gets spawned, can't work out how.
Comment
Best Answer
Answer by PAEvenson · Feb 12, 2013 at 03:47 AM
Try this. I added a List of materials you will need to add to in the inspector. Enjoy.
using UnityEngine; using System.Collections.Generic;
public class SkylineManager1 : MonoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 minSize, maxSize;
public List<Material> randomMaterials; //ADD THIS - and assign some materials in the inspector
private Vector3 nextPosition;
private Queue<Transform> objectQueue;
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++){
objectQueue.Enqueue((Transform)Instantiate
(prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
}
enabled = false;
}
void Update () {
if(objectQueue.Peek().localPosition.x + recycleOffset < Runner1.distanceTraveled){
Recycle();
}
}
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
nextPosition.x += scale.x;
//Random Material TIME!!!!
if(randomMaterials != null && randomMaterials.Count > 0)
o.gameObject.renderer.material = randomMaterials[Random.Range(0, randomMaterials.Count)];
objectQueue.Enqueue(o);
}
private void GameStart () {
nextPosition = transform.localPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
enabled = true;
}
private void GameOver () {
enabled = false;
}
}
Awesome, thanks so much, been banging my head against the wall trying different methods to get this to work.
Your answer
Follow this Question
Related Questions
Choose a random material for particle effect 1 Answer
Random.value sometimes doesn't instantiate my prefab(pic included) 1 Answer
instantiating vertically 2 Answers
Prefabs losing Material connections after re-opening scenes. Bug? 3 Answers
whats the best way to randomize prefab faces and its facial expressions? 0 Answers