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
相关产品推荐
相关产品推荐

