找到一个合适的问题标题和这个问题的标签让我很难接受。
基本上我已经建立了一个游戏,其中将出现几个单位/小怪。现在我对构建系统很感兴趣,因此每个单元都可以应用效果/增益/减益效果来修改单元的属性。这种效果的例子可能是霜效应,它会降低装置的移动速度,促进健康等等。计划是通过脚本实现这些效果,因此可以创建自定义用户效果。
我正在寻找有关如何实现这一点的建议。现在我已经考虑过创建一个效果类。然后每个应用的效果都是类的一个实例,并且会引用它所应用的单位。效果将至少有两种方法,分别适用和不应用的应用和取消应用方法。
问题在于,它不允许累积百分比的不同方式。比如,如果100等于120或121,则应该增加10%10%。
不是真的很重要,但它是用C#编码的
答案 0 :(得分:5)
您正在使用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
如果您有这么多效果,这会变得效率低下,请在每次添加或删除效果时缓存这些值并重新计算它们。
答案 1 :(得分:3)
您是否考虑过Decorator模式?可以在此tutorial中找到一个实例。
我写了一个小例子来说明你的具体情况。类 UnitWithPowerUp 接受 Unit 对象(可能已经或可能尚未对其进行修饰)。当你在这个类上调用Health()时,它会获得 Unit 的运行状况,并将默认值增加10%。如果你装饰了两次,它将返回121.调用GetDescription( )在单个装饰的单元上返回“Unit + Power Up”。同样,双重装饰的单元会返回“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的副本。
答案 2 :(得分:0)
如果您计划编写脚本以执行某些效果(对于具有大量效果的游戏可能会很好),您可以继续利用C#在运行时编译的能力Reference 。从本质上讲,您可以在C#中编写所需的所有内容,将字节代码保存在某处(可能作为级别文件或扩展包或其他内容的一部分),然后在每次关闭时执行相应的C#代码。
答案 3 :(得分:0)
在进行对象状态需要动态更改的游戏时,请查看组件系统/实体系统设计。
到目前为止,我见过的有关此主题的最佳文章是