2017-02-02 3 views
0

У меня есть некоторые тексты, которые я хочу скопировать содержимое другого. Для этого я получаю все экземпляры этих копий текстов в функции Start(). Однако мне нужно сделать это только один раз. Для того, чтобы сделать этот компактный, я не хочу, чтобы сделать это в моем Singleton GameManager, поэтому я использую static bool, который изменяется, когда я делаю эту инициализацию следующим образом:Unity - убедитесь, что только один экземпляр выполняет заданную команду

#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. 
     } 
    } 

Этот должен работу, но я не имеют понятия, если два экземпляра будут работать в одно и то же время, и оба они будут делать эту магию. Есть ли способ гарантировать, что функция Start() работает только на один экземпляр этих текстов подражателей?

ответ

1

Все методы Start будут выполняться последовательно, Unity имеет основной поток, который последовательно запускает все методы. Если вы не измените эту переменную из другого потока вручную, это не вызовет никаких проблем.

Учитывая, что это статическая переменная, все экземпляры будут иметь доступ, и она будет существовать только один раз. Я не знаю, хороший ли это подход к дизайну, но он будет работать.

Как раз для того, чтобы заказать материал, я бы отделил этот код от статического метода и позвонил ему, возможно, InitTexts.

+0

Итак, вы говорите, что я должен поместить этот материал в метод 'static', вызывать его в одной из моих функций' Start() ', что было так же, как сейчас? – hei

+0

Да, ваш код будет работать, чтобы быть немного более аккуратным. Я бы переместил его на статический метод и назову его из 'Start()'. – AxelWass

+0

Только что и да, это работает. Спасибо за вашу помощь. – hei

Смежные вопросы