1
votes

when I click button,I load a new Scene and Instantiate prefab. the problem is :the prefab is created in old Scene not new Scene how can Instantiate prefab in next Scene or specific Scene?

3
Are you unloading your current scene when you load the new one?Immersive

3 Answers

4
votes

Instantiate the prefab and use SceneManager.MoveGameObjectToScene to move the object from the old scene to the new scene. From the docs:

MoveGameObjectToScene

Moves a GameObject from its current Scene to a new Scene.

You can only move root GameObjects from one Scene to another. This means the GameObject to move must not be a child of any other GameObject in its Scene. This only works on GameObjects being moved to a Scene that is already loaded (additive). If you want to load single Scenes, make sure to use DontDestroyOnLoad on the GameObject you would like to move to a new Scene, otherwise Unity deletes it when it loads a new Scene.

And the example:

public class Example : MonoBehaviour
{
    // Type in the name of the Scene you would like to load in the Inspector
    public string m_Scene;

    // Assign your GameObject you want to move Scene in the Inspector
    public GameObject m_MyGameObject;

    void Update()
    {
        // Press the space key to add the Scene additively and move the GameObject to that Scene
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(LoadYourAsyncScene());
        }
    }

    IEnumerator LoadYourAsyncScene()
    {
        // Set the current Scene to be able to unload it later
        Scene currentScene = SceneManager.GetActiveScene();

        // The Application loads the Scene in the background at the same time as the current Scene.
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(m_Scene, LoadSceneMode.Additive);

        // Wait until the last operation fully loads to return anything
        while (!asyncLoad.isDone)
        {
            yield return null;
        }

        // Move the GameObject (you attach this in the Inspector) to the newly loaded Scene
        SceneManager.MoveGameObjectToScene(m_MyGameObject, SceneManager.GetSceneByName(m_Scene));
        // Unload the previous Scene
        SceneManager.UnloadSceneAsync(currentScene);
    }
}
0
votes
-1
votes

Two options:

  1. Use a coroutine to wait for the new scene to be loaded
    • I am not entirely sure this would even work, as the first scene would get unloaded and the script potentially terminated early, unless its part of a DoNotDestroyOnLoad object
  2. Use a script in the new scene to spawn the prefab instead