修改类的属性

找到一个合适的问题标题和这个问题的标签让我很难接受。

基本上我已经建立了一个游戏,其中将出现几个单位/小怪。 现在我对构建系统很感兴趣,因此每个单元都可以应用效果/增益/减益效果来修改单元的属性。 这种效果的例子可能是霜效应,它会降低装置的运动速度,促进健康等等。 计划是通过脚本实现这些效果,因此可以创建自定义用户效果。

我正在寻找有关如何实现这一点的建议。 现在我已经考虑过创建一个效果类。 然后每个应用的效果都是该类的一个实例,并且将引用它所应用的单位。 该效果将至少有两种方法,分别应用和取消应用的应用和取消应用方法。

问题在于,它不允许累积百分比的不同方式。 比如,应该两次10%增加值100等于120或121。

并不是真的很重要,但它是用C#编码的

您正在使用Effect类进入正确的轨道。 但是要保留每个单元的效果列表,而不是将效果引用到单位。 如果要获取属性值,请查询所需的属性值,而不是使用apply()和unapply()函数来修改基值(这可能导致基础值因浮点错误等而漂移)等等。

您的Effect类可以有一个方法Modify(),它将输入值作为浮点值,并返回修改后的值。 查询属性最终看起来像这个伪代码:

def get_movement_speed(): value = base_movement_speed() # this is intrinsic to the unit for effect in movement_speed_effects_list: value = effect.modify(value) return value 

万一你有这么多效果,效率低下,每次添加或删除效果时都要缓存值并重新计算它们。

你考虑过装饰者模式吗? 可以在本教程中找到一个实例。

我写了一个小例子来说明你的具体情况。 UnitWithPowerUp类接受一个Unit对象(可能已经或可能没有被装饰)。 当你在这个类上调用Health()时,它会获得Unit的运行状况,并将默认值增加10%。如果你装饰了两次,它将返回121.在单个装饰单元上调用GetDescription()会返回“单位+加电”。 同样,双重装饰单元返回“Unit + Power Up + Power Up”。

  public abstract class Unit { public virtual string GetDescription() { return "Unit"; } public virtual double Cost() { return 100; } } public abstract class EffectDecorator : Unit { public EffectDecorator() { } } public class UnitWithPowerUp : EffectDecorator { Unit unit; public UnitWithPowerUp(Unit unit) { this.unit = unit; } public override string GetDescription() { return unit.GetDescription() + " + Power Up"; } public override double Health() { return unit.Health() * 1.10; } } 

我没有测试过代码或任何东西,只是为了展示这个概念。 如果您认为这很有用,我建议您获得Head First Design Patterns的副本。

如果您计划使用脚本来执行某些效果(对于具有大量效果的游戏可能会很好),您可以继续使用C#在运行时参考期间编译的能力。 本质上,您可以在C#中编写所需的所有内容,将字节代码保存在某处(可能作为级别文件或扩展包或其他任何内容的一部分),然后在每次关闭时执行相应的C#代码。

在进行对象状态需要动态更改的游戏时,请查看组件系统/实体系统设计。

到目前为止,我见过的关于这个主题的最佳文章是

http://www.devmaster.net/articles/oo-game-design/