Unity跨脚本访问Bool变量遇NullReferenceException异常求助
排查Unity空引用异常(NullReferenceException)问题
嘿,我来帮你搞定这个空引用的问题!你遇到的NullReferenceException本质是lepertriggerinstance这个变量没有被正确赋值,导致你在第17行访问它的属性时出错了。咱们一步步来分析和修复:
问题根源分析
你的报错行是if(lepertriggerinstance.GetComponent<LeperTrigger>().IsOnLeper == true),这里有两个核心问题:
lepertriggerinstance为null:你的Start方法里用GameObject.FindWithTag("enemy")获取对象,但要么场景里没有带enemy标签的物体,要么带标签的物体上没挂LeperTrigger脚本,导致lepertriggerinstance没被正确初始化。- 冗余的
GetComponent调用:你已经在Start里把lepertriggerinstance赋值为LeperTrigger组件了,完全没必要再调用一次GetComponent,这属于画蛇添足,还会增加出错概率。
修复步骤
第一步:检查场景中的标签和组件挂载
打开Unity编辑器,找到你希望关联的敌人物体:
- 确认它的标签严格是
enemy(注意大小写,Unity标签区分大小写,别写成Enemy或者ENEMY); - 确认这个物体的Inspector面板里已经挂载了
LeperTrigger脚本。
第二步:修正LeperAI脚本代码
下面是优化后的代码,增加了容错判断,避免空引用,同时简化了逻辑:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LeperAI : MonoBehaviour { public LeperTrigger lepertriggerinstance; void Start() { // 先查找带标签的物体,增加容错日志 GameObject enemyObject = GameObject.FindWithTag("enemy"); if (enemyObject != null) { lepertriggerinstance = enemyObject.GetComponent<LeperTrigger>(); if (lepertriggerinstance == null) { Debug.LogError("警告:带enemy标签的物体上没有挂载LeperTrigger脚本!"); } } else { Debug.LogError("警告:场景中找不到带有enemy标签的物体!"); } } void Update() { // 先判断实例不为null,再检查变量状态 if (lepertriggerinstance != null && lepertriggerinstance.IsOnLeper) { Debug.Log("Leper jump"); } } }
额外优化建议
- 更可靠的赋值方式:如果你不想用标签查找,可以直接在Unity编辑器里,把挂载了
LeperTrigger脚本的物体拖到LeperAI组件的lepertriggerinstance字段上,这样完全避免了查找失败的问题; - 完善碰撞逻辑:当前
LeperTrigger的OnCollisionEnter2D只会在碰撞开始时把IsOnLeper设为true,如果玩家离开物体,这个变量不会变回false。你可以添加OnCollisionExit2D方法来重置变量:private void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject.tag == "Player") { IsOnLeper = false; } }
内容的提问来源于stack exchange,提问作者FRP72




