提问人:Tagor 提问时间:6/22/2021 更新时间:6/22/2021 访问量:131
订阅作为参数传递的操作 [duplicate]
Subscribing to an action passed as an argument [duplicate]
问:
这个问题在这里已经有答案了:
如何在运行时操作委托的调用列表? (2 个答案)
为什么 Delegate 不能在容器中添加带有引用的侦听器 (2 个答案)
使用 ref 传递委托 (2 个答案)
2年前关闭。
我正在用 C# 为游戏制作有限状态机 (FSM)。目标是使其尽可能独立于传统控制流。我目前正在尝试用它创建枪支行为。 当枪进入“弹药不足”状态时,它应该开始侦听何时添加弹药并自动将状态更改为重新加载,但我在使用 C# 语言时遇到了一些问题。
我基本上想将一个 Action 传递给另一个函数。在该函数中,我想订阅它:
var outOfAmmo = new ListenerState<GunState>(GunState.OUT_OF_AMMO);
outOfAmmo.AddTrigger(currentAmmo.OnAdded, GunState.RELOAD);
功能:
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
}
当调用 OnEnter 和稍后的触发器时,我希望调用 setState,但事实并非如此。
拉出 AddTrigger 的内容可使一切按预期工作:
outOfAmmo.AddTrigger(currentAmmo.OnAdded, GunState.RELOAD);
Action setReload = () => fsm.SetState(GunState.RELOAD);
outOfAmmo.OnEnter += () => currentAmmo.OnAdded += setReload;
outOfAmmo.OnExit += () => currentAmmo.OnAdded -= setReload;
我在这里举了一个较小的例子来说明这个问题:https://dotnetfiddle.net/MG1tve
我不确定这是怎么回事。
默认情况下,操作是否按值 :O 传递?因为作为 ref 传递可以解决问题 (https://dotnetfiddle.net/XNresg)
答: 暂无答案
评论
trigger
trigger
OnAdded
ref