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

Unity3D Text not changing after being set in Start()

我有一个 Canvas(世界 Space 渲染模式),其中一个文本和一个按钮组件显示在三维 space 中(这是一个 VR 应用程序)。 canvas 使用预制件在 运行 时实例化。 我使用以下方法获得对文本对象的引用:

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

我想在 运行 时使用以下方式更新文本:

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

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

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

您是否在设置值之前实例化您的预制件。如果您在实例化之前存储 _codeTextLabel 引用,那么您的引用将指向预制件而不是运行时对象。我看不到你的其余代码,所以我不能肯定地说。 (我会问作为评论,但因为我是新人,我没有这样做的声誉)

编辑:我做了一个测试来尝试重现你的问题。我制作了以下脚本,它似乎按预期工作。 CanvasPrefab 是一个带有 UnityEngine.UI.Text 组件的世界空间 canvas。 (脚本附加在场景中的一个空游戏对象上)

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. 无法执行“_codeTextLabel = canvasPrefab.transform.Find("CodeTextLabel").gameObject.GetComponent();”
    2. '_codeTextLabel' 丢失了来自 'GameObject.
    3. 根本不改变 runtimeText 的变化
    4. 事件订阅失败我的意思是,您的更新脚本没有获得正确的事件来更新该文本。

没有代码,这只是我能猜到的,所以请检查上面我希望上面有案例。