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

Unity Event金币更新异常问题:预制体生成恶魔击杀后金币不更新原因排查

问题原因与解决方案

嘿,这问题我熟!核心原因很简单:你给场景中初始存在的恶魔手动绑定了onChangeMoney事件,但预制体生成的恶魔没有这个绑定,导致死亡时触发的事件根本没地方去调用Player的金币更新方法。

具体原因拆解

  • 场景里一开始就有的恶魔,你应该是在Unity编辑器的Inspector面板里,把它的onChangeMoney事件拖到了PlayerObjectScript的ChangeMoney方法上,所以击杀时能正常触发金币变更。
  • 但预制体生成的恶魔不一样:如果你没在预制体内部设置事件绑定,也没在实例化后通过代码绑定,那这些恶魔的onChangeMoney事件列表是空的——调用Invoke的时候根本找不到要执行的方法,金币自然没反应。

两种解决办法

方法1:编辑器给预制体绑定(最简单)

  1. 在Project窗口里打开你的恶魔预制体,进入预制体编辑模式。
  2. 在Inspector面板找到Demon脚本的onChangeMoney事件区域。
  3. 把场景中持有PlayerObjectScript的Player对象拖到事件的对象槽里。
  4. 点击下拉菜单,选择PlayerObjectScript -> ChangeMoney(int)方法。
  5. 保存预制体。之后所有通过这个预制体生成的恶魔,都会自带这个事件绑定。

注意:如果你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:17:29