Comportement incorrect lorsque la scène est chargée

Ok donc j’ai cette coroutine:

IEnumerator ShowCharTraits() { while(!hasPlayerChosen) { yield return null; traitPanel.SetActive(true); } hasPlayerChosen = false; traitPanel.SetActive(false); // Debug.Log("Got called! job done"); } 

Cela s’appelle comme ça depuis la méthode awake dans mon GameManager :

 players = GameObject.FindGameObjectsWithTag("Player"); foreach (GameObject g in players) { ui_Controller.StartShowCharTraits(); g.GetComponent().isTurn = false; } 

StartShowCharTraits () est une méthode simple qui fait ceci:

  public void StartShowCharTraits() { StartCoroutine("ShowCharTraits"); } 

Maintenant, j’ai vérifié les balises, aucune exception de référence null, aucune erreur ni aucun avertissement en cours. Si je charge la scène dans l’éditeur puis que je la joue, tout se passe bien. traitPanel.SetActive(true); se faire appeler et mon panneau apparaît. Cependant, lorsque je charge ma scène d’une autre scène à l’aide de SceneManager.LoadScene(1); la ligne susmentionnée n’est jamais atteinte. Des idées pourquoi cela se produit?

Supposons que vous souhaitiez avoir un emplacement central “comme un singleton” dans un projet Unity. Exemple,

 SoundEffects LapTimer Scores SocialMediaConnections 

Tout ce que tu fais c’est ça.

  1. faites votre script SoundEffects.cs

  2. Rappelez-vous que chaque projet Unity doit avoir une scène de “précharge”. (impossible de ne pas en avoir)

  3. dans la scène de préchargement, ayez un object de jeu vide appelé “titulaire”. assurez-vous qu’il est marqué “DontDestroyOnLoad”

  4. attachez SoundEffects.cs à ce titulaire

vous avez terminé.

il n’y a rien de plus.

tu as fini.

c’est “aussi simple”

Donc, tout script particulier, qui est attaché à un object particulier, dans une scène particulière, peut avoir besoin d’accéder à “SoundEffects” …

Pour ce faire, faites simplement ceci dans Awake:

  SoundEffects soundEffects = Object.FindObjectOfType(); 

puis utilisez simplement soundEffects n’importe où dans ce script, par exemple soundEffects.PlayBoom(13) etc., etc.

Donc dans Awake ()

  Laps laps = Object.FindObjectOfType(); Social social = Object.FindObjectOfType(); AI ai = Object.FindObjectOfType(); 

ou peu importe.

L’unité est simple. Incroyablement simple. C’est aussi simple que ça.

  1. écrivez votre script, LapTimer.cs ou autre

  2. placez-le sur un object support dans votre scène de précharge (où pourrait-il en être autrement?)

il n’y a pas de “3”, c’est tout ce qu’il y a. C’est juste que ridiculement simple.

Notez que…

Dans les premiers jours d’Unity, quelqu’un a malheureusement mentionné quelque part les «singletons» sur un tableau d’assurance qualité. (Vous ne pouvez pas avoir de “singletons” dans un système ECS, cela n’a aucun sens.) À l’époque, cela a conduit à d’énormes discussions sur la façon de créer un “truc semblable à un singleton” dans Unity, ce qui engendre confusion. Malheureusement, à partir de ce jour-là, vous avez des gens qui apprennent Unity, qui voient “singleton” mentionné ici et là sur le net, et cela mène à une confusion sans fin.

Une fois encore, notez que la notion de “gestionnaires” est incroyablement simple dans Unity – expliquée ci-dessus. C’est sortingvial. Cela ne pourrait pas être plus facile.


Laps laps = Object.FindObjectOfType(); noter que ci-dessus, vous voudrez peut-être que les bonbons syntaxiques évitent l’incroyable corvée de taper Laps laps = Object.FindObjectOfType();

Malheureusement, il n’existe pas de macros dans Unity / c #, vous avez donc besoin d’une autre méthode.

Tout ce que vous faites est d’utiliser un script “Grid” http://answers.unity3d.com/answers/1124859/view.html qui est populaire depuis des années dans Unity.

Mais honnêtement, c’est si simple d’utiliser Scores scores = Object.FindObjectOfType(); que je ne fais habituellement que de nos jours.

Ok comment puis-je expliquer cela. J’ai un singleton qui agit en tant que détenteur de données. Lors du développement de la scène avec le gestionnaire de jeu, j’avais attaché le singleton à l’object gamemanger qui contient plusieurs scripts. Maintenant, quand j’ai créé le menu principal, j’ai ajouté mon singleton à celui-ci pour pouvoir porter des informations à la scène du jeu et, à cause de cela, tout mon object gestionnaire de jeu était en cours de suppression. C’est le coupable du DataHolder:

  void Awake() { if (instance == null) instance = this; else if (instance != this) Destroy(gameObject);//This right here. DontDestroyOnLoad(gameObject); } 

J’ai donc changé cette ligne en Destroy(gameObject.GetComponent(instance.GetType()));