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

问题描述 投票:0回答:0

在我的游戏中,我有一个脚本附加到游戏对象(手枪-父对象-)的子对象(枪口)上,该脚本经常变为 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");
    }
}

我仅在父对象停用时触发“OnSpeedIncreased”统一事件。在这个版本的代码中,它在激活和不激活时打印“启用”和“禁用”,但无论我触发统一事件多少次,都不会打印“增加”或更改 speedTime 的值。我确定触发了统一事件,因为我在另一个脚本中测试了它 - 附加到一个从未启用 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");
}

而不是根本不工作,如果对象是第一次停用,它会在我每次触发事件时打印一次“增加”,这是应该的。但如果它再次处于活动和非活动状态,则每次触发事件时,它都会打印两次或与此循环发生次数相同的次数。

我不明白为什么它一开始写在方法中不起作用,也不明白为什么它在写成 lambda 表达式时有点起作用(!)。

这是脚本所属位置的图片。 Muzzle Object

c# unity3d lambda game-development observer-pattern
© www.soinside.com 2019 - 2024. All rights reserved.