在 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;
}
}
- 只要你做错了,绝对有效所以我猜有几种情况
- 无法执行“_codeTextLabel = canvasPrefab.transform.Find("CodeTextLabel").gameObject.GetComponent();”
- '_codeTextLabel' 丢失了来自 'GameObject.
- 根本不改变 runtimeText 的变化
- 事件订阅失败我的意思是,您的更新脚本没有获得正确的事件来更新该文本。
没有代码,这只是我能猜到的,所以请检查上面我希望上面有案例。
我有一个 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;
}
}
- 只要你做错了,绝对有效所以我猜有几种情况
- 无法执行“_codeTextLabel = canvasPrefab.transform.Find("CodeTextLabel").gameObject.GetComponent();”
- '_codeTextLabel' 丢失了来自 'GameObject.
- 根本不改变 runtimeText 的变化
- 事件订阅失败我的意思是,您的更新脚本没有获得正确的事件来更新该文本。
没有代码,这只是我能猜到的,所以请检查上面我希望上面有案例。