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.
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...");
}