Unity中SpawnManager类tree_count变量在不同方法中值异常问题求助
问题分析与解决方案
这问题的核心原因很明确:你的TreeBehaviour脚本在调用Tree_destroyed()时,访问的是一个和Update()里完全不同的SpawnManager实例!
为什么会出现这个现象?
你场景里的SpawnManager实例在Start()方法中把tree_count初始化为500,所以它的Update()能正常打印500;但TreeBehaviour里的spawnManager变量引用的是另一个SpawnManager对象(大概率是你不小心把项目面板里的SpawnManager预制体拖进了这个字段,而不是场景中正在运行的那个实例)。这个“错误实例”的tree_count从来没被执行过Start()初始化,保持着int类型的默认值0——所以调用Tree_destroyed()时会从0开始递减,和场景中正常实例的500完全无关。
快速排查与修复
方案1:检查并修正引用
在Unity编辑器中选中挂载TreeBehaviour的游戏对象,查看Inspector面板里的spawnManager字段:
- 确保这里拖入的是场景中挂载了
SpawnManager的那个游戏对象,而不是项目面板里的预制体或者其他无关对象。
方案2:改用单例模式(更稳妥,推荐)
手动拖引用很容易出错,改用单例模式可以确保全局只存在一个SpawnManager实例,任何地方都能精准访问它:
修改SpawnManager脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnManager : MonoBehaviour { // 全局唯一实例 public static SpawnManager Instance; private int tree_count; void Awake() { // 确保场景中只有一个SpawnManager实例 if (Instance == null) { Instance = this; // 如果需要跨场景保留该实例,可以添加这句:DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } void Start() { tree_count = 500; } void Update() { if (Time.time < 3.05) { print(tree_count); } } public void Tree_destroyed() { tree_count--; print(tree_count); } }
然后修改TreeBehaviour的OnDestroy方法,不用再依赖手动赋值的spawnManager变量:
private void OnDestroy() { SpawnManager.Instance.Tree_destroyed(); }
这样不管你在场景里怎么实例化对象,调用的都是同一个SpawnManager实例的方法,变量值也会保持一致。
内容的提问来源于stack exchange,提问作者eClySe
相关产品推荐
相关产品推荐

