文档版本:v1.0 最后更新:2026-04-02 08:28:05
本文档用于把“地图复用、KML 复用、内容资源复用、配置发布”统一收成一套后端可执行方案。
目标:
event/*.jsonevent 只负责“组合与覆盖”,不拥有底层资源本体release 能稳定追溯当时到底用了哪一份地图、哪一份 KML、哪一套资源包后端后续不要按“一个活动一个完整资源目录”来设计,而要按“资源对象库 + Event 组合 + Release 固化”来设计。
建议统一拆成这 5 类对象:
MapPlayfieldGameModeResourcePackEvent它们的关系是:
Map:地图底座Playfield:空间对象 / KML / 控制点集GameMode:玩法默认规则ResourcePack:内容、主题、音频等资源档Event:业务活动对象,只做引用与少量覆盖最终客户端吃的仍然不是这些编辑态对象,而是:
Releasemanifest.json补充约束:
你现在遇到的核心问题不是“目录怎么摆”,而是“哪些资源会复用”。
当前最典型的复用场景:
如果继续按 event -> 自己拥有所有文件 设计,后面会出现:
所以正确做法不是“每个 event 一套全量文件”,而是:
共享资源对象 -> event 引用 -> release 固化版本
作用:
最少应包含:
codenamestatustiles rootmapmeta典型场景:
注意:
Map 不等于某场活动Map 是共享资产作用:
最常见的承载就是:
KMLGeoJSON最少应包含:
codenamekindsourceTypesourceFile注意:
Playfield 是共享对象,不属于某个 event 私有作用:
例如:
classic-sequentialscore-o最少应包含:
codemodedefaults json注意:
作用:
当前最适合放进来的有:
audioProfilecontentProfilethemeProfile一个资源包内部可以包含:
作用:
它应该只负责:
MapPlayfieldGameModeResourcePackEvent Overrides不要让 Event 负责:
仓库内建议把“源资源”和“活动源配置”拆开。
推荐结构:
resources/
maps/
lxcb-001/
v2026-03-30/
mapmeta.json
tiles/
playfields/
c01/
v2026-03-30/
course.kml
meta.json
resource-packs/
default-race/
v2026-03-30/
content/
content.html
audio/
theme/
game-modes/
classic-sequential/
v1/
mode.json
score-o/
v1/
mode.json
events/
evt-demo-001/
source.json
说明:
resources/ 放共享对象的源资源game-modes/ 放玩法默认规则对象events/ 只放活动级 source config当前根目录 event 可以继续保留作为过渡区,但后面建议逐步迁到:
events/resources/game-modes/后续 event source 不建议继续直接写死地图路径和 KML 路径,而应该引用对象版本。
推荐形态:
{
"schemaVersion": "1",
"version": "2026.04.01",
"app": {
"id": "evt-demo-001",
"title": "积分赛示例"
},
"refs": {
"map": {
"code": "lxcb-001",
"version": "v2026-03-30"
},
"playfield": {
"code": "c01",
"version": "v2026-03-30"
},
"gameMode": {
"code": "score-o",
"version": "v1"
},
"resourcePack": {
"code": "default-race",
"version": "v2026-03-30"
}
},
"overrides": {
"game": {
"session": {
"maxDurationSec": 5400
},
"punch": {
"radiusMeters": 5
}
},
"playfield": {
"metadata": {
"title": "示例路线",
"code": "demo-001"
}
}
}
}
这样 Event 管的是:
不是:
build / publish 时,Go 中间层应做装配:
Map + Playfield + GameMode + ResourcePack + Event Overrides -> manifest.json
最终生成给客户端的 manifest 可以保持现在的运行结构,例如:
{
"schemaVersion": "1",
"releaseId": "rel_xxx",
"version": "2026.04.01",
"app": {
"id": "evt-demo-001",
"title": "积分赛示例"
},
"map": {
"tiles": "https://.../maps/lxcb-001/v2026-03-30/tiles/",
"mapmeta": "https://.../maps/lxcb-001/v2026-03-30/mapmeta.json"
},
"playfield": {
"kind": "control-set",
"source": {
"type": "kml",
"url": "https://.../playfields/c01/v2026-03-30/course.kml"
}
},
"game": {
"mode": "score-o"
},
"resources": {
"audioProfile": "default",
"contentProfile": "default",
"themeProfile": "default-race"
}
}
这层才是客户端真正消费的配置。
重要边界:
再补一条:
线上目录不要再继续以:
gotomars/event/classic-sequential.jsongotomars/event/score-o.json这种“玩法文件名”方式长期演进。
建议改成版本化结构:
gotomars/maps/{mapCode}/{version}/...
gotomars/playfields/{playfieldCode}/{version}/...
gotomars/resource-packs/{packCode}/{version}/...
gotomars/game-modes/{modeCode}/{version}/mode.json
gotomars/event-releases/{eventPublicID}/{releasePublicID}/manifest.json
gotomars/event-releases/{eventPublicID}/{releasePublicID}/asset-index.json
好处:
推荐按“主表 + version 表”建模。
建议对象:
mapsmap_versionsplayfieldsplayfield_versionsgame_modesgame_mode_versionsresource_packsresource_pack_versionseventsevent_versionsevent_releases其中:
jsonb 内容和具体资源引用例如:
mapsidcodenamestatuscurrent_version_idmap_versionsidmap_idversion_codecontent_jsonbpublished_asset_rootstatusplayfieldsidcodenamekindstatuscurrent_version_idplayfield_versionsidplayfield_idversion_codesource_typecontent_jsonbasset_rootstatusresource_packsidcodenamestatuscurrent_version_idresource_pack_versionsidresource_pack_idversion_codecontent_jsonbasset_rootstatusgame_modesidcodenamestatuscurrent_version_idgame_mode_versionsidgame_mode_idversion_codecontent_jsonbstatusevent_versionsidevent_idversion_codemap_version_idplayfield_version_idgame_mode_version_idresource_pack_version_idoverrides_jsonbstatus核心点:
Event 不直接指向文件 URLEventVersion 指向对象版本Release 固化当时装配结果后端应强管理:
后端不应强管理:
同样不应做:
适合继续走 jsonb 的内容:
game.sequence.*game.guidance.*game.presentation.*playfield.controlOverrides.*建议不要一次重构到底,按下面顺序推进:
先把概念定住
MapPlayfieldGameModeResourcePackEvent先做文档和目录规范
后端先补对象模型和 version 表草案
配置构建器改成“按引用装配”
发布器改成“版本化共享资源 + event release manifest”
最后再做正式后台 UI
在完全切换到对象化模型前,当前仓库可以先这样过渡:
import-local -> preview -> publish也就是说:
event/*.json 迁到对象化配置系统后端资源管理的正确方向不是“每个活动一堆文件”,而是:
共享资源对象库 + Event 引用装配 + Release 固化发布
只有这样,地图复用、KML 复用、资源包复用、多活动发布才能长期稳定。
并且这套模型必须从一开始就兼顾未来 APP,而不是做成“小程序跑通后再重构”的临时结构。