Unity跨脚本引用bool变量失败,寻求解决方案
Unity中正确访问Hunter脚本的sniped变量并触发生成逻辑
错误根源
sniped是Hunter类的非静态公共字段,它属于类的具体实例对象,而非类本身。你当前用Hunter.sniped直接通过类名访问的写法,是在试图调用静态成员,这和变量的定义冲突,所以报错。
解决方案1:使用Inspector已赋值的实例引用
你已经在Inspector里给Spawner的script变量绑定了Hunter实例,直接通过这个实例访问sniped即可:
修改Spawner的Update方法:
void Update() { // 先判断实例是否有效,再检查变量状态 if (script != null && script.sniped) { // 这里添加生成物体的逻辑,示例: Instantiate(enemy, transform.position, Quaternion.identity); // 如果只需要触发一次生成,重置变量避免重复执行 script.sniped = false; } }
解决方案2:动态获取Hunter组件(无需Inspector赋值)
如果不想手动绑定引用,可以在Spawner的初始化方法里自动查找Hunter对象并获取组件:
void Start() { // 给Hunter对象添加"Hunter"标签,然后通过标签查找 GameObject hunterObj = GameObject.FindWithTag("Hunter"); if (hunterObj != null) { script = hunterObj.GetComponent<Hunter>(); } }
隐藏问题:Hunter销毁导致变量无法被检测
你的Hunter脚本中,OnTriggerEnter2D里执行了Destroy(gameObject)销毁自身,这会导致即使设置了sniped = true,Spawner的引用也会立刻变为null,无法检测到变量变化。可以通过以下两种方式修复:
方式1:延迟销毁Hunter
给销毁操作加延迟,让Spawner有足够时间检测到变量:
public void OnTriggerEnter2D(Collider2D collision) { Debug.Log("hit"); Destroy(enemy); sniped = true; // 延迟0.1秒销毁自身,确保Spawner检测到状态变化 Destroy(gameObject, 0.1f); }
方式2:将sniped改为静态变量(适合简单场景)
如果你的场景中只有一个Hunter对象,可以把变量声明为静态,这样即使对象销毁,变量状态依然保留:
// 在Hunter脚本中修改变量定义 public static bool sniped = false;
此时Spawner中原来的if (Hunter.sniped == true)写法就可以正常使用,但静态变量属于类本身,多Hunter场景下会出现状态冲突,需谨慎使用。
内容的提问来源于stack exchange,提问作者JaketheJeff
相关产品推荐
相关产品推荐

