web-dev-qa-db-fra.com

Charger la scène avec la variable param Unity

Dans mon jeu, il y a une vue de carte qui contient une grille de tuiles 50x50. Lorsque vous cliquez sur la tuile, vous êtes envoyé à cette tuile pour voir et attaquer des choses, etc. La seule différence entre ces "tuiles" en ce qui concerne le code est l'ID des tuiles, alias. quel numéro sur la grille. Ce numéro sera transmis au serveur lors de l'init pour gérer le reste.

Évidemment, étant donné que c'est la seule différence dans les tuiles, ce serait une erreur de créer une scène "1", une scène "2" ... une scène "2500" et d'appeler SceneManager.LoadScene pour passer à la vue de tuile spécifique.

Je pourrais utiliser DontDestroyOnLoad (); lorsque la vignette est cliquée pour conserver l'ID de la vignette sur le commutateur de scène, mais 1) elle n'accepte que les objets de jeu, pas seulement une variable int.2) Je n'ai pas besoin/ne souhaite pas conserver cette variable pour autre chose que l'init dans la vue de la vignette. Donc, bien que cela puisse fonctionner, cela semble exagéré.

Existe-t-il une meilleure pratique pour passer simplement un paramètre à une charge de scène?

9
DasBeasto

Vous pouvez créer une classe statique contenant les informations pour vous. Cette classe ne sera attachée à aucun GameObject et ne sera pas détruite lors du changement de scène. C'est static ce qui signifie qu'il ne peut y en avoir qu'un; vous ne pouvez pas écrire StaticClassName scn = new StaticClassName() pour créer de nouvelles classes statiques. Vous y accédez directement par le biais de StaticClassName.SomeStaticMethod() par exemple et vous pouvez y accéder de n'importe où. Voir cet exemple sur la façon de stocker une valeur dans une variable, de changer de scène et de l'utiliser ensuite dans cette scène:

Un script Unity normal attaché à un objet de jeu dans la scène "Test":

using UnityEngine;
UnityEngine.SceneManagement;
public class TestingScript : MonoBehaviour {
    void Start()
    {
        StaticClass.CrossSceneInformation = "Hello Scene2!";
        SceneManager.LoadScene("Test2");
    }
}

Une nouvelle classe statique (non héritée de monobehaviour) qui contient des informations:

public static class StaticClass {
    public static string CrossSceneInformation { get; set; }
}

Un script attaché à un objet de jeu dans la scène "Test2":

using UnityEngine;
public class TestingScript2: MonoBehaviour {

    void Start () {
        Debug.Log(StaticClass.CrossSceneInformation);
    }
}

Vous n'avez pas besoin d'avoir la classe entière statique (si pour une raison quelconque vous devez en créer plus). Si vous supprimez le static de la classe (pas la variable), vous pouvez toujours accéder à la variable statique via StaticClass.CrossSceneInformation Mais vous pouvez également faire StaticClass sc = new StaticClass();. Avec ce sc vous pouvez utiliser les membres non statiques de la classe mais pas le static CrossSceneInformation Car il ne peut y en avoir qu'un (car il est statique).

16
Fredrik Schön

Maakep! Code parfait et facile!

Mais votre méthode pour charger la scène ne fonctionne pas.

Vous pouvez utiliser une autre méthode:

UnityEngine.SceneManagement.SceneManager.LoadScene("Vuforia-4-Spheric");
0
azatserzhan