2017-02-22 1 views
2

Dans mon jeu, il y a une vue de carte qui contient une grille de carreaux de 50x50. Lorsque vous cliquez sur la tuile, vous êtes envoyé à cette vue en mosaïque et attaquez les choses, etc. La seule différence entre ces "tuiles" en ce qui concerne le code sera l'ID de tuiles, alias. quel numéro sur la grille. Ce nombre sera transmis au serveur sur init pour gérer le reste. De toute évidence, étant la seule différence dans les tuiles ce serait une erreur de créer une scène "1", scène "2" ... scène "2500" et d'appeler SceneManager.LoadScene pour passer à la vue de tuile spécifique .Charger la scène avec la variable param Unity

Je pourrais utiliser DontDestroyOnLoad(); quand on clique sur la mosaïque pour conserver l'ID de mosaïque sur le changement de scène mais 1) elle accepte seulement les gameobjects non seulement une variable int 2) Je n'ai pas besoin de/conserver cette variable pour autre chose que la vue init in tile. Donc, même si cela peut fonctionner, cela semble être exagéré.

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

+1

Je suppose que vous pourriez créer une classe statique contenant les informations, si vous n'en avez pas besoin pour parler à gameobjects (hériter de monobehaviour). 1 sec, je vais vous donner un exemple rapide. – Maakep

Répondre

3

Vous pouvez créer une classe statique qui contient l'information pour vous. Cette classe ne sera attachée à aucun objet 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; ne peut pas écrire StaticClassName scn = new StaticClassName() pour créer de nouvelles classes statiques. Vous y accédez directement par l'intermédiaire de StaticClassName.SomeStaticMethod() par exemple et vous pouvez accéder à à partir de n'importe où. Voir cet exemple sur la façon de stocker une valeur dans une variable, scène de changement, puis l'utiliser dans cette scène:

Un script de l'unité normale attachée à une gameobject en scène « Test »:

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

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

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

un script attaché à un objet de jeu en 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 vous avez besoin de créer d'autres instances). Si vous deviez supprimer 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 (parce que c'est statique).

+1

Habituellement, je fais juste une telle classe par scène qui a besoin d'informations contextuelles – Dunno

+1

J'aime beaucoup ça! Juste ce dont j'avais besoin. Et que vous pour les rappels sur quelle statique je les ai utilisés quelque peu arbitrairement. – DasBeasto

+0

Génial! Heureux de vous aider! – Maakep