在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。



很多人第一次做 HarmonyOS 游戏时,都会下意识认为:

有页面
有状态
有几个工具类

就已经算是一个游戏项目了,甚至很多 Demo 的结构都是:

pages
components
utils
store

功能少的时候没问题。但随着:

角色越来越多
玩法越来越复杂
需要支持手机、平板、PC
加入 AI NPC
加入联网同步

慢慢就会发现:

项目里缺的不是功能,而是一个真正的“游戏 Runtime”。

很多成熟游戏引擎:

Unity
Unreal
Godot

本质上都不是 UI 框架,而是:

一套负责管理世界、对象、系统、资源和运行循环的 Runtime。

那么问题来了:

能不能在 HarmonyOS 上,从 0 到 1 自己构建一个轻量游戏引擎?

答案是:

完全可以。

甚至对于中小型游戏、AI 游戏、互动应用来说,一套基于 ArkTS 的自定义引擎会更加灵活。

一、先说结论

一个最小可运行的 HarmonyOS 游戏引擎,至少包含:

Engine
│
├── World(世界)
├── Entity(实体)
├── Component(组件)
├── System(系统)
├── Scene(场景)
├── Resource(资源)
├── Event(事件)
├── Input(输入)
└── Update Loop(主循环)

整体结构:

          Engine
              │
    ┌─────────┴─────────┐
  Scene               Resource
    │
  World
    │
 Entity
    │
Component
    │
 System
    │
 Render

核心思想:

一切都是 Runtime 驱动。

二、为什么不直接用页面驱动?

很多项目:

@Entry
@Component
struct GamePage {

  aboutToAppear() {
      startBattle()
  }

  build() {

  }

}

所有东西:

角色
敌人
碰撞
AI
动画

全部挂在页面,问题马上出现:

UI 生命周期不等于游戏生命周期

页面销毁:

游戏状态丢失

页面切换:

动画暂停

多端切换:

状态混乱

所以:

页面负责展示,而游戏 Runtime 负责运行。

三、第一步:创建 Engine

先构建整个引擎入口。

class GameEngine {

    world: World
    systems: BaseSystem[] = []

    constructor() {
        this.world = new World()
    }

    addSystem(system: BaseSystem) {
        this.systems.push(system)
    }

    update() {

        this.systems.forEach(system => {
            system.update(this.world)
        })

    }

}

运行:

const engine = new GameEngine()

这时候:

Engine
=
整个游戏世界的大脑

四、构建 World

World 保存整个游戏状态。

class World {

    entities: Entity[] = []

    add(entity: Entity) {
        this.entities.push(entity)
    }

}

游戏里面:

玩家
敌人
子弹
NPC
宝箱

全部放在 World。

world.add(player)
world.add(enemy)

于是:

World
=
整个游戏宇宙

五、构建 Entity

Entity 不负责逻辑,只负责容器。

class Entity {

    id:number = 0

    components = new Map<string, object>()

}

添加组件:

entity.components.set(
    "Transform",
    new TransformComponent()
)

一个角色:

Player

其实只是:

Entity

而真正的能力来自组件。

六、Component 才是真正的数据

位置组件:

class TransformComponent {

    x = 0
    y = 0

}

生命值:

class HPComponent {

    hp = 100

}

攻击属性:

class AttackComponent {

    damage = 20

}

于是,玩家:

Player

=
Transform
+
HP
+
Attack

敌人:

Enemy

=
Transform
+
HP
+
AI

优势:

高度复用
自由组合

这就是 ECS 思想。

七、System 才是逻辑中心

真正运行的是 System。例如,移动系统:

class MoveSystem {

    update(world:World) {

        world.entities.forEach(entity=>{

            let transform =
                entity.components.get("Transform")

            if (transform) {

                transform.x += 5

            }

        })

    }

}

战斗系统:

class CombatSystem {

    update(world:World) {

    }

}

AI系统:

class AISystem {

    update(world:World){

    }

}

运行顺序:

MoveSystem
↓

CollisionSystem

↓

CombatSystem

↓

AISystem

每一帧:

engine.update()

系统自动执行,这也是 Unity DOTS 的核心思想。

八、加入 Scene

场景负责管理关卡。

class Scene {

    world = new World()

    enter() {

    }

    exit() {

    }

}

主菜单:

MainScene

战斗:

BattleScene

副本:

DungeonScene

切换:

sceneManager.changeScene(
    new BattleScene()
)

优势:

状态隔离
资源独立

九、加入 ResourceManager

图片:

png

音频:

mp3

动画:

json

统一管理:

class ResourceManager {

    cache = new Map()

    load(path:string){

    }

}

避免:

重复加载
内存泄漏

这是所有游戏引擎都会有的一层。

十、加入 EventBus

事件解耦,例如,敌人死亡:

eventBus.emit(
    "enemyDead"
)

金币系统:

eventBus.on(
    "enemyDead",
    ()=>{
       addGold()
    }
)

任务系统:

eventBus.on(
    "enemyDead",
    ()=>{
       checkTask()
    }
)

好处:

模块之间完全解耦

避免:

互相引用

十一、加入 InputSystem

HarmonyOS 支持:

触摸
鼠标
键盘
遥控器
手柄

统一输入:

class InputSystem {

    getAxis() {

    }

}

上层只关心:

move(
    input.getAxis()
)

而不是:

touch
mouse
keyboard

这样才能实现:

手机
平板
PC
TV

统一运行。

十二、最重要的一层:Update Loop

所有游戏引擎都有一个核心:

Game Loop

例如:

class Engine {

    tick() {

        this.update()

        requestAnimationFrame(() => {
            this.tick()
        })

    }

}

形成:

while(true)
{
    update()
    render()
}

整个游戏世界开始运转,这就是 Runtime。

十三、AI时代必须加入 AgentSystem

未来的鸿蒙游戏会越来越像:

Minecraft AI
AI NPC
开放世界
数字人

所以需要:

class AgentSystem {

    update(world) {

        npcList.forEach(npc=>{

            npc.think()

            npc.plan()

            npc.execute()

        })

    }

}

形成:

Perception

↓

Memory

↓

Planning

↓

Action

未来:

AI NPC
AI队友
AI敌人

全部会运行在 AgentSystem。这一层可能会成为:

HarmonyOS 游戏引擎最大的差异化能力。

十四、最终引擎架构

                Engine
                   │
        ┌──────────┴─────────┐
     SceneManager       ResourceManager
             │
            Scene
             │
            World
             │
          Entity
             │
         Component
             │
          Systems
             │
 ┌──────────┼───────────┐
Move      Combat      AI
Physics   Event       Agent
Input     Animation   Network
             │
          Render

数据流:

Input

↓

World

↓

System

↓

State

↓

UI Render

总结

很多人以为:

游戏引擎很复杂,是 Unity、Unreal 才需要的东西。

其实对于 HarmonyOS 来说:

引擎不是一个庞大的软件,而是一套 Runtime 思维。

从本质上看,一个游戏引擎不过是在解决四个问题:

世界怎么组织?
对象怎么管理?
逻辑怎么运行?
系统怎么扩展?

而当 AI、Agent、分布式能力逐渐进入 HarmonyOS 游戏生态之后,未来真正重要的可能不再是:

UI Framework

而是:

Runtime + ECS + Agent System

也就是说:

未来的 HarmonyOS 游戏,不一定运行在 Unity 上,但一定运行在某种 Engine 上。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐