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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:58:13