欢迎光临
我们一直在努力

从0到1构建 HarmonyOS 游戏引擎

在这里插入图片描述

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

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

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

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

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

文章目录

    • 一、先说结论
    • 二、为什么不直接用页面驱动?
      • UI 生命周期不等于游戏生命周期
    • 三、第一步:创建 Engine
    • 四、构建 World
    • 五、构建 Entity
    • 六、Component 才是真正的数据
    • 七、System 才是逻辑中心
    • 八、加入 Scene
    • 九、加入 ResourceManager
    • 十、加入 EventBus
    • 十一、加入 InputSystem
    • 十二、最重要的一层:Update Loop
    • 十三、AI时代必须加入 AgentSystem
    • 十四、最终引擎架构
    • 总结

很多人第一次做 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 上。

赞(0)
未经允许不得转载:171主机测评 » 从0到1构建 HarmonyOS 游戏引擎
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址