Getting reference to nested prefab with name "foo"

A novice question and yes I have read the GetComponent reference. However, still having a problem getting this to work.

In my hierarchy I have a prefab with a Class Script component attached. Lets call this “ParentClass”.

Nested 2 levels deep in the hierarchy on the SAME prefab I have another Light prefab with name “foo”(in the hierarchy).

In the Start method for the ParentClass I have>

Light sideLight2 = gameObject.GetComponent("foo") as Light;

This doesn’t work.

Can anyone tell me what I am doing wrong?
Do I have to resort to GameObject.Find instead? I’ve read the latter is quite inefficient and should be avoided.

There’s a couple of points here.

First of all, GetComponent needs the type name, not the object name. So if you want a Light, you’ll have to use

Light sideLight2 =  GetComponent("Light") as Light;

Or, MUCH better, the generic version:

Light sideLight2 =  GetComponent<Light>();

Secondly, GetComponent only finds components on the same object as the script is on. If you want to find components in child object (as “nested 2 levels deep” implies), you’ll need GetComponentInChildren:

Light sideLight2 =  GetComponentInChildren<Light>();

Note that GetComponentInChildren returns the first Light it finds - so if you have several Lights in the prefab hireachy, this is not a viable solution.

If that’s the case, you should assign the lights in the inspector. You can do this if the light is a public field:

public Light sideLight2;

or if that breaks encapsulation for you, you get the same result by using the SerializeField attribute on a private field:

[SerializeField]
private Ligth sideLight2;

Hope that helps!