当前位置: 首页 > java >正文

ECS架构之Entity设计与传统OOP的碰撞思考

ECS(Entity-Component-System)架构 中,Entity(实体)本身不需要显式分类型。

这是 ECS 的核心设计思想之一:实体是纯粹的、无类型的标识符(ID),其行为和属性完全由 组合的组件(Component) 决定,而非通过类型继承或分类实现。

为什么不需要分类型?

动态组合性

实体通过添加/移除组件来改变行为,而非通过类型。例如:

  • 一个“怪物”实体可以通过添加 PlayerControlled 组件变成“玩家角色”。
  • 一个“道具”实体可以通过添加 CombatStats 组件变成“武器”。

避免类型爆炸

传统 OOP 中,类型继承会导致类层级膨胀(如 Monster → Boss → FireBoss)。ECS 中只需组合组件

// 用组件组合替代类型继承
const boss = {id: 1,components: [CombatStats, BossAI, FireEffects, LootTable]
};

系统查询的灵活性

系统通过组件组合查询实体,而非类型。例如:

  • MovementSystem 查询所有包含 Position 和 Velocity 组件的实体。
  • TurnSystem 查询所有包含 TurnOrder 组件的实体。

如何替代“类型”概念?

传统类型思维ECS 替代方案
类型继承(class Monster)组件组合([Health, AI, Sprite])
类型标签(enum EntityType)用 标记组件(如 IsPlayer)
类型检查(if (entity is Monster))查询组件(hasComponent(entity, “Health”))

实战案例:回合制战斗中的实体设计

场景需求

  • 玩家、敌人、技能、障碍物等需要不同的行为。
  • 某些敌人是“Boss”,需要特殊逻辑。

ECS 实现

实体定义(无类型)

// 玩家实体
const player = {id: 1,components: [Position, Health, PlayerControlled, Skills]
};// 普通敌人
const enemy = {id: 2,components: [Position, Health, AI, Sprite]
};// Boss 敌人(仅多一个标记组件)
const boss = {id: 3,components: [Position, Health, AI, Sprite, IsBoss, LootTable]
};

系统逻辑

  • TurnSystem:查询所有含 TurnOrder 的实体。
  • AISystem:查询含 AI 但不含 PlayerControlled 的实体。
  • BossRewardSystem:查询含 IsBoss 和 Health(且血量≤0)的实体。

动态改变类型

// 敌人被玩家招募?移除 AI 组件,添加 PlayerControlled
removeComponent(enemy, "AI");
addComponent(enemy, PlayerControlled);

ECS 的优势正是通过 消除类型耦合 来实现高度灵活的设计,这在回合制战斗中尤其重要(如动态技能效果、状态叠加等)。

http://www.xdnf.cn/news/13047.html

相关文章:

  • Jinja2核心应用场景及示例
  • JavaWeb-JDBC实现数据库更新操作(超简单入门版)
  • 综合态势显示 ASD-100
  • leetcode41-缺失的第一个正数
  • java复习 06
  • 写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
  • 今日行情明日机会——20250609
  • AT模式下的全局锁冲突如何解决?
  • 【大厂机试题解法笔记】报文响应时间
  • 理解大端与小端字节序——原理、实践与网络编程
  • 发立得信息发布系统房屋信息版(php+mysql)V1.0版
  • 在Ubuntu24上采用Wine打开SourceInsight
  • 什么时候用GraphRAG?RAG VS GraphRAG综合分析
  • 算法—栈系列
  • 什么是RPA机器人?详解RPA机器人:诞生背景、核心定义、工作原理、行业应用、国产代表与未来趋势
  • 《信号与系统》第 6 章 信号与系统的时域和频域特性
  • 视图去水印软件:告别水印烦恼,让素材焕然一新
  • 专业文件比对辅助软件
  • 2025年八大员(标准员)考试题库及答案
  • 从零手写Java版本的LSM Tree (八):LSM Tree 主程序实现
  • MySQL的pymysql操作
  • Vue.js教学第二十一章:vue实战项目二,个人博客搭建
  • 通过ESP32开发板,实现NFC卡片控制继电器通断,从而实现多种物联网中设备的通电
  • 企业数据孤立的常见表现及解决方法
  • 基于算法竞赛的c++编程(25)指针简单介绍和简单应用
  • sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
  • Q1起重机指挥理论备考要点分析
  • 内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
  • 基于物联网技术设计的设计室内宠物监护系统
  • switch语句解析