【问题标题】:How to get text on unity 2D to display如何在统一 2D 上显示文本
【发布时间】:2017-11-23 20:19:34
【问题描述】:

我无法显示文本,并且在执行该方法时收到 NullReferenceException。最重要的是,代码不会停止运行。

// Use this for initialization
void Start()
{
    // Default position not valid? Then it's game over
    if (!isValidGridPos())
    {
        Text text;
        text = GetComponent<Text>();

        text.text = "Game Over";
        Destroy(gameObject);
        if (Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
        }

    }
}

代码来自this tutorial。我只是想为它添加重启和游戏结束消息。

编辑:尝试使用 text = GetComponent() 显示文本不起作用。什么是在实际工作的统一显示文本的另一种方法?我也尝试了 GUIText,但我无法让它在显示器上可见。

【问题讨论】:

  • 错误到底发生在哪一行?你确定它不是来自isValidGridPos()
  • 当我向“文本”添加消息时。
  • 我明白了,你已经编辑了代码。好的,你确定你有一个文本组件附加到这个脚本也附加到的对象上吗?
  • 是的,就是imgur.com/a/VV4XN
  • 您将脚本附加到了哪个游戏对象?它需要附加到 GameOver 游戏对象,如果没有,你会得到异常。

标签: unity3d text 2d unity5


【解决方案1】:

我看过教程,他们有以下代码:

if (!isValidGridPos()) {
    Debug.Log("GAME OVER");
    Destroy(gameObject);
}

这是有效的,因为它会打印到调试日志控制台。您显然想捕获它并将其打印在屏幕上。这需要将画布和文本组件添加到脚本所在的游戏对象中。在这里声明一个文本变量不会为游戏对象添加一个,它必须在统一检查器中完成。

以下代码:

if (Input.GetKeyDown(KeyCode.R))
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

不应该在这里,因为该对象已经被销毁,除非您在创建对象的同一帧中按住键,否则该代码将变得无用。相反,它应该在不会被销毁的游戏对象上的另一个脚本中打开,并且它将等待 r 键重新加载关卡。

【讨论】:

    【解决方案2】:

    如果 text = GetComponent&lt;Text&gt;(); 不起作用,可能是因为您的 Text 组件不在您的脚本所附加到的同一个游戏对象上。

    在 Unity 编辑器中,检查文本组件和您的脚本是否在同一个游戏对象上

    【讨论】:

      【解决方案3】:

      您是否在运行时检查了编辑器视图?
      不要在 Strar() 中使用破坏。 您可以像 Destroy(gameobject, 5.0f) 这样设置延迟,并将其用于其他回调函数(例如 Action)。

      现在您只需在初始化后立即销毁整个游戏对象的所有脚本和组件(包括文本)。如果它从一开始就在场景中,那么它会在您按下播放时立即销毁。

      Start() 只运行一次,那么 isValidGridPos() 做了什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        相关资源
        最近更新 更多