在Start()中设置后,Unity3D文本未更改

时间:2019-10-28 00:18:25

标签: unity3d canvas unity-ui

我有一个Canvas(世界空间渲染模式),在三维空间(这是一个VR应用程序)中显示了一个Text和一个Button组件。画布在运行时使用预制实例化。 我使用以下内容获得对Text对象的引用:

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

我想使用以下命令在运行时更新文本:

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

其中_codeText只是我根据特定事件更新的变量。 问题是文本仅在第一次更新,但是如果我尝试更改变量,则什么也不会发生。我尝试了几种组合以及方法_codeTextLabel.SetAllDirty(),但是它不起作用。

更新文本的唯一方法是重新实例化预制件。

2 个答案:

答案 0 :(得分:1)

您要在设置值之前实例化预制件吗?如果在实例化之前存储_codeTextLabel引用,则您的引用将指向预制对象而不是运行时对象。我看不到您的其余代码,因此无法确定。 (我本来想发表评论,但由于我是新人,所以我没有这样做的声誉)

编辑:我做了一个测试,尝试重新创建您的问题。我做了以下脚本,它似乎可以正常工作。 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;
        }
    }

答案 1 :(得分:0)

  • 只要您做错了事,它绝对有效,所以我猜有几种情况
    1. 无法执行“ _codeTextLabel = canvasPrefab.transform.Find(“ CodeTextLabel”)。gameObject.GetComponent();“
    2. “ _ codeTextLabel”丢失了来自“ GameObject”的引用。
    3. 完全不更改runtimeText'
    4. 事件订阅失败,我的意思是,您的更新脚本未获得适当的事件来更新该文本。

没有代码,这只是我能为您猜到的,因此请检查以上内容,希望以上内容是正确的。