【问题标题】:Instantiate Object Only once on game start Unity 3D仅在游戏开始 Unity 3D 时实例化对象一次
【发布时间】:2019-05-28 13:12:54
【问题描述】:

我有一个游戏有几个关卡,每个关卡有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);
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    你已经有一个带有static标志loadedif

    既然你在那里加载另一个场景,你需要一个类似的第二个标志,例如

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

    【讨论】:

    • 我更新了我的答案.. 我读到你正在那里加载另一个场景。您只需要为预制件添加第二个标志
    • 太棒了!你节省了我的时间!非常感谢!
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2016-01-28
    相关资源
    最近更新 更多