Skip to content
写作:待补充更新:2026-05-16字数:—阅读:—维护:Azek431

创游世界数据分层模型

一句话摘要

创游世界中的数据存储分为多个层级,不同层级有不同的生命周期、访问范围和适用场景。理解这五个数据层,是做好状态管理、避免数据丢失的关键。

适合谁阅读

  • 刚学会写脚本但不知道变量该放哪里的新手
  • 遇到"切地图后数据丢失"问题的创作者
  • 需要设计复杂数据结构的进阶开发者
  • 想要理解联机同步边界的研究者

你将学到什么

  • 创游世界数据分层的完整结构
  • 各层级的生命周期与访问范围
  • 什么情况下该用哪种数据层
  • 常见数据分层错误与避坑方法
  • 联机环境下数据同步的注意事项

核心结论

  1. 数据分层本质是"谁需要用"的问题:只在当前脚本用→局部变量;这个物体用→自身属性;这个地图所有物体用→地图属性;所有地图用→系统属性;需要跨会话持久→玩家变量
  2. UI 只是显示层,真值要放数据层:把货币数量存在 UI 里,切地图就没了;存在玩家变量里,切地图还在
  3. 切地图会清除局部变量和自身属性:如果需要切地图后保留数据,要用地图属性、系统属性或玩家变量
  4. 玩家变量是最可靠的持久化层:局部/自身/地图/系统属性都可能被重置,只有玩家变量跨会话存在

背景说明

在创游世界中,数据存储不是单一扁平结构,而是分层的。每个层级有不同的:

  • 生命周期:数据什么时候创建、什么时候销毁
  • 访问范围:哪些物体能读写这个数据
  • 同步策略:联机时哪些数据会同步给其他玩家
  • 适用场景:什么样的数据适合放在这一层

理解这个分层模型,能避免"变量值突然丢失"、"切地图后状态重置"、"联机时数据不一致"等问题。


五层数据模型详解

第 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 广播刷新,始终显示最新值
  • 任何地方都能读写货币(因为玩家变量全局可访问)

相关页面


待验证问题

以下问题需要进一步验证:

问题状态验证方向
地图属性在切地图时的具体行为🔄 待验证需要实际测试
系统属性在联机时的同步策略🔄 待验证需要联机环境测试
玩家变量的数量限制和性能影响🔄 待验证需要官方文档确认

📝 说明:数据分层模型核心概念已稳定,进阶行为需要持续测试。

后续优化方向

  • [ ] 补充更多实际项目中的数据分层案例
  • [ ] 添加联机数据同步的详细说明
  • [ ] 补充与自定义组件属性系统的关系说明
  • [ ] 绘制数据分层可视化图表

导航入口

维护报告


最后更新:2026-06-16维护者:Azek431

参与维护

发现文档问题?

你可以编辑页面、提交反馈,或复制链接给维护者,帮助这个资料库继续变好。

由 Azek431 整理与维护 | 基于 MIT 许可证开源