- Home /
Assigning materials based on a Prefab
Hello!
I'm looking for some help with a very confusing problem. I have a top down game with an inventory and collection system. When a player hovers over an item, it turns either green or red based on whether it is within range to pick up or not. This works fine, but when I want to return the object to it's original colors, I run into some problems. Here is my code:
function OnMouseExit ()
{
var renderers = GetComponentsInChildren(Renderer);//get all the renderers in the object
var children = thisPrefab.gameObject.GetComponentsInChildren.<Renderer>();//get all the original renderers
var child : int = 0;
for(var rend : Renderer in renderers)
{
for(var i=0; i < rend.materials.length; i++)
{
rend.materials[i].color = children[child].renderer.materials[i].color;
print("child = " + child + " i= " + i);
}
child++;
}
}
My print function, just for debugging, returns exactly what I would expect. For each object it returns exactly the number of materials on that object, but nothing changes at all. When the scene loads, the object is it's own color, when I mouse over it changes to red/green, but when this fires nothing at all happens. I get no error message.
Anyone have any ideas that can point me in the right direction?
Thanks a lot!
Answer by bdiddy12 · Apr 27, 2012 at 05:40 PM
I got it to work using something similar to what Thomas suggested. I feel it is a bit sloppy, but it gets the job done and only needs to be applied to the parent object.
var savedColors : Color[,] = new Color[10,10];
function Start()
{
var renderers = this.gameObject.GetComponentsInChildren.<Renderer>();
for(var j=0; j < renderers.length; j++)
{
for(var i=0; i < renderers[j].materials.Length; i++)
{
savedColors[j,i] = renderers[j].materials[i].color;
}
}
}
function OnMouseExit ()
{
var renderers = this.gameObject.GetComponentsInChildren.<Renderer>();
for(var j=0; j < renderers.length; j++)
{
for(var i=0; i < renderers[j].materials.Length; i++)
{
renderers[j].materials[i].color = savedColors[j,i];
}
}
}
Answer by tingham · Apr 27, 2012 at 04:40 PM
What I'm doing for this is that I have a really simple behavior attached to anything inside of my prefab that includes a MeshRenderer - this component has a public List that matches per-index the materials that are set when the object Starts.
This allows me to revert every material (in position in the materials array) back to it's original shader. This works but performance is not great (draw calls shoot up.)
What I've been thinking about doing is implementing a RenderTexture from a camera matching the current camera, that renders only the item I'm interested in (as a clone) with the new materials applied; or "possibly" using the alpha from Camera A to modulate what the user sees under the cursor. Haven't really sorted all of that out yet.
Your answer
Follow this Question
Related Questions
How can I set the material on an instance after creating it? 1 Answer
Prefab loses its materials after running the game - Why? 1 Answer
How to remove not using dependencies? (in matetial, prefab) 1 Answer
Apply new complex fbx to saved prefab 0 Answers
When setting a local scale to an instantiated gameObject, it loses material. 0 Answers