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

Unity问题:MoneyCounterController类的SetPlayerMoney方法在特定类中失效

解决BuildingController中调用MoneyCounterController.SetPlayerMoney()无效的问题

先把你提供的BuildingController代码格式化出来,方便咱们分析:

public class BuildingController : MonoBehaviour { 
    private BuildingControllerUtils buildingUtils; 
    public MoneyCounterController moneyCounterController; 

    // Use this for initialization 
    void Start () { 
        buildingUtils = new BuildingControllerUtils(this, "Edificio", "InGame/Edific...

咱们从Unity开发中这类问题的常见原因逐一排查:

1. 公共引用未在编辑器中赋值(最常见)

你用public MoneyCounterController moneyCounterController;声明了一个公共组件引用,但如果在Unity编辑器里没把场景中的MoneyCounterController实例拖到这个字段上,调用方法时会直接触发NullReferenceException,方法自然完全不会执行。

解决步骤:

  • 选中挂载了BuildingController的游戏对象,打开Inspector面板
  • 找到moneyCounterController字段,把场景中挂载了MoneyCounterController的对象拖拽到这个字段的赋值框里
  • 或者如果场景中只有一个MoneyCounterController实例,也可以在Start()里通过代码自动查找:
    void Start () { 
        buildingUtils = new BuildingControllerUtils(this, "Edificio", "InGame/Edific...
        moneyCounterController = FindObjectOfType<MoneyCounterController>();
    }
    

2. SetPlayerMoney()方法本身的逻辑缺陷

有可能方法本身的实现有问题,导致调用后没有预期效果。比如方法里有条件判断拦截了逻辑,或者没有正确更新UI/数据:

检查方向:

  • 打开MoneyCounterController,查看SetPlayerMoney()的实现,比如是否有类似这样的限制:
    public void SetPlayerMoney(int newMoney) {
        // 如果传入负数直接返回,就会导致某些调用无效
        if (newMoney < 0) return; 
        playerMoney = newMoney;
        // 有没有忘记更新显示的UI?
        // UpdateMoneyDisplay();
    }
    
  • 给方法里加日志或断点,确认是否接收到了正确的参数,以及内部逻辑是否完整执行:
    public void SetPlayerMoney(int newMoney) {
        Debug.Log($"SetPlayerMoney called with value: {newMoney}");
        playerMoney = newMoney;
        UpdateMoneyDisplay();
    }
    

3. 脚本生命周期顺序问题

如果MoneyCounterController的初始化逻辑(比如Awake()或Start()里的代码)还没执行完,BuildingController就调用了SetPlayerMoney(),可能会导致数据没有被正确处理。

解决方法:

  • 把调用SetPlayerMoney()的时机延后,比如用协程等待一帧:
    void Start () { 
        buildingUtils = new BuildingControllerUtils(this, "Edificio", "InGame/Edific...
        StartCoroutine(CallSetPlayerMoneyAfterFrame());
    }
    
    IEnumerator CallSetPlayerMoneyAfterFrame() {
        yield return null; // 等待一帧
        moneyCounterController.SetPlayerMoney(yourMoneyValue);
    }
    
  • 或者在Unity的Project Settings -> Script Execution Order中,把MoneyCounterController的执行顺序调到BuildingController之前。

4. BuildingControllerUtils初始化导致的异常

你的Start()方法里先初始化了buildingUtils,如果这个构造函数执行时抛出了异常,会导致Start()后续的代码(包括调用SetPlayerMoney()的部分)无法执行。

检查方法:

  • 在Start()里添加日志,确认方法是否执行完全:
    void Start () { 
        Debug.Log("BuildingController Start started");
        buildingUtils = new BuildingControllerUtils(this, "Edificio", "InGame/Edific...
        Debug.Log("BuildingController Start finished");
        // 这里调用SetPlayerMoney
    }
    
  • 如果日志只打印了前一句,说明BuildingControllerUtils的构造函数有问题,需要排查它的实现。

内容的提问来源于stack exchange,提问作者alex55132

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:35:37