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
相关产品推荐
相关产品推荐

