【发布时间】: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 我看不出承诺会有什么帮助。这不是异步代码,它不需要是异步代码。
-
是的,它不能直接解决问题,但读起来很有趣,谢谢。