Roodolpha
Roodolpha

Reputation: 101

Gameobject.find only returning null even when gameobject is active in heirarchy

I am trying to tranfer from one scene to another and trigger a function once this happens. So when i press my play game button on my main menu page it loads a function to begin building the world. I have got the function to build a world but once ive attatched it to a button it has stopped working. So far I believe this is down to me not fully understanding the method of calling a function from another class for it to run normally. I begin to define my GameObject as:

private static GameOjbect Play;

This doesnt allow me to assign a GameObject to it within the unity editor. Therefore, i went down the method of using:

GameObject Play = GameObject.Find("PlayScreen");

My GameObeject is active in the heirarchy when this function begins but the program still does not function correctly. To test where the program is encountering an issue I used:

Debug.Log(Play);

Which i believed would just output "PlayScreen" to the debug log as this is the gameobject I am searching for, but this only returns "Null" and my program does not progress any further which is creating a wall.

Below is my main menu code:

public class MainMenu : MonoBehaviour 
{
    public GameObject PlayScene;
    public GameObject SettingsScreen;

    public void PlayGame()
    {
        SceneManager.LoadScene("InGame");
        Debug.Log("Loading startup...");
        WorldBuilder.Awake();
    }
}

Below is my WorldBuilding function:

public class WorldBuilder:MonoBehaviour 
{
    public static GameObject Play;

    public static void Awake()
    {
        Debug.Log("Finding Scene...");
        GameObject Play = GameObject.Find("PlayScreen");
        Debug.Log(Play);
    } 
}

How come my program is not finding the GameObject? I am still new to C# so any sort of help is appreciated. Thankyou.

Upvotes: 0

Views: 1324

Answers (1)

Basile Perrenoud
Basile Perrenoud

Reputation: 4110

Don't make the Awake function static. If you do Unity won't call it. Also, you are creating a local variable when you do GameObject Play = GameObject.Find("PlayScreen");. If you want to keep it in a static variable, you shouldn't do that. See below:

public class WorldBuilder : MonoBehaviour {
    public static GameObject Play;

    public static void Awake()
    {
        Debug.Log("Finding Scene...");
        WorldBuilder.Play = GameObject.Find("PlayScreen");
        Debug.Log(Play);
    } 
}

Also, remove the call in PlayGame:

public void PlayGame()
{
    SceneManager.LoadScene("InGame");
    Debug.Log("Loading startup...");
}

Upvotes: 1

Related Questions