Home > front end >  Loading a scene in Unity twice causes some game objects to lose some components
Loading a scene in Unity twice causes some game objects to lose some components

Time:11-15

When I hit play the game scene behaves as normal, even if I come from a different scene.

But when I am on the game scene and go to other scene and back again to the game scene some components from some game objects.

I am using SceneManager.LoadScene("SceneName"); to move around scenes, and every component was added in the editor and saved in the scene.

And as an example here is the Game Manager inspector at first load of game scene:

first load

And second load of game scene:

second load

Windows Controls is a script much like the others missing.

Am I doing something wrong?

Thanks in advance.

CodePudding user response:

Without knowing what's going on inside the GameManager and the FoodManager scripts, I think you use the DontDestroyOnLoad similar what is showed on the bottom of the page, and your code destroys the scripts.

CodePudding user response:

Simply put, I was short-sighted, I used a singleton pattern to access the managers and the way I did, at least, doesn't work in this context.

Any manager that I needed access I created a static instance, but since I checked for its existence elsewhere, the second time the component was destroyed.

public GameManager Instance {get; private set;}

void Awake()
{
  if(Instance is not Null && Instance != this)
  {
    Destroy(Instance);
    return;
  }
  Instance = this;
}

I realize that every time the scene loads the components are new objects, but I am still to understand why there is still copies of the old components.

I fixed it by using the [SerializeField] on any manager reference that I could and and manually adding them on the inspector, for some game objects that were instantiated at run time I pass the manager in a method.

GameManager gameManager;
public void Manager(GameManager _gameManager)
{
  gameManager = _gameMananger;
}
GameObject gameObject = Instantiate(prefab);
gameObject.GetComponent<Script>().Manager(this);
  • Related