为什么观察者模式在Unity3d项目中不能正常工作?

tzdcorbm  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(118)

在我的游戏中,我有一个脚本附加到游戏对象(Pistol -父对象-)的子对象(枪口),它经常变为SetActive(false)和SetActive(true)。

public class Pistol : BaseBulletSpawner
{
    public override void Start()
    {
        speedTime = 0.5f;
        maxBulletCount = 15;
        currentBulletCount = maxBulletCount;
    }

    private void OnEnable()
    {
        EventManager.OnSpeedIncrease.AddListener(PistolSpeedIncrease);
        Debug.Log("enable");
    }

    private void OnDisable()
    {
        EventManager.OnSpeedIncrease.RemoveListener(PistolSpeedIncrease);
        Debug.Log("disable");
    }

    private void PistolSpeedIncrease()
    {
        speedTime -= 0.05f;
        Debug.Log("increased");
    }
}

我触发'OnSpeedIncreated'统一事件只有当父对象被停用。在这个版本的代码中,当它变为活动和非活动时,它打印“启用”和“禁用”,但无论我触发了多少次unity事件,都不会打印“increased”或更改speedTime的值。我确信unity事件被触发了,因为我在另一个脚本中测试过-附加到一个从未启用false的游戏对象上-而且它起作用了。
还有一个更令人困惑的问题。如果我像这样重新创建:

private void OnEnable()
{
    EventManager.OnSpeedIncrease.AddListener(() => Debug.Log("increased"));
    Debug.Log("enable");
}

private void OnDisable()
{
    EventManager.OnSpeedIncrease.RemoveListener(() => Debug.Log("increased"));
    Debug.Log("disable");
}

如果对象是第一次停用,它会在每次触发事件时打印“增加”一次,而不是完全不工作。2但是如果它是活动的,然后又是非活动的,这一次它会在每次触发事件时打印两次或与此循环发生的次数一样多的次数。
我不明白为什么它一开始写在方法中就不起作用,也不明白为什么它写成lambda表达式时有点起作用。
下面是脚本所属位置的图片。Muzzle Object

7ivaypg9

7ivaypg91#

从我在代码中看到的情况来看,您的代码按预期工作。
“我只在父对象停用时触发'OnSpeedIncreased'统一事件。”
您正在取消订阅事件,因此不会调用处理程序PistolSpeedIncrease
在第二种情况下,lambda不是每次都一样,这就是为什么unsubscribe不起作用,并且在每次OnEnable()调用时添加一个新的lambda处理程序。

相关问题