Unity Event金币更新异常问题:预制体生成恶魔击杀后金币不更新原因排查
问题原因与解决方案
嘿,这问题我熟!核心原因很简单:你给场景中初始存在的恶魔手动绑定了onChangeMoney事件,但预制体生成的恶魔没有这个绑定,导致死亡时触发的事件根本没地方去调用Player的金币更新方法。
具体原因拆解
- 场景里一开始就有的恶魔,你应该是在Unity编辑器的Inspector面板里,把它的
onChangeMoney事件拖到了PlayerObjectScript的ChangeMoney方法上,所以击杀时能正常触发金币变更。 - 但预制体生成的恶魔不一样:如果你没在预制体内部设置事件绑定,也没在实例化后通过代码绑定,那这些恶魔的
onChangeMoney事件列表是空的——调用Invoke的时候根本找不到要执行的方法,金币自然没反应。
两种解决办法
方法1:编辑器给预制体绑定(最简单)
- 在Project窗口里打开你的恶魔预制体,进入预制体编辑模式。
- 在Inspector面板找到
Demon脚本的onChangeMoney事件区域。 - 把场景中持有
PlayerObjectScript的Player对象拖到事件的对象槽里。 - 点击下拉菜单,选择
PlayerObjectScript -> ChangeMoney(int)方法。 - 保存预制体。之后所有通过这个预制体生成的恶魔,都会自带这个事件绑定。
注意:如果你的Player是动态生成的(比如场景加载后才创建),这种方法会失效——因为预制体绑定的是编辑器里的场景对象引用,动态生成的Player是新实例,引用对不上。这时候用下面的方法。
方法2:代码动态绑定(更灵活)
在Demon脚本里添加一段代码,在恶魔实例化后自动找到Player并绑定事件:
[SerializeField] public UnityEventInt onChangeMoney; void Awake() { // 找到Player的Money脚本实例,这里用标签查找更可靠(记得给Player加"Player"标签) GameObject playerObj = GameObject.FindWithTag("Player"); if (playerObj != null) { PlayerObjectScript playerMoney = playerObj.GetComponent<PlayerObjectScript>(); // 先移除旧绑定(防止重复绑定),再添加新绑定 onChangeMoney.RemoveListener(playerMoney.ChangeMoney); onChangeMoney.AddListener(playerMoney.ChangeMoney); } else { Debug.LogError("找不到带Player标签的对象,请检查Player的标签设置!"); } } void DeathProcess() { onChangeMoney.Invoke(deathCost); ... }
这种方法不管Player是场景初始存在还是动态生成,都能正确绑定事件,适合复杂场景。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

