首页 > 解决方案 > 第一次更改文本有效,但之后我得到 NullReferenceException: Object reference not set to an instance of an object

问题描述

我正在统一开发一款游戏,我需要更改一些 UI 文本来显示玩家的钱。第一次在启动函数中更改它正常工作,但是当我尝试从不同的函数(在同一个类中)更改它时,它给了我以下错误:NullReferenceException:对象引用未设置为对象的实例

这是运行代码的类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class money : MonoBehaviour
{
    public static money instance = new money();

    private float Money = 100;
    public Text MoneyText;

    void Start()
    {
        setText();
    }

    public void setMoney (float mon)
    {
        Money += mon;
        setText();
    }

    public float getMoney ()
    {
        return Money;
    }

    public void setText ()
    {
        MoneyText.text = Money.ToString();
    }
}

这是导致错误的调用 setMoney 的代码:

money.instance.setMoney(-turretBuildCost);

我希望有人遇到同样的问题并且可以帮助我。

标签: c#unity3d

解决方案


所以你试图使用你创建的静态实例来更新你的 MoneyText,但是这个静态实例从来没有设置 MoneyText 属性,因为你设置 MoneyText 的唯一地方是你通过脚本附加到的 GameObject统一编辑器。

第一种方法,如果您想尝试保持单例模式,请执行以下操作:

public class money : MonoBehaviour
{
    public static money instance = new money();

    private float Money = 100;
    public Text MoneyText;

    void Start()
    {
        instance.MoneyText = MoneyText;
        setText();
    }

    ...
}

这将使用您已经设置的对象的属性设置 MoneyText 属性。

第二种方法是,如果您想避免使用单例模式,则必须从 GameObject 获取组件以获取实例以从中调用 SetMoney。

像这样:

YourGameObject.GetComponent<money>().setMoney(5.00);

推荐阅读