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

创游世界广播机制完全指南

一句话摘要

广播是创游世界中跨对象、跨层级通知消息的事件驱动机制,核心价值在于解耦发起者和处理者,使 UI、地图、物体、自定义组件之间不需要硬绑死。推荐使用「UI 发广播 → 地图统一处理」的架构模式。

适合谁阅读

  • 遇到「广播没效果」或「广播乱发」问题的开发者
  • 想理解 UI 与地图如何正确通信的制作者
  • 需要设计复杂项目架构的进阶用户
  • 需要做联机项目的开发者

你将学到什么

  • 广播不是普通函数调用,而是事件通知机制
  • 广播的三种核心用途(事件表达、动作请求、状态变化通知)
  • 广播与 UI、地图、自定义组件的关系
  • 广播命名的最佳实践
  • 联机环境下广播的性能优化
  • 广播的常见误区与避坑建议

一、广播基础概念

1.1 什么是广播

广播是一种「发消息给多个对象」的事件通知机制。

类比理解

  • 想象现实中的电台广播
  • 发送者相当于电台
  • 所有调到对应频道的接收者都可以收到信号
  • 发送者不需要知道谁在收听

1.2 广播的工作原理

发送广播 → 所有监听该广播的脚本执行

关键特点

  • 发送者不需要知道监听者的具体信息
  • 监听者通过订阅事件来接收并响应消息
  • 广播可以跨越对象、跨越层级传递

1.3 广播不是普通函数调用

很多初学者会把广播理解成:

  • 一个「远程执行」按钮
  • 或者简单地「让别的地方跑一段脚本」

但广播更接近:

  • 一种事件通知机制
  • 一种跨层解耦方式
  • 一种连接 UI、地图、物体、自定义组件的中介

关键价值:把发起者和处理者拆开。


二、广播的三种核心用途

用途 A:表达事件发生

广播用于表示「发生了什么」。

示例

  • 按钮被点击 → 发送「按钮_点击」广播
  • 任务完成 → 发送「任务_完成」广播
  • 角色死亡 → 发送「角色_死亡」广播
  • 机关触发 → 发送「机关_触发」广播

特点

  • 广播名称表达事件本身
  • 所有关心这个事件的对象都可以监听
  • 不关心事件后应该怎么处理

用途 B:表达动作请求

广播用于表示「我希望系统执行什么」。

示例

  • 请求打开界面 → 发送「请求_打开背包」广播
  • 请求开始下一波 → 发送「请求_开始波次」广播
  • 请求刷新排行榜 → 发送「请求_刷新排行」广播

特点

  • 广播名称表达意图或请求
  • 真正的处理逻辑由接收方决定
  • 发送方不需要知道具体实现

用途 C:表达状态变化通知

广播用于表示「某个状态已经变化,请相关对象自行同步」。

示例

  • 背包更新 → 发送「背包_更新」广播
  • UI 需要刷新 → 发送「刷新_界面」广播
  • 任务阶段变更 → 发送「任务_阶段变更」广播

特点

  • 广播名称表达状态变化
  • 接收方根据自身逻辑决定如何响应
  • 适合多人联机同步

三、广播在创游中的位置

3.1 广播常出现的位置

  • 地图级广播
  • UI 收发广播
  • 玩家向当前 UI 发广播
  • 物体或组件响应广播

3.2 广播类型说明

类型说明
地图广播在地图范围内广播,全地图可见
系统广播跨地图的系统级广播
UI 广播UI 发出或接收的广播
向当前 UI 发广播地图向当前显示的 UI 发广播

3.3 广播与组件的关系

自定义组件让「某个能力模块」可以自己监听和处理广播。

这意味着

  • 组件可以作为广播的接收端
  • 组件也可以作为广播触发后的行为封装体

从设计角度看

  • 广播提供跨模块通知
  • 自定义组件提供模块内部实现

两者配合

  • 外部低耦合通知
  • 内部高内聚实现

四、推荐的数据流架构

4.1 UI 发广播,地图处理

这是当前资料里最值得反复强调的实践模式。

为什么 UI 不适合直接处理太多公共逻辑

  • UI 本质上更偏输入、展示、交互反馈
  • 如果 UI 里直接承载大量公共数据写入
  • 就容易出现性能压力、联机等待、逻辑难维护

为什么地图适合做汇总处理

  • 地图更像当前场景逻辑控制器
  • 公共数据协调层
  • 多对象共享规则承载层

推荐架构

UI 操作

发送广播(请求)

地图/系统处理真值

修改真值

发送广播(通知)

UI 更新显示

4.2 具体示例

购买物品流程

当点击购买按钮时
    // UI 发请求
    发送广播 "请求购买" 带参数 商品ID=1, 数量=1
结束

当收到广播 "请求购买" 时(地图脚本)
    // 地图层处理逻辑
    获取玩家变量 "金币"
    获取配置表 商品列表 名为 "商品1" 的行
    
    如果 玩家金币 大于等于 商品价格
        设置玩家属性 "金币" 为 玩家金币 - 商品价格
        执行玩家指令 "添加物品" 参数 商品ID=1, 数量=1
        发送广播 "购买成功"
    否则
        发送广播 "金币不足"
    结束
结束

当收到广播 "购买成功" 时(UI脚本)
    // UI 收到通知后刷新显示
    刷新界面
结束

角色死亡流程

当死亡时(角色脚本)
    发送广播 "玩家_死亡"
结束

当收到广播 "玩家_死亡" 时(UI脚本)
    显示失败界面
结束

当收到广播 "玩家_死亡" 时(任务脚本)
    增加任务失败计数
结束

当收到广播 "玩家_死亡" 时(音效脚本)
    播放死亡音效
结束

五、广播命名规范

5.1 推荐的命名方式

广播名尽量表达「事件/意图」,而不是实现细节。

推荐的命名

广播名说明
开始挑战表达事件
打开背包表达意图
任务完成表达状态变化
刷新界面表达请求
玩家准备完成表达玩家状态
道具_获得_玩家表达道具相关事件
任务_阶段变更表达任务状态变化

5.2 不推荐的命名

广播名问题
广播1无意义
执行那个功能太模糊
改值没有语义
刷新1不知道刷新什么
刷新2不知道刷新什么

命名越像「事件语言」,项目就越容易维护。

5.3 语义化命名示例

功能不推荐推荐
金币变化刷新金币_变化
背包更新刷新背包背包_更新
任务完成任务任务_完成
波次开始下一步波次_开始

六、联机环境下的广播

6.1 联机 UI 的特殊问题

问题:4.52.54 之前的版本,每个玩家设备会模拟所有玩家的 UI 逻辑,帧率被限制到 20 帧。

表现

  • 联机时 UI 很卡
  • 多人同时操作时延迟明显

6.2 解决思路

方法 1:更新版本

  • 更新到 4.52.54+ 版本
  • 新版本优化了 UI 执行逻辑

方法 2:优化广播模式

// ❌ 不推荐:UI 直接处理多人数据
当点击按钮时
    执行多人写入操作 × N次
结束

// ✅ 推荐:UI 只发一次广播,地图集中处理
当点击按钮时
    发送广播 "请求操作"
结束

当收到广播 "请求操作" 时(地图脚本)
    // 地图层集中处理所有逻辑
    执行逻辑
    发送广播 "操作完成"
结束

方法 3:减少 UI 广播频率

  • 不要在 UI 中做连续多次公共数据写入
  • 合并多个小操作为一个请求广播

七、广播的常见误区

误区 1:广播是万能跳线

错误做法

  • 到处发广播
  • 名称混乱
  • 一个广播承担太多语义

后果

  • 很难追踪谁在响应
  • 一改名字全项目崩
  • 调试体验很差

误区 2:广播里塞太多底层细节

推荐做法

  • 广播表达「意图」
  • 具体实现放在处理端

误区 3:能直接调就不分层

后果

  • UI 绑死地图内部结构
  • 地图绑死对象细节
  • 项目可复用性很差

短期看省事,长期看容易失控。

误区 4:一个广播干所有事

错误示例

// ❌ 一个广播干了太多事
当点击按钮时
    发送广播 "处理一切" // 扣钱+发道具+刷新UI+播音效+加成就
结束

推荐做法

// ✅ 多个职责明确的广播
当点击按钮时
    发送广播 "请求购买"
结束

当收到广播 "请求购买" 时
    扣钱
    发道具
    发送广播 "购买完成"
结束

当收到广播 "购买完成" 时
    刷新UI
结束

当收到广播 "购买完成" 时
    播放音效
结束

当收到广播 "购买完成" 时
    增加成就进度
结束

八、广播调试技巧

8.1 为什么广播没效果

检查清单

  1. 广播名称是否完全一致(包括大小写)
  2. 监听脚本是否写在「当收到广播时」触发时机下
  3. 监听者在广播发送时是否仍然存在
  4. 广播时机是否在监听者初始化之后
  5. 监听者是否被销毁了

8.2 广播调试技巧

技巧 1:添加日志广播

当点击按钮时
    发送广播 "调试_打印" 带参数 信息="按钮被点击"
结束

当收到广播 "调试_打印" 时
    打印到日志 参数.信息
结束

技巧 2:使用临时广播名

  • 测试时使用带编号的广播名
  • 测试完成后改成语义化名称

技巧 3:分步测试

  • 先测试发送端
  • 再测试接收端
  • 最后串联完整流程

九、实战案例

9.1 多人联机游戏房间系统

// UI 发送请求
当点击准备按钮时
    发送广播 "玩家_准备"
结束

// 地图层处理
当收到广播 "玩家_准备" 时
    设置玩家属性 "已准备" 为 真
    检查是否所有玩家都准备
    如果 所有玩家都准备
        发送广播 "游戏_开始"
    结束
结束

// UI 响应
当收到广播 "游戏_开始" 时
    隐藏准备界面
    显示游戏界面
结束

9.2 任务系统与成就系统联动

// 任务完成
当满足任务完成条件时
    发送广播 "任务_完成" 带参数 任务ID=1
结束

// 任务系统响应
当收到广播 "任务_完成" 时
    记录任务完成
    发放奖励
    发送广播 "奖励_发放"
结束

// 成就系统响应
当收到广播 "任务_完成" 时
    检查是否解锁成就
    如果 解锁成就
        发送广播 "成就_解锁" 带参数 成就ID=5
    结束
结束

// UI 系统响应
当收到广播 "成就_解锁" 时
    显示成就弹窗
    播放音效
结束

相关页面


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

参与维护

发现文档问题?

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

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