Search code examples
unity-game-enginecanvasunity-ui

Unity3D Text not changing after being set in Start()


I have a Canvas (World Space Render mode) with a Text and a Button component displayed in a tridimensional space (it's a VR app). The canvas instantiated at runtime using a prefab. I get a reference to the Text object using:

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

I want to update the text at run-time using:

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

where _codeText is just a variable I update based on specific events. The problem is that the Text gets updated only the first time, but if I try to change the variable nothing happens. I have tried several combinations and also the method _codeTextLabel.SetAllDirty() but it doesn't work.

The only way to update the text is to re-instantiate the prefab.


Solution

  • Are you instantiating your prefab before setting the values. If you are storing the _codeTextLabel reference before instantiating then your reference will point to the prefab not the runtime object. I can't see the rest of your code, so I can't say for sure. (I would have asked as a comment, but as I'm new I don't have the reputation to do so)

    edit: I did a test to try and recreate your problem. I made the following script and it appears to work as expected. CanvasPrefab is a worldspace canvas with a UnityEngine.UI.Text component attached. (The script is attached on an empty game object in the scene btw)

    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;
            }
        }