在我的游戏中,我有一个脚本附加到游戏对象(手枪-父对象-)的子对象(枪口)上,该脚本经常变为 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 表达式时有点起作用(!)。