Gameobject.find только возвращает ноль, даже когда gameobject активен в иерархии - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь перейти с одной сцены на другую и вызвать функцию, как только это произойдет.Поэтому, когда я нажимаю кнопку «Моя игра» на странице главного меню, она загружает функцию, чтобы начать строить мир.У меня есть функция для создания мира, но как только я прикрепил его к кнопке, он перестал работать.До сих пор я считаю, что это зависит от того, насколько я не до конца понимаю метод вызова функции из другого класса для ее нормального запуска.Я начинаю определять свой GameObject как:

private static GameOjbect Play;

Это не позволяет мне назначить GameObject ему в редакторе Unity.Поэтому я остановился на методе использования:

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

Мой GameObeject активен в иерархии, когда эта функция запускается, но программа по-прежнему не работает правильно.Чтобы проверить, где программа сталкивается с проблемой, которую я использовал:

Debug.Log(Play);

Который, как я полагал, просто вывел бы «PlayScreen» в журнал отладки, поскольку это игровой объект, который я ищу, но это только возвращает «Нуль»"и моя программа не продвигается дальше, создавая стену.

Ниже приведен код моего главного меню:

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

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

Ниже приведена моя функция WorldBuilding:

public class WorldBuilder:MonoBehaviour 
{
    public static GameObject Play;

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

Почему моя программа не находит GameObject?Я все еще новичок в C #, поэтому любая помощь приветствуется.Thankyou.

1 Ответ

0 голосов
/ 19 декабря 2018

Не делайте функцию Awake статичной.Если вы это сделаете, Unity не будет называть это.Кроме того, вы создаете локальную переменную, когда вы делаете GameObject Play = GameObject.Find("PlayScreen");.Если вы хотите сохранить его в статической переменной, вам не следует этого делать.См. Ниже:

public class WorldBuilder : MonoBehaviour {
    public static GameObject Play;

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

Также удалите вызов в PlayGame:

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