查看: 176|回复: 1

HarmonyOS游戏引擎:用ArkTS实现ECS架构解决页面驱动困境

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
很多开发者在起步做HarmonyOS游戏时,习惯把页面作为游戏的主宰,所有角色、碰撞、AI、动画都挂在页面生命周期里。但随着角色增多、玩法变复杂,或者需要支持手机、平板、PC多端,甚至加入AI NPC和联网同步,问题就会暴露:页面销毁导致游戏状态丢失,页面切换时动画暂停,多端切换状态混乱。本质上,UI生命周期不等于游戏生命周期。对于中小型游戏、AI游戏或互动应用,不需要Unity那样的庞大引擎,完全可以用ArkTS从0到1构建一个轻量级游戏Runtime,核心思路就是ECS架构——以Engine为大脑,用World管理实体,Component定义数据,System执行逻辑。
  1. Engine
  2. ├── World(世界)
  3. ├── Entity(实体)
  4. ├── Component(组件)
  5. ├── System(系统)
  6. ├── Scene(场景)
  7. ├── Resource(资源)
  8. ├── Event(事件)
  9. ├── Input(输入)
  10. └── Update Loop(主循环)
复制代码

先把Engine建起来。它是整个游戏世界的大脑,负责管理所有System和World,并在每帧驱动它们。
  1. class GameEngine {
  2.   world: World
  3.   systems: BaseSystem[] = []
  4.   constructor() {
  5.     this.world = new World()
  6.   }
  7.   addSystem(system: BaseSystem) {
  8.     this.systems.push(system)
  9.   }
  10.   update() {
  11.     this.systems.forEach(system => {
  12.       system.update(this.world)
  13.     })
  14.   }
  15. }
  16. const engine = new GameEngine()
复制代码

World保存所有实体(玩家、敌人、子弹、NPC、宝箱等),是游戏宇宙的容器。
  1. class World {
  2.   entities: Entity[] = []
  3.   add(entity: Entity) {
  4.     this.entities.push(entity)
  5.   }
  6. }
复制代码

Entity本身不包含逻辑,只是一个组件容器,通过Map保存任意类型的组件。
  1. class Entity {
  2.   id: number = 0
  3.   components = new Map<string, object>()
  4. }
  5. entity.components.set("Transform", new TransformComponent())
复制代码

Component是纯粹的数据。比如位置组件、生命值组件、攻击组件:
  1. class TransformComponent { x = 0; y = 0 }
  2. class HPComponent { hp = 100 }
  3. class AttackComponent { damage = 20 }
复制代码

玩家就是Transform + HP + Attack,敌人则是Transform + HP + AI。这种组合方式让复用性极高,也是ECS的核心优势。

真正运行逻辑的是System。例如移动系统遍历所有实体,找到Transform组件并修改坐标:
  1. class MoveSystem {
  2.   update(world: World) {
  3.     world.entities.forEach(entity => {
  4.       let transform = entity.components.get("Transform")
  5.       if (transform) {
  6.         transform.x += 5
  7.       }
  8.     })
  9.   }
  10. }
复制代码

战斗系统、AI系统也是类似。每一帧由engine.update()触发,系统按顺序执行:MoveSystem → CollisionSystem → CombatSystem → AISystem。这正是Unity DOTS的核心思想。

场景(Scene)负责管理关卡,切换场景时隔离状态和资源:
  1. class Scene {
  2.   world = new World()
  3.   enter() {}
  4.   exit() {}
  5. }
  6. sceneManager.changeScene(new BattleScene())
复制代码

ResourceManager统一管理图片、音频、动画等资源,避免重复加载和内存泄漏:
  1. class ResourceManager {
  2.   cache = new Map()
  3.   load(path: string) {}
  4. }
复制代码

EventBus实现模块间解耦,比如敌人死亡时触发事件,金币系统和任务系统各自监听做不同响应:
  1. eventBus.emit("enemyDead")
  2. eventBus.on("enemyDead", () => { addGold() })
  3. eventBus.on("enemyDead", () => { checkTask() })
复制代码

HarmonyOS支持触摸、鼠标、键盘、遥控器、手柄等多种输入方式,通过InputSystem统一抽象,上层只关心move(input.getAxis()),不关心底层是touch还是键盘,这样就能轻松在手机、平板、PC、TV上统一运行。

最后是最核心的Update Loop,所有游戏引擎的命脉:
  1. class Engine {
  2.   tick() {
  3.     this.update()
  4.     requestAnimationFrame(() => {
  5.       this.tick()
  6.     })
  7.   }
  8. }
复制代码

这会形成一个无限循环:update() → render(),整个游戏世界开始运转。

在AI时代,可以加入AgentSystem让NPC具备感知、记忆、规划和行动的能力:
  1. class AgentSystem {
  2.   update(world) {
  3.     npcList.forEach(npc => {
  4.       npc.think()
  5.       npc.plan()
  6.       npc.execute()
  7.     })
  8.   }
  9. }
复制代码

最终引擎架构如下:Engine下挂SceneManager和ResourceManager,Scene包含World,World包含Entity,Entity挂载Component,Component被各个Systems(Move、Combat、AI、Physics、Event、Agent、Input、Animation、Network)处理,最后输出到Render。数据流为:Input → World → System → State → UI Render。

很多人觉得游戏引擎很复杂,只有Unity、Unreal才需要。但对于HarmonyOS来说,引擎不是庞大的软件,而是一套Runtime思维。它本质上只解决四个问题:世界怎么组织?对象怎么管理?逻辑怎么运行?系统怎么扩展?当AI、Agent、分布式能力逐渐进入鸿蒙游戏生态后,未来真正重要的可能不再是UI Framework,而是Runtime + ECS + Agent System。未来的HarmonyOS游戏,不一定运行在Unity上,但一定运行在某种Engine上。
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层

Re: HarmonyOS游戏引擎:用ArkTS实现ECS架构解决页面驱动困境

楼主分享得很详细,这套ECS架构的思路很清晰。确实,很多初学者容易把页面生命周期和游戏逻辑强绑定,一旦复杂度上来就进退两难。用World统一管理实体状态,用System剥离逻辑,这样做多端适配和状态恢复都会轻松很多。另外,你提到的EventBus解耦模块、AgentSystem扩展AI策略,都是很实用的设计。不知道在实际项目中,组件的回收和复用这块你是怎么做内存优化的?期待后续分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-22 11:07 , Processed in 0.034639 second(s), 19 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部