You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity调用其他脚本方法更新预制体文本时遇空引用异常求助

问题分析与解决方案

空引用异常的核心原因及修复步骤

1. Turret类静态实例未初始化

你的Turret.main是静态变量,但从未被赋值,调用Turret.main.GetNewUpgCost()时会因main为null触发空引用。

修复:在Turret类中添加Awake方法初始化静态实例:

public class Turret : MonoBehaviour
{
    public static Turret main;
    [SerializeField] private int baseUpgCost = 75;
    [SerializeField] private int level = 1; // 补充level变量定义,否则GetNewUpgCost会编译报错

    private void Awake()
    {
        main = this; // 初始化静态实例
    }

    public int GetNewUpgCost()
    {
        return Mathf.RoundToInt(baseUpgCost * Mathf.Pow(level, 2f));
    }
}

2. UpgradeUIScript中的cost组件未绑定

打开Unity编辑器,检查挂载UpgradeUIScript的预制体对象,确认是否将TextMeshProUGUI组件拖入了cost字段的Inspector面板中。如果未绑定,cost变量为null,赋值cost.text时会触发空引用。

3. 替换OnGUI方法(推荐优化)

OnGUI是Unity旧UI系统的回调,与UGUI(TextMeshProUGUI属于UGUI)混用并不合适,建议改用Update方法,并增加空值判断避免异常:

public class UpgradeUIScript : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI cost;

    private void Update()
    {
        if (Turret.main != null)
        {
            cost.text = "Cost: " + Turret.main.GetNewUpgCost().ToString();
        }
    }
}

4. 补充Turret类的level变量

你的GetNewUpgCost()方法中使用了level变量,但原代码未定义该变量,必须在Turret类中声明(示例中已添加[SerializeField] private int level = 1;),否则会出现编译错误。

内容的提问来源于stack exchange,提问作者SJC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:50:03