【问题标题】:Unity3D Text not changing after being set in Start()在 Start() 中设置后 Unity3D 文本未更改
【发布时间】:2019-10-28 12:27:13
【问题描述】:

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

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

我想在运行时更新文本:

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

其中_codeText 只是我根据特定事件更新的变量。 问题是 Text 仅在第一次更新,但如果我尝试更改变量,则没有任何反应。我尝试了几种组合以及方法_codeTextLabel.SetAllDirty(),但它不起作用。

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

【问题讨论】:

  • 请包含整个类,方便我们调试。

标签: unity3d canvas unity-ui


【解决方案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;
        }
    }

【讨论】:

  • _codeTextLabel 设置正确(我有一个检查),它也第一次工作。问题是它在第一次之后没有更新。
  • 是否可以分享更多您的代码,以便我更好地了解您在做什么?
  • 基本上我得到的是对预制件的直接引用,而不是在运行时生成的实例。这就是为什么报告第一个更改(通过实例化)但以下所有更改都没有任何效果。非常感谢!
【解决方案2】:
  • 只要你做错了什么,它绝对有效,所以我猜有几种情况
    1. 未能执行“_codeTextLabel = canvasPrefab.transform.Find("CodeTextLabel").gameObject.GetComponent();”
    2. '_codeTextLabel' 丢失了来自 'GameObject.
    3. 根本不改变 runtimeText' 的变化
    4. 事件订阅失败我的意思是,您的更新脚本没有获得适当的事件来更新该文本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2020-01-24
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2019-03-21
    • 2017-04-16
    相关资源
    最近更新 更多