【问题标题】:Pattern for handling execution order of multiple callbacks处理多个回调的执行顺序的模式
【发布时间】:2015-10-06 01:48:17
【问题描述】:

我正在用 C# (Unity) 开发一个角色扮演游戏,它带有一个用于游戏逻辑和改装的 Lua 脚本前端。我有一个一直在思考的设计问题,但似乎找不到答案。我正在实现一个效果类,它提供了一个通用接口来定义和处理影响冠军或生物的效果,无论是由于咒语、附魔物品还是条件(瘫痪、害怕......)。目标是尽可能灵活,并将效果代码与实际的冠军组件/类分离。

我希望效果可以访问回调,以便它可以改变实体发生的事情。例如,如果角色健康状况发生变化,则主动效果可以在应用之前启动并更改该更改。以下是 Lua 中的两个示例,API 应该是不言自明的:

生命损失减半之戒:

onHealthAdjustment = function(entity, val)
    if val < 0 then val = math.floor(val / 2); end
    return val;
end

法力护盾法术:

onHealthAdjustment = function(entity, val)
    if val < 0 then
        championProperties = entity.championProperties;
        if championProperties then
            championProperties:adjustMana(val);
        end
        return 0;
    else
        return val;
    end
end

很好,但是如何处理回调的执行顺序呢?

假设冠军失去 10 点生命值。如果戒指首先得到处理,它会将其降低到 5,然后该法术会将生命损失降低到 0,并改为移除 5 法力值。

如果该法术首先被处理,它会将生命值损失减少到 0,移除 10 点法力值,然后环回调得到 0 并且什么都不做。

我可以添加一个效果优先级变量,但总会有一些具有相同值的变量。以最后应用的第一顺序进行处理,或最后应用的处理只会导致愚蠢的漏洞利用,例如选择并单击库存中的项目以确保处理效果的顺序......我看不出有什么方法可以调用并行回调而不是顺序回调...

我要么没有看到修复当前模式的明显方法,要么我需要更改为另一种设计模式。我已经阅读了策略和观察者模式,但似乎找不到明确的答案。这些案件通常如何处理?

谢谢!

【问题讨论】:

  • 你可能对promises感兴趣
  • @MikeCorcoran 我看不出承诺会有什么帮助。这不是异步代码,它不需要是异步代码。
  • 是的,它不能直接解决问题,但读起来很有趣,谢谢。

标签: c# unity3d lua


【解决方案1】:

总会有一些相同的值

所以?如果发生碰撞,请修复它。应用效果的顺序不是任意的,它是您设计的一部分

大概在您的代码中,您有每个事件类型的事件处理程序列表,您可以在事件发生时对其进行迭代。只要确保该列表的顺序正确(例如,通过控制它们的注册顺序)就可以了。


旁注。如果你不知道,这个:

 onHealthAdjustment = function(entity, val) end

可以这样写:

 function onHealthAdjustment(entity, val) end

【讨论】:

  • 好吧,由于这方面对改装开放,我无法最终控制设计。系统必须灵活并且能够处理冲突。但是,如果事件调用者不知道回调作为脚本包含什么,我该如何“修复它”呢?
  • PS:顺便说一句,是的,我知道,在这种情况下,这些函数被定义为表格的一部分,因此语法:effect = { someVariable = 4, someOtherVariable = "hello", onUpdate = function() ... end, onHealthAdjustment = function() ... end, }
  • 您控制初始设计。关键是健康调整回调应该通过一些管理订单的机制(例如“addHealthAdjustmentCallback”)注册。 FIFO 与任何其他方案一样有意义,除非您希望允许用户在任意位置插入。
  • 感谢您的建议。我想我将实现一种方法,其中可以将回调分组在顺序无关紧要的可置换类中,但通过设计决定更高级别的执行顺序。例如,首先将所有修饰符(+ 或 -)放在一起,然后将所有乘数(* 或 /)放在一起,然后所有替换效果最后进入 FIFO。回调对象将为控制器提供有关它打算执行的操作类型的信息。
猜你喜欢
  • 2016-03-12
  • 2013-11-24
  • 2023-03-27
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多