Создание объекта Только один раз при запуске игры Unity 3D - PullRequest
0 голосов
/ 01 января 2019

У меня есть игра с несколькими уровнями, у каждого уровня есть 6 сцен, игра начинается непосредственно без какой-либо сцены меню, и когда игрок открывает игру, он может продолжить с последней сцены, которую он уже достиг.

Я хочу создать некоторые элементы только при открытии игры (например, Лучший результат , Нажмите, чтобы сыграть и т. Д.), Я имею в виду, что их * нужно создать только один разначало игры (на достигнутом уровне).

Я пробовал этот код в GameManager, но он создает элементы в каждой сцене:

public GameObject PlayButton;

bool GameHasEnded = false;
public float RestartDelay = 2f;
public float NextLevelDelay = 5f;

public int level_index;
private static bool loaded = false;


private void Start()
{
    if (!loaded)
    {
        loaded = true;
        level_index = PlayerPrefs.GetInt("Last_Level");
        SceneManager.LoadScene(level_index);
    }

    GameObject canvas = GameObject.Find("Canvas");
    GameObject play = Instantiate(PlayButton, canvas.transform.position, Quaternion.identity);
    play.transform.SetParent(canvas.transform, false);
}

public void CompleteLevel()
{
    Invoke("NextLevel", NextLevelDelay);
}

public void EndGame()
{
    if (GameHasEnded == false)
    {
        GameHasEnded = true;
        Invoke("Restart", RestartDelay);
    }
}

void NextLevel()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex +1);
    level_index = SceneManager.GetActiveScene().buildIndex + 1;
    PlayerPrefs.SetInt("Last_Level", level_index);
    PlayerPrefs.Save();
}

void Restart()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().path);
}

1 Ответ

0 голосов
/ 01 января 2019

У вас уже есть блок if с флагом static loaded

Поскольку вы загружаете другую сцену, вам нужен второй аналогичный флаг, например

private static bool loadedPrefab = false;

private void Start()
{
    if (!loaded)
    {
        loaded = true;
        level_index = PlayerPrefs.GetInt("Last_Level");
        SceneManager.LoadScene(level_index);

        // Return because you don't want to execute the rest yet
        // but instead in the new loaded scene
        return;
    }

    // The same way skip if the prefab was already loaded before
    if(!loadedPrefab)
    {
        loadedPrefab = true;

        GameObject canvas = GameObject.Find("Canvas");
        GameObject play = Instantiate(PlayButton, canvas.transform.position, Quaternion.identity);
        play.transform.SetParent(canvas.transform, false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...