ET框架数值组件设计解析:构建灵活复杂的游戏属性系统

ET框架数值组件设计解析:构建灵活复杂的游戏属性系统

ET Unity3D 客户端和 C# 服务器框架。 ET 项目地址: https://gitcode.com/gh_mirrors/et/ET

引言

在游戏开发中,尤其是MMORPG和MOBA类游戏,数值系统的设计至关重要。一个优秀的数值系统能够支撑起复杂的技能效果、属性加成和各种状态变化。ET框架提供了一套高度灵活的数值组件设计方案,完美解决了传统面向对象方法在处理复杂数值关系时的局限性。

传统数值设计方案的痛点

1. 类爆炸问题

在传统设计中,开发者通常会为每个角色类型创建单独的数值类:

class WarriorNumeric {
    public int Strength;
    // 战士特有属性...
}

class MageNumeric {
    public int Intelligence;
    // 法师特有属性...
}

这种设计会导致:

  • 类数量随着角色类型增加而急剧膨胀
  • 难以处理跨职业的通用属性
  • 代码重复严重,维护困难

2. 属性计算复杂化

每个属性可能需要多个中间值参与计算,例如:

class Numeric {
    public int Speed;          // 最终速度
    public int SpeedBase;      // 基础速度
    public int SpeedAdd;       // 速度加成值
    public int SpeedPct;       // 速度百分比加成
    // 其他数十个属性...
}

这种设计存在明显缺陷:

  • 需要为每个属性重复编写相似的计算逻辑
  • 添加新属性时代码修改量大
  • 难以统一处理属性变更事件

ET框架的数值组件设计

ET框架采用基于键值对的数值存储方案,完美解决了上述问题。

核心数据结构

public class NumericComponent : Component {
    public readonly Dictionary<int, int> NumericDic = new Dictionary<int, int>();
    
    // 其他方法...
}

这种设计的关键优势:

  • 使用字典存储,避免定义大量字段
  • 按需添加属性,不使用的属性不占用空间
  • 统一的计算和事件机制

属性类型定义

public enum NumericType {
    Speed = 1000,
    SpeedBase = Speed * 10 + 1,
    SpeedAdd = Speed * 10 + 2,
    // 其他属性...
}

这种枚举设计实现了:

  • 结构化属性ID分配
  • 方便扩展新属性
  • 清晰的属性关系表达

统一计算模型

ET框架采用五层计算模型:

最终值 = (((基础值 + 加成值) * (100 + 百分比) / 100) + 最终加成) * (100 + 最终百分比) / 100

这种模型的优势:

  • 一套公式处理所有属性计算
  • 支持多种叠加方式
  • 计算过程透明可控

实际应用示例

1. 属性变更处理

当速度相关属性变化时:

// 增加基础速度
numericComponent[NumericType.SpeedBase] = 100;

// 增加20%速度加成
numericComponent[NumericType.SpeedPct] = 20;

系统会自动触发计算并更新最终速度值。

2. 属性变更监听

可以轻松监听特定属性的变化:

[NumericWatcher(NumericType.Hp)]
public class HpWatcher : INumericWatcher {
    public void Run(long id, int value) {
        if (value > 1000) {
            // 处理血量超过1000的逻辑
        }
    }
}

这种监听机制非常适合用于:

  • 成就系统
  • 属性变化特效
  • 异常检测
  • 实时UI更新

设计优势总结

  1. 灵活性:按需添加属性,适应各种游戏角色需求
  2. 扩展性:新增属性只需扩展枚举,不影响现有代码
  3. 统一性:所有属性使用相同计算和事件机制
  4. 性能:字典存储高效,避免不必要的内存占用
  5. 可维护性:代码简洁,逻辑集中,易于调试

最佳实践建议

  1. 属性ID规划:合理规划NumericType的数值范围,为不同类型属性预留空间
  2. 默认值处理:在Awake方法中初始化必要的基础值
  3. 性能优化:对于频繁变更的属性,考虑批量更新机制
  4. 数值精度:根据游戏需求确定合适的数值精度(如使用整数还是浮点数)

结语

ET框架的数值组件设计为复杂游戏系统提供了坚实的基础。通过键值存储和统一计算模型,开发者可以专注于游戏逻辑的实现,而不必担心底层数值系统的复杂性。这种设计思路不仅适用于游戏开发,对于其他需要复杂数值管理的应用场景也有很好的参考价值。

ET Unity3D 客户端和 C# 服务器框架。 ET 项目地址: https://gitcode.com/gh_mirrors/et/ET

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏庭彭Maxine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值