3
\$\begingroup\$

I have a GameObject (RoomOrganizer in the picture below) with a "RoomManager" script, and one or more child objects, each with a 'HasParallelagram' component attached, likeso:

enter image description here

I've also got the following in the aforementioned "RoomManager"

void Awake () 
{
    Rect tempRect;
    HasParallelogram tempsc;

    foreach (Transform child in transform)
    {
        try
        {
            tempsc = child.GetComponent<HasParallelogram>();
            tempRect = tempsc.myRect;

            blockedZoneList.Add(new Parallelogram(tempRect));
            Debug.Log(tempRect.ToString());
        }
        catch( System.NullReferenceException)
        {
            Debug.Log("Null Reference Caught");
        }
    }
}

HasParallelgram is an empty script with a public Rect set in the editor and nothing else.

Unfortunately, attempting to assign tempRect = tempsc.myRect causes a null pointer at run time.

enter image description here

I've done some more digging, and the reason for the null pointer is relatively simple - the RoomManager script gets woken ("Awake") before the HasParallelagram script gets instantiated ("Start").

It's an issue of timing - I need to wait until all objects have been instantiated before calling the RoomManager. Does Unity support a means of doing that?

What's the proper way to get a child's component?

\$\endgroup\$
5
  • 2
    \$\begingroup\$ I didn't know Unity had a such GUI/IDE... Seems a bit... Intrusive. \$\endgroup\$
    – jcora
    Jul 7 '12 at 19:44
  • \$\begingroup\$ did you try this method? GetComponentsInChildren<HasParallelogram>() \$\endgroup\$
    – Ali1S232
    Jul 7 '12 at 21:17
  • \$\begingroup\$ @Gajet I considered it, but that returns an array, and I'd much rather do the loop to keep things in a list. Ultimately, I don't think this is likely to be the issue, as the issue isn't in finding the component. \$\endgroup\$ Jul 7 '12 at 21:25
  • \$\begingroup\$ Post updated. I found out why I was getting a null pointer. Still looking for a solution, however. \$\endgroup\$ Jul 7 '12 at 21:31
  • \$\begingroup\$ Some sort of coroutine, perhaps? \$\endgroup\$
    – Wackidev
    Jul 7 '12 at 21:39
2
\$\begingroup\$

What is the exact error? All objects that you declare via the IDE should exist at the time that Awake is called. (http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.Awake.html) So it should not be the case that the HasParallelagram script has not been instantiated. However, Start() will not have been called yet, and that's to be expected - Awake calls run before Start calls, and you can use that knowledge to ensure that internal data is set up in Awake before you perform operations in Start.

\$\endgroup\$
2

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .