为了账号安全,请及时绑定邮箱和手机立即绑定

TextMeshProUGUI 在播放模式下取消分配

TextMeshProUGUI 在播放模式下取消分配

C#
慕姐8265434 2023-09-16 20:15:45
我已按照本教程(https://unity3d.com/pt/learn/tutorials/projects/roll-ball-tutorial/displaying-score-and-text)进行操作,每次我的脚本分数发生变化时都会更新文本,并且它工作得很好。但我想使用 TextMeshPro 而不是简单的文本。我已经在代码中进行了所有必要的更改,例如:使用TMPro公共 TextMeshProUGUI 分数文本;(而不是公共文本 ScoreText)ScoreText = gameObject.GetComponent(); (在 void Start() 内)ScoreText.text = "分数:" + Score.ToString(); (在我的函数内)在播放模式下,我收到“NullReferenceException:未将对象引用设置到对象实例”消息。我发现了原因。当我进入播放模式时,我在检查器中看到分配给脚本的 TextMeshProUGUI 自动取消分配。我制作了一个独立的脚本,并将其添加到 TextMeshProUGUI 中,以检查我的代码是否可以与 TextMeshPro 一起使用,确实如此。问题是:我不想用一个单独的脚本来更新 TextMeshPro。正如上面的教程所示,我需要将 TextMeshPro 作为具有所有其他功能的大脚本内的公共变量。如果在进入播放模式后,我通过将 TextMeshProUGUI 拖动到检查器来手动分配 TextMeshProUGUI,则乐谱有效!为什么当我进入游戏模式时,文本、预制件和所有内容都保留分配给我的游戏对象,但 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 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

您的文本网格不会“自动取消”。您在这一行中明确告诉它分配其他内容:

ScoreText = gameObject.GetComponent();

您的文本网格可能与控制器不在同一对象上,因为它需要成为画布的子对象才能工作。因此该命令没有找到它要查找的内容,返回 null,从而分配 null。使用GetComponentInChildren<TextMeshProUGUI>()FindObjectOfType<TextMeshProUGUI>()代替。取决于文本网格是控制器对象的后代还是完全不同的对象。由于您是通过脚本进行分配,因此不必担心在检查器中进行分配。事实上,将该字段设置为私有,这样它就不会显示在检查器中。

或者在检查器中分配并删除脚本分配。两者都做是不必要的、多余的并且容易造成混乱和错误。正如你刚刚发现的那样。


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 46 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信