处理多个回调的执行顺序的模式

时间:2015-07-16 14:32:39

标签: c# unity3d lua

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

我希望效果能够访问回调,以便它可以改变实体发生的变化。例如,如果角色健康状况发生变化,则活动效果可以启动并在应用之前更改该更改。以下是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并且什么都不做。

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

  

总会有一些具有相同价值的

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

据推测,在您的代码中,每个事件类型都有一个事件处理程序列表,您可以在事件发生时进行迭代。只需确保列表的顺序正确(例如,通过控制他们的注册顺序),您就完成了。

旁注。如果您不知道,请:

 onHealthAdjustment = function(entity, val) end

可以这样写:

 function onHealthAdjustment(entity, val) end