Unity3D Текст не меняется после установки в Start () - PullRequest
0 голосов
/ 28 октября 2019

У меня есть Canvas (режим World Space Render) с компонентом Text и Button, отображаемым в трехмерном пространстве (это приложение для виртуальной реальности). Холст создается во время выполнения с использованием префаба. Я получаю ссылку на объект Text, используя:

_codeTextLabel = canvasPrefab.transform.Find("CodeTextLabel").gameObject.GetComponent<Text>();

Я хочу обновить текст во время выполнения, используя:

void Update()
{
    _codeTextLabel.text = _codeText;
}

, где _codeText - это просто переменная, которую я обновляюна основе конкретных событий. Проблема в том, что текст обновляется только в первый раз, но если я пытаюсь изменить переменную, ничего не происходит. Я перепробовал несколько комбинаций, а также метод _codeTextLabel.SetAllDirty(), но он не работает.

Единственный способ обновить текст - восстановить экземпляр префаба.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы создаете свой префаб перед установкой значений? Если вы сохраняете ссылку _codeTextLabel до ее создания, тогда ваша ссылка будет указывать на префаб, а не на объект времени выполнения. Я не вижу остальной части вашего кода, поэтому не могу сказать наверняка. (Я бы попросил в качестве комментария, но, поскольку я новичок, у меня нет репутации, чтобы сделать это)

edit: я сделал тест, чтобы попытаться воссоздать вашу проблему. Я сделал следующий скрипт, и он, кажется, работает как ожидалось. CanvasPrefab - это холст мирового пространства с присоединенным компонентом UnityEngine.UI.Text. (Кстати, сценарий прикреплен к пустому игровому объекту на сцене)

public class ChangeText : MonoBehaviour

    {
        public GameObject CanvasPrefab; 
        private GameObject runtimeCanvas;
        public string runtimeText = "something";
        private Text textRef;
        // Start is called before the first frame update
        void Start()
        {
            runtimeCanvas = GameObject.Instantiate(CanvasPrefab);
            textRef = runtimeCanvas.GetComponentInChildren<Text>();
        }

        // Update is called once per frame
        void Update()
        {
            textRef.text = runtimeText;
        }
    }

0 голосов
/ 28 октября 2019
  • до тех пор, пока вы сделали что-то не так, это работает абсолютно, поэтому я предполагаю, что есть несколько случаев
    1. Не удалось выполнить "_codeTextLabel = canvasPrefab.transform.Find (" CodeTextLabel "). GameObject.GetComponent(); "
    2. '_ codeTextLabel' потерял ссылку из 'GameObject.
    3. Ничего не меняет изменение runtimeText '
    4. Ошибка подписки на события. Я имею в виду, что в ваших сценариях обновления нет нужного события для обновления этого текста.

Без кодов это единственное, что я могу угадать для вас, поэтому, пожалуйста, проверьте выше, я надеюсь, что есть случай среди выше.

...