C# 修改类的属性

C# 修改类的属性,c#,C#,为这个问题找到一个合适的题目和标签给了我很大的打击 基本上,我已经建立了一个游戏,其中有几个单位/怪物将出现。现在我感兴趣的是建立一个系统,这样每个单位都可以应用效果/增益/减益来修改单位的属性。这种效果的例子可能是霜冻效果,它会减慢单位的移动速度,提高生命值等等。计划是通过脚本实现这些效果,以便能够创建自定义用户效果 我正在寻求关于如何实现这一点的建议。现在我考虑创建一个特效类。然后,每个应用的效果将是类的一个实例,并且将有一个对其应用到的单元的引用。该效果至少有两种方法,分别用于应用和取消应

为这个问题找到一个合适的题目和标签给了我很大的打击

基本上,我已经建立了一个游戏,其中有几个单位/怪物将出现。现在我感兴趣的是建立一个系统,这样每个单位都可以应用效果/增益/减益来修改单位的属性。这种效果的例子可能是霜冻效果,它会减慢单位的移动速度,提高生命值等等。计划是通过脚本实现这些效果,以便能够创建自定义用户效果

我正在寻求关于如何实现这一点的建议。现在我考虑创建一个特效类。然后,每个应用的效果将是类的一个实例,并且将有一个对其应用到的单元的引用。该效果至少有两种方法,分别用于应用和取消应用的apply和unapply方法

问题是,它不允许以不同的方式累积百分比。例如,如果值100等于120或121,则应增加两倍10%

这并不重要,但它是用C#

编码的。你考虑过这种模式吗?这是一个实际的例子

我写了一个小例子来说明你的具体情况。UnitWithPowerUp类接受一个Unit对象(该对象可能已装饰,也可能尚未装饰)。在这个类上调用Health()时,它会获取单元的运行状况,并在默认值100的基础上增加10%。如果你装饰了它两次,它将返回121。对单个装饰单元调用GetDescription()将返回“单元+加电”。同样,双装饰单元返回“单元+加电+加电”


我没有测试过代码或其他东西,只是为了展示概念。如果您认为这很有用,我建议您获取一份。

您使用特效类的方法是正确的。但是,在每个单位上保留一个效果列表,而不是在每个单位上都有效果。如果要获取属性值,请查询所需的属性值,而不是使用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

如果不太可能出现效果太多而导致效率低下的情况,请缓存这些值,并在每次添加或删除效果时重新计算这些值。

如果您计划编写脚本以实现某些效果(这对于具有一系列效果的游戏来说可能很好),您可以继续并利用C#在运行时编译的能力。基本上,你可以在C#中编写你想要的所有代码,将字节码保存在某个地方(可能作为级别文件或扩展包的一部分或其他任何内容),然后每次C#码关闭时都执行相应的C#码。

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

到目前为止,我看过的关于这个话题的最好的文章是


我不确定这对我有什么帮助。动态地向类添加新的或附加的行为或属性是装饰器模式的定义,类似于将“效果”添加到“单位”。但在运行时更改这些属性并不合适,这就是他需要的。这比我的答案更有意义+1.
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