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&lt;TextMeshProUGUI&gt;()FindObjectOfType&lt;TextMeshProUGUI&gt;()。取决于文本网格是控制器对象的后代还是完全不同的对象。而且由于您是通过脚本分配的,因此不必担心在检查器中分配。事实上,将字段设为私有,这样它甚至不会出现在检查器中。

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

【讨论】:

太棒了!非常感谢!你的假设是正确的。 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 在播放模式下取消分配的主要内容,如果未能解决你的问题,请参考以下文章

Unity TextMeshProUGUI

JS 取消iOS播放自动全屏:

以纵向模式在videoview中全屏制作视频[重复]

h5+ IOS App中取消视频默认全屏播放

网络自动播放策略更改恢复上下文不会取消静音

Excel 如何重新设置分页预览