- Home /
 
WHy cant I create the GetComponentsInChildren(Renderer) array?
I get the following error at this line: InvalidCastException: Cannot cast from source type to destination type. I'm really not sure why, as the code emulates the documentation perfectly. Is theresomething unique about renderer types?
 var objectRenderers : Renderer[];
 objectRenderers=downloadedAssetBundle.GetComponentsInChildren(Renderer);
 
               Note: downloadedAssetBundle is an instantiated mainAsset (GameObject) from an asset bundle.
Answer by luizgpa · Feb 09, 2012 at 06:59 PM
This is why I hate UnityScript. GetComponentsInChildren return type is Component[], and objectRenderers is Renderer[]. The compiler should be smart and try to do a cast automatically or at least show a compile-time error stating that the types don't match. But no, it accepts your code and crash at runtime...
A manual cast to Renderer[] should work:
 var objectRenderers : Renderer[];
 objectRenderers=downloadedAssetBundle.GetComponentsInChildren(Renderer) as Renderer[];
 
              Well this manages to get past the initial error but then when I get to the next line which reads for (var eachPart : Renderer in objectRenderers) --(exactly the same as documentation) it crashes because it looks like the objectRenderers array doesn't actually exist. Any idea? Thanks!
$$anonymous$$y bad. The code I posted actually doesn't work. Apparently its not possible to cast the entire array, but you can cast individual element of it in the "foreach" loop.
 //objectRenderers will be a Component[]
 var objectRenderers = downloadedAssetBundle.GetComponentsInChildren(Renderer);
 
 for (var eachPart : Renderer in objectRenderers) {
 ...
 
                 Huh? That's the code I had originally which didn't work..Did you miss something? I tried doing [code] var objectRenderers = downloadedAssetBundle.GetComponentsInChildren(Renderer); for (var eachPart : Renderer in objectRenderers as Renderer)
{..[/code] but that didnt work either :(
Not really. This way I'm not declaring the type of objectRenderers and letting the compiler choose one. In this case it will be Component[].
Sometimes UnityScript behaves differently between versions. What version of Unity are you using?
Ahha. I removed the declaration and it worked!! $$anonymous$$any thanks!!
Answer by grimmy · Feb 10, 2012 at 05:50 PM
Here's the final piece of working code. Note: objectRenderers is never declared. If you do declare it , it will crash.
 objectRenderers=downloadedAssetBundle.GetComponentsInChildren( Renderer );
         
 for (var eachPart : Renderer  in objectRenderers ) //as Renderer??
     {
         //set a transparent shader
         eachPart.sharedMaterial.shader = Shader.Find ("Transparent/Diffuse");
         eachPart.sharedMaterial.color = Color.blue;
         eachPart.sharedMaterial.color.a=0.3;
     }
 
              Your answer
 
             Follow this Question
Related Questions
How do I access the renderer from a child? 1 Answer
Do something for each material in each renderer in children... 2 Answers
GetComponentInChildren< Renderer > failing to find the renderer 1 Answer
how do I change the properties of a material that are on the children of an object on script? 1 Answer
Disable multiple child components 1 Answer