简体   繁体   English

仅在游戏启动一次时实例化对象Unity 3D

[英]Instantiate Object Only once on game start Unity 3D

I have a game with several levels, each level has 6 scenes, the game start directly without any menu scene, and when the player open the game he can continue from the last scene that he already reached. 我有一个具有多个级别的游戏,每个级别都有6个场景,游戏直接开始而没有任何菜单场景,并且当玩家打开游戏时,他可以从他已经达到的最后一个场景继续。

I want to instantiate some elements only on game opening (like Best score , Tap to play etc...), I mean that they should be instantiated only once on the start of the game (on the level he reached). 我只想在游戏开始时实例化某些元素(例如最佳分数 ,点按即可玩等),我的意思是,在游戏开始时 (在他达到的级别上) 只能实例化一次

I tried this code in GameManager but it instantiate the elements in every scene: 我在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);
}

You already have an if block there with the static flag loaded 你已经有一个if块有与static标志loaded

Since you there load another scene you need a similar second flag eg 由于在那里加载了另一个场景,因此需要类似的第二个标记,例如

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM