TextMeshProUGUI 在播放模式下取消分配
Posted
技术标签:
【中文标题】TextMeshProUGUI 在播放模式下取消分配【英文标题】:TextMeshProUGUI unassigns when in play mode 【发布时间】:2019-12-29 05:57:58 【问题描述】:我已经按照本教程 (https://unity3d.com/pt/learn/tutorials/projects/roll-ball-tutorial/displaying-score-and-text) 进行了每次我的脚本分数更改时都会更新文本,并且效果很好。
但我想使用 TextMeshPro 而不是简单的 Text。 我已经在我的代码中进行了所有必要的更改,例如:
使用 TMPro public TextMeshProUGUI scoreText; (而不是公共文本 scoreText) scoreText = gameObject.GetComponent(); (在 void Start() 内) scoreText.text = "分数:" + score.ToString(); (在我的函数中)在播放模式下,我收到“NullReferenceException:对象引用未设置为对象实例”消息。 我发现了原因。当我进入播放模式时,我在 Inspector 中看到分配给脚本的 TextMeshProUGUI 已自动取消分配。
我制作了一个独立脚本并添加到 TextMeshProUGUI 以检查我的代码是否与 TextMeshPro 一起使用,并且确实如此。 问题是:我不希望一个单独的脚本仅用于更新 TextMeshPro。正如上面的教程,我需要 TextMeshPro 是一个包含所有其他功能的大脚本中的公共变量。
如果在我进入播放模式后,我通过将 TextMeshProUGUI 拖动到 Inspector 手动分配它,Score 就可以工作了! 为什么当我进入播放模式时,文本、preFabs 和所有内容都保持分配给我的游戏对象,但 TextMeshProUGUI 没有?
我认为代码没问题,因为如果我手动分配 TextMeshProUGUI,它就可以工作。但是,无论如何...
public class SnakeController : MonoBehaviour
public TextMeshProUGUI scoreText;
private int score;
void Start()
....
scoreText = gameObject.GetComponent<TextMeshProUGUI>();
score = 0;
setScoreText();
public void setScoreText()
scoreText.text = "Score: " + score.ToString();
最大的问题是 TextMeshProUGUI 在我进入播放模式的那一刻被取消分配。
【问题讨论】:
【参考方案1】:您的文本网格不会“自动取消”。您明确告诉它在这一行分配其他内容:
scoreText = gameObject.GetComponent();
您的文本网格可能与控制器不在同一个对象上,因为它需要成为画布的子对象才能工作。所以该命令没有找到它正在寻找的东西,返回 null,从而分配 null。请改用GetComponentInChildren<TextMeshProUGUI>()
或FindObjectOfType<TextMeshProUGUI>()
。取决于文本网格是控制器对象的后代还是完全不同的对象。而且由于您是通过脚本分配的,因此不必担心在检查器中分配。事实上,将字段设为私有,这样它甚至不会出现在检查器中。
或在检查器中分配并删除脚本分配。两者都做是不必要的、多余的、容易混淆和出错的。正如你刚刚发现的那样。
【讨论】:
太棒了!非常感谢!你的假设是正确的。 TextMeshProUGUI 通常(或总是?)必须在 Canvas 内。所以,它在不同的对象中。我刚刚删除了通过 void Start() 中的脚本分配 scoreText 的行,现在一切都按预期工作。 @thigoap 是的。来自official documentation:The Canvas is a Game Object with a Canvas component on it, and all UI elements must be children of such a Canvas.
以上是关于TextMeshProUGUI 在播放模式下取消分配的主要内容,如果未能解决你的问题,请参考以下文章