订阅作为参数传递的动作

问题描述

我正在用 C# 为游戏制作一个有限状态机 (FSM)。目标是使其尽可能独立于传统控制流。我目前正在尝试用它创建枪支行为。 当枪进入“弹药用完”状态时,它应该开始监听添加弹药并自动将状态更改为重新加载,但我在使用 C# 语言时遇到了一些问题。

我基本上想将一个 Action 传递给另一个函数。在该功能中,我想订阅它:

data = [False,False,False]
print(sum(data)!=0) #False

功能:

  var outOfAmmo = new ListenerState<GunState>(GunState.OUT_OF_AMMO);
  outOfAmmo.AddTrigger(currentAmmo.OnAdded,GunState.RELOAD);

当 OnEnter 和后来的触发器被调用时,我希望 setState 被调用但它不是。

拉出 AddTrigger 的内容使一切按预期工作:

public class ListenerState<TStateID> : State<TStateID>

    ...

    public void AddTrigger(Action trigger,TStateID next)
    {
        Action setState = () => fsm.SetState(next);
        OnEnter += () => trigger += setState; //When we enter "Out of ammo" start listening for when ammo is added.
        OnExit += () => trigger -= setState; //When we exit "Out of ammo" we don't want to change state to reloading when ammo is added anymore
    }

我在这里做了一个较小的问题示例:https://dotnetfiddle.net/MG1tve

我不确定这里发生了什么。

默认情况下是否按值传递操作:O?因为作为 ref 传递解决了问题 (https://dotnetfiddle.net/XNresg)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)