创游世界数据分层模型
一句话摘要
创游世界中的数据存储分为多个层级,不同层级有不同的生命周期、访问范围和适用场景。理解这五个数据层,是做好状态管理、避免数据丢失的关键。
适合谁阅读
- 刚学会写脚本但不知道变量该放哪里的新手
- 遇到"切地图后数据丢失"问题的创作者
- 需要设计复杂数据结构的进阶开发者
- 想要理解联机同步边界的研究者
你将学到什么
- 创游世界数据分层的完整结构
- 各层级的生命周期与访问范围
- 什么情况下该用哪种数据层
- 常见数据分层错误与避坑方法
- 联机环境下数据同步的注意事项
核心结论
- 数据分层本质是"谁需要用"的问题:只在当前脚本用→局部变量;这个物体用→自身属性;这个地图所有物体用→地图属性;所有地图用→系统属性;需要跨会话持久→玩家变量
- UI 只是显示层,真值要放数据层:把货币数量存在 UI 里,切地图就没了;存在玩家变量里,切地图还在
- 切地图会清除局部变量和自身属性:如果需要切地图后保留数据,要用地图属性、系统属性或玩家变量
- 玩家变量是最可靠的持久化层:局部/自身/地图/系统属性都可能被重置,只有玩家变量跨会话存在
背景说明
在创游世界中,数据存储不是单一扁平结构,而是分层的。每个层级有不同的:
- 生命周期:数据什么时候创建、什么时候销毁
- 访问范围:哪些物体能读写这个数据
- 同步策略:联机时哪些数据会同步给其他玩家
- 适用场景:什么样的数据适合放在这一层
理解这个分层模型,能避免"变量值突然丢失"、"切地图后状态重置"、"联机时数据不一致"等问题。
五层数据模型详解
第 1 层:局部变量
定义:在单个脚本执行过程中临时创建的变量,脚本结束后自动销毁。
特点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 只在当前脚本执行中存在 |
| 访问范围 | 仅当前触发时机/脚本内 |
| 默认值 | 数字为 0,文本为空 |
| 切地图 | 自动销毁,不会保留 |
| 联机同步 | 不同步(仅本地临时计算) |
典型用法:
当 开始时
新建局部变量 为 0
设置局部变量1 为 局部变量1 + 1适用场景:
- 循环计数器
- 临时计算中间值
- 不需要跨脚本持久的状态
- 单次脚本内的逻辑控制
不适合场景:
- 需要跨脚本保留的数据
- 需要切地图后保留的数据
- 需要其他物体访问的数据
- 联机时需要同步的数据
示例:计算距离、判断条件、循环变量
第 2 层:自身属性
定义:挂载在当前物体上的属性数据,随物体存在而存在,随物体销毁而销毁。
特点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 物体存在期间 |
| 访问范围 | 当前物体及子物体 |
| 切地图 | 通常随物体销毁而清除 |
| 联机同步 | 不同步 |
典型用法:
当 点击时
设置自身属性1 为 自身属性1 + 1适用场景:
- 单个物体的私有状态(如 NPC 对话次数)
- 物体独有的配置数据
- 不需要跨物体共享的数据
不适合场景:
- 需要其他物体访问的数据
- 需要跨地图保留的数据
- 联机时需要同步的数据
第 3 层:地图属性
定义:属于当前地图的全局数据,所有物体都可以访问和修改。
特点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 当前地图存在期间 |
| 访问范围 | 当前地图内所有物体 |
| 切地图 | 通常清除(取决于设计) |
| 联机同步 | 部分同步 |
典型用法:
当 广播"任务完成"时
设置当前地图属性1 为 当前地图属性1 + 1适用场景:
- 当前地图的全局状态(如解谜进度、机关状态)
- 需要多个物体协同访问的数据
- 地图级别的游戏进度
不适合场景:
- 需要跨地图保留的数据
- 全游戏通用的配置
- 联机时需要全局同步的数据
第 4 层:系统属性
定义:属于整个游戏的全局数据,所有地图、所有物体都可以访问。
特点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 游戏全周期 |
| 访问范围 | 全游戏所有物体 |
| 切地图 | 保留 |
| 联机同步 | 部分同步 |
典型用法:
当 购买商品时
如果 系统属性1 >= 商品价格
设置系统属性1 为 系统属性1 - 商品价格
广播"购买成功"适用场景:
- 全游戏通用配置(如全局难度设置)
- 跨地图的游戏状态
- 所有物体都需要知道的数据
注意:系统属性在创游世界中的实际行为可能因版本而异,建议测试后再用于关键逻辑。
第 5 层:玩家变量
定义:绑定到玩家账号的持久化数据,跨会话存在,可以用来存储玩家的长期游戏进度。
特点:
| 特性 | 说明 |
|---|---|
| 生命周期 | 持久化,跨会话 |
| 访问范围 | 当前玩家 |
| 切地图 | 保留 |
| 联机同步 | 同步到其他玩家(可见部分) |
典型用法:
当 游戏开始时
设置玩家变量1 为 玩家变量1 + 初始金币
当 获得道具时
设置玩家变量2 为 玩家变量2 + 1适用场景:
- 玩家货币、经验值、等级
- 已获得的道具、背包内容
- 玩家成就、解锁进度
- 需要跨会话保留的所有数据
重要:玩家变量是创游世界中最可靠的持久化层。如果数据切地图后会丢失,或者关闭游戏后数据重置,应该考虑使用玩家变量。
数据分层决策树
当你不知道该把数据放在哪一层时,可以用这个决策树:
这个数据谁需要用?
├── 只有当前脚本用
│ └── → 局部变量
├── 只有当前物体用
│ └── → 自身属性
├── 当前地图所有物体都要用
│ ├── 需要跨地图保留?
│ │ ├── 是 → 系统属性
│ │ └── 否 → 地图属性
└── 需要跨会话保留
└── → 玩家变量常见问题与避坑
Q1:为什么切地图后数据丢了?
A:因为可能把数据存在了局部变量或自身属性里,这两层数据在切地图时通常会被清除。
解决:需要保留的数据要存在地图属性、系统属性或玩家变量里。
Q2:为什么 UI 显示的数值切地图后变回默认值?
A:可能把真值写在 UI 组件的内部状态里,而不是存在数据层。
解决:真值存在玩家变量或地图属性里,UI 只负责读取和显示。
Q3:联机时为什么其他玩家看到的数据不对?
A:可能用了局部变量或自身属性,这两层在联机时不会同步给其他玩家。
解决:需要同步的数据要用系统属性或玩家变量,并在设计时考虑同步策略。
Q4:什么时候不能用玩家变量?
A:
- 临时状态(如动画播放中标记)→ 用局部变量
- 单个物体私有数据(如 NPC 对话进度)→ 用自身属性
- 地图级临时状态(如机关是否激活)→ 用地图属性
玩家变量适合存储"需要跨会话保留的长期数据",不适合存所有数据。
五层数据对比表
| 层级 | 名称 | 生命周期 | 访问范围 | 切地图保留 | 联机同步 | 典型用途 |
|---|---|---|---|---|---|---|
| 1 | 局部变量 | 单次脚本 | 仅当前脚本 | ❌ | ❌ | 临时计算 |
| 2 | 自身属性 | 物体存在 | 当前物体 | ❌ | ❌ | 单物体状态 |
| 3 | 地图属性 | 当前地图 | 地图内所有物体 | 通常❌ | 部分 | 地图级状态 |
| 4 | 系统属性 | 游戏全周期 | 全游戏 | ✅ | 部分 | 全局配置 |
| 5 | 玩家变量 | 跨会话 | 当前玩家 | ✅ | ✅ | 持久数据 |
实践示例:设计一个货币系统
错误做法:把货币存在 UI 里
当 获得金币时
显示 +100 在 UI上
设置UI货币显示为 当前值+100问题:切地图后 UI 重置,货币数值丢失。
正确做法:真值放玩家变量,UI 只负责显示
当 获得金币时
设置玩家变量1 为 玩家变量1 + 100
广播"刷新货币显示"
---
当 广播"刷新货币显示"时
设置UI货币显示为 玩家变量1这样:
- 真值在玩家变量,切地图后还在
- UI 广播刷新,始终显示最新值
- 任何地方都能读写货币(因为玩家变量全局可访问)
相关页面
- 创游世界变量与作用域完全指南 - 更详细的变量系统说明
- 创游世界变量与作用域完全指南 - 变量基础概念
- 创游世界UI数据同步架构 - UI 与数据层的关系
- 创游世界存档与云变量设计入门 - 存档设计
待验证问题
以下问题需要进一步验证:
| 问题 | 状态 | 验证方向 |
|---|---|---|
| 地图属性在切地图时的具体行为 | 🔄 待验证 | 需要实际测试 |
| 系统属性在联机时的同步策略 | 🔄 待验证 | 需要联机环境测试 |
| 玩家变量的数量限制和性能影响 | 🔄 待验证 | 需要官方文档确认 |
📝 说明:数据分层模型核心概念已稳定,进阶行为需要持续测试。
后续优化方向
- [ ] 补充更多实际项目中的数据分层案例
- [ ] 添加联机数据同步的详细说明
- [ ] 补充与自定义组件属性系统的关系说明
- [ ] 绘制数据分层可视化图表
导航入口
- 新手阅读路线 - 学习路线导航
- 创游世界知识库总导航 - 知识库总导航
- 自动生成文档目录 - 文档目录总览
维护报告
- 维护与报告导航 - 维护报告总入口
- AI自动维护复盘记录 - 维护复盘记录
- 错误点与优化点汇总 - 错误点汇总
- 待验证问题清单 - 待验证问题
- 后续研究路线图 - 研究路线图
最后更新:2026-06-16维护者:Azek431
