创游世界联机系统完全指南
一句话摘要
本文系统整理创游世界联机系统的核心概念、架构设计、UI同步策略、广播驱动模式与常见问题解决,帮助你理解联机环境下数据、UI、广播的正确处理方式。
适合谁阅读
- 需要制作多人联机游戏的开发者
- 遇到联机UI卡顿、广播失效问题的制作者
- 想系统理解联机架构的进阶用户
你将学到什么
- 联机系统的核心架构
- UI同步的演进历程与当前推荐写法
- 广播驱动模式的正确用法
- 常见联机问题及解决方法
- 版本兼容性注意事项
核心结论
- 新逻辑下每个玩家只运行自己的UI,不再模拟所有玩家的UI
- UI只发广播到地图,地图统一处理公共数据
玩家.当前UI在新版本已弃用,改用当前UI- 公共数据操作要用上传并等待,不要在UI里直接频繁写入
1. 联机系统的核心架构
1.1 旧版UI逻辑的问题
在4.52.54之前的版本中,联机UI存在严重的性能问题:
| 问题 | 说明 |
|---|---|
| 全局模拟 | 每个玩家设备都会模拟所有玩家的UI逻辑 |
| 帧率限制 | 为了维持同步,帧率被限制到20FPS |
| 卡顿严重 | 复杂UI、多人UI、动画UI会导致严重卡顿 |
| 数据耦合 | UI层直接操作公共数据导致同步延迟 |
1.2 新版UI逻辑的改进
4.52.54之后的版本进行了重大架构调整:
| 改进 | 说明 |
|---|---|
| 本地自治 | 每个玩家只运行自己的UI逻辑 |
| 帧率恢复 | 不再受20FPS限制 |
| 公共数据下沉 | 公共数据操作交给地图层统一处理 |
| 广播驱动 | UI通过广播与地图通信,不再直接操作 |
2. UI同步的演进历程
2.1 版本演进时间线
4.52.1 旧版UI逻辑(20FPS限制)
↓
4.52.54 新UI逻辑上线(本地化)
↓
4.54.0 进一步优化(结构体、单选值等)2.2 关键变化:玩家.当前UI 到 当前UI
| 版本 | 写法 | 说明 |
|---|---|---|
| 旧版 | 玩家.当前UI | 已弃用 |
| 新版 | 当前UI | 推荐写法 |
深层含义:
- "当前UI"被视为更直接、更标准的运行上下文
- 地图脚本不再被鼓励直接深控UI内部
- 推荐使用"玩家.向当前UI发广播"通知UI更新
3. 推荐的联机架构
3.1 分层设计
┌─────────────────────────────────────────┐
│ UI层 │
│ 负责:显示、动画、接收输入、局部逻辑 │
└─────────────────┬───────────────────────┘
│ 发广播
↓
┌─────────────────────────────────────────┐
│ 地图层 │
│ 负责:公共数据、联机同步、规则执行 │
└─────────────────┬───────────────────────┘
│ 广播刷新
↓
┌─────────────────────────────────────────┐
│ 广播层 │
│ 负责:UI与地图之间的意图传递 │
└─────────────────────────────────────────┘3.2 正确的数据流
推荐模式:
UI操作 → 广播/调用指令 → 地图/系统处理真值
↓
修改真值 → 广播刷新 → UI更新显示错误模式:
UI直接修改全局状态 → 到处直接改界面 → 同步延迟严重3.3 UI层的职责
UI层应该只负责:
- 接收玩家输入
- 做局部动画
- 显示当前玩家相关的信息
- 响应当前玩家操作反馈
3.4 地图层的职责
地图层应该负责:
- 所有玩家共享的公共数据
- 联机同步相关的规则
- 多对象共享流程
- 向各玩家广播状态变化
4. 广播驱动模式
4.1 为什么需要广播驱动
传统写法在联机环境下的主要问题:
| 传统写法 | 问题 |
|---|---|
| UI直接操作公共数据 | 每次都需要网络同步,频繁卡顿 |
| UI直接调用地图函数 | 耦合严重,难以维护 |
| 多个UI同时操作 | 冲突概率高,数据不一致 |
4.2 广播驱动模式的优势
| 广播写法 | 优势 |
|---|---|
| UI只发一次广播 | 减少网络同步次数 |
| 地图统一处理 | 数据处理集中,逻辑清晰 |
| UI自处理内部 | 动画、显示等可以本地快速响应 |
4.3 广播命名建议
使用语义化命名,避免混乱:
| 推荐命名 | 不推荐命名 |
|---|---|
| 任务_完成 | 刷新1 |
| 货币_增加 | 更新 |
| 打开背包 | 调一下 |
| 刷新界面 | 改值 |
4.4 广播的三种核心用途
| 用途 | 说明 | 示例 |
|---|---|---|
| 表达事件发生 | 通知某个动作已发生 | 按钮被点击、角色死亡 |
| 表达动作请求 | 请求系统执行什么 | 请求打开界面、刷新排行榜 |
| 表达状态变化 | 通知状态已更新 | 背包更新、任务阶段变更 |
5. 上传并等待机制
5.1 什么是上传并等待
当UI脚本需要操作地图或玩家公共数据时,需要同步给其他玩家。
"上传并等待"的本质是:
- 跨越本地UI层与公共数据层的边界
- 需要网络同步或一致性处理
- 每次跨层都有等待成本
5.2 性能优化建议
| 建议 | 说明 |
|---|---|
| 减少跨层次数 | UI只向地图发一次广播,让地图集中处理 |
| 避免频繁写入 | 不要在UI中连续做多次公共数据写入 |
| 合并操作 | 将多个小操作合并为一次大操作 |
| 本地优先 | 本地显示可以立即更新,公共数据等同步完成 |
6. 联机UI设计原则
原则一:让UI偏本地化
UI优先处理:
- 动画(本地快速响应)
- 局部显示(只影响当前玩家)
- 玩家自己的操作反馈
原则二:公共状态处理下沉到地图
凡是会影响到:
- 所有玩家
- 公共数据
- 共享流程
的操作,都尽量交给地图层。
原则三:用广播传意图,不要直接跨层硬控
这样做的优势:
- 更清晰
- 更稳定
- 更适合联机
原则四:区分"显示正确"和"同步正确"
联机UI设计必须同时考虑:
- 视觉流畅(本地显示)
- 数据一致(公共同步)
7. 版本兼容与迁移
7.1 兼容性选项
创游世界提供了兼容性选项来帮助旧项目迁移:
- 新项目:默认使用新UI逻辑
- 老项目:可以通过"游戏设置 -> UI兼容选项"选择"运行在本地"切换到新逻辑
7.2 迁移注意事项
| 注意事项 | 说明 |
|---|---|
| 新逻辑无法回退 | 迁移到新UI逻辑后可能无法回到旧版 |
| 需要专门验证 | 老项目迁移时必须做全面测试 |
| 检查所有功能 | 确认UI、广播、公共数据等都能正常工作 |
7.3 版本条件判断
在编写需要兼容多版本的脚本时:
txt
如果版本 >= 4.52.54:
使用 `当前UI`
使用 `玩家.向当前UI发广播`
否则:
使用 `玩家.当前UI`8. 常见问题与解决
Q1:联机时UI很卡怎么办?
原因: 旧版UI逻辑或频繁的公共数据操作
解决:
- 更新到4.52.54+版本
- 检查是否在UI中频繁操作公共数据
- 改用广播驱动模式
Q2:广播在联机下没效果?
检查:
- 广播名称是否一致
- 监听脚本是否在正确触发时机下
- 监听者是否还在场景中
- 是否需要同步到所有玩家
Q3:如何正确处理玩家变量?
建议:
- 玩家变量存储在云端,跨设备同步
- 操作玩家变量需要考虑同步延迟
- 关键操作使用"上传并等待"
Q4:如何设计联机友好的UI?
建议:
- UI只显示当前玩家相关信息
- 公共数据通过地图层广播刷新
- 避免在UI中直接修改其他玩家数据
9. 实战架构示例
9.1 联机背包系统
UI层:
- 显示背包UI
- 响应玩家点击操作
- 发广播"道具_使用_请求"
地图层:
- 监听"道具_使用_请求"
- 检查道具是否可用
- 更新玩家道具数据(上传并等待)
- 广播"道具_已使用_刷新"
UI层:
- 监听"道具_已使用_刷新"
- 更新背包显示9.2 联机战斗系统
UI层:
- 显示技能按钮
- 响应点击
- 发广播"技能_释放_请求"
地图层:
- 验证技能条件
- 计算伤害
- 广播"伤害_结算_刷新"
- 同步到所有玩家
UI层:
- 刷新伤害显示
- 播放命中效果相关页面
- 核心概念速查手册 - 联机相关概念速查
- 创游世界广播机制完全指南 - 广播详解
- UI系统与切换机制解析 - UI分类与切换
- 联机UI演进专题 - 联机UI演进详情
- 常见问题与避坑指南 - 联机相关问题解决
- 创游世界UI数据同步架构 - UI与真值分层
待验证问题
[待验证]具体版本号对应的UI逻辑差异[待验证]不同UI类型的同步策略差异[待验证]联机下地图广播的优先级规则[待验证]多人同时操作同一数据的冲突处理机制
后续优化方向
- [ ] 补充更多联机场景的脚本示例
- [ ] 添加单人与联机的代码对比
- [ ] 完善版本兼容性判断的代码模板
- [ ] 添加联机性能优化的详细指南
- [ ] 补充联机调试方法的说明
