2017-02-02 4 views
0

Ich habe einige Texte, die ich den Inhalt eines anderen kopieren möchte. Dafür bekomme ich alle Instanzen dieser Nachahmer Texte in der Start() Funktion. Ich muss dies jedoch nur einmal tun. Um diesen kompakt zu machen, möchte ich nicht, dies zu tun in meinem Singleton GameManager, so dass ich ein static bool, die geändert wird, wenn ich diese Initialisierung tun wie so:Unity - sicherstellen, dass nur eine Instanz den angegebenen Befehl ausführt

#region Variables 
    //using this so that we get the references of the texts only once. 
    static bool _initDone = false; 
    CopyText[] scripts; 
    static Text[] texts; 
    #endregion 
    void Start() 
    { 
     #region What to do 
     /* 
     * Getting all this script's gameobjects, and their texts. 
     * note that this scripts is attached only to objects with Text attribute. 
     * after that nullifying the CopyText array to save space. 
     */ 
     #endregion 
     if (!_initDone) 
     { 
      //so only the first one of this instance will do it. 
      _initDone = true; 
      scripts = Object.FindObjectsOfType<CopyText>(); 
      for (int i = 0; i < scripts.Length; i++) 
      { 
       try 
       { 
        texts[i] = scripts[i].GetComponent<Text>(); 
       } 
       catch 
       { 
        //in case it is put on an object that doesn't have a Text 
        Destroy(scripts[i]); 
       } 

      } 
      scripts = null; 
      //by now we should have our references of all copycat texts. 
     } 
    } 

Diese sollte Arbeit, aber ich habe keine Ahnung, ob zwei Instanzen gleichzeitig laufen und beide diese Magie machen. Gibt es eine Möglichkeit, sicherzustellen, dass die Start()-Funktion nur auf eine Instanz dieser Nachahmungstexte ausgeführt wird?

Antwort

1

Alle Start Methoden werden sequenziell ausgeführt, Unity hat einen Hauptthread, der alle Methoden nacheinander ausführt. Wenn Sie diese Variable nicht von einem anderen manuell gestarteten Thread ändern, tritt kein Problem auf.

Da es sich um eine statische Variable handelt, haben alle Instanzen Zugriff und werden nur einmal vorhanden sein. Ich weiß nicht, ob das ein guter Design-Ansatz ist, aber es wird funktionieren.

Nur für die Bestellung Zeug würde ich diesen Code in einer statischen Methode trennen und es vielleicht InitTexts nennen.

+0

Also sagst du ich sollte das Zeug in eine 'statische' Methode schreiben, es in einer meiner' Start() 'Funktionen aufrufen das selbe war wie es jetzt ist? – hei

+0

Ja, Ihr Code wird funktionieren, nur um ein wenig aufgeräumter zu sein Ich würde es auf eine statische Methode verschieben und es von 'Start()' aufrufen. – AxelWass

+0

Hat genau das getan und ja, es funktioniert. Danke für Ihre Hilfe. – hei

Verwandte Themen