事件信号推送 无论什么游戏引擎都有类似的跨场景推送要求, 本质上就是不同节点的事件监听:
Unity3D的A预制件如何通知B预制件? Godot的A场景对象如何通知到B场景? …… 这里说个最简单的场景应用: 玩家通过点击商人购物的场景, 需要同步更新玩家GUI的金额和背包内部物品信息, 内部蕴含的就是这种不同场景( 商品界面GUI|玩家界面GUI|背包界面GUI )的多处同步更新.
甚至大型游戏需要细致到点击之后同步不同节点播放多个复杂动画效果, 让游戏效果更加绚丽
这里制作个简单样例:
Merchant 是商店购买界面 Status 是玩家信息状态界面 Player 是详细购买信息提示界面 可以看到以上都是分布三个节点, Merchant 具体负责触发购买事件, 之后需要让 Status 和 Player 获取到购买信息.
具体难点就是 Button 信号事件全在 Merchant 身上, 最简单就是 Shop 根节点挂载具体处理脚本, 之后把由他通知其他所有节点.
但是这种父节点通知下属节点方式是有很大问题的, 因为 Merchant 所有 Button 信号触发事件必须绑定到最上层的 Shop 父节点; 这种绑定锁死上下级关系导致节点千万不能随意变动, 因为按键信号绑定需要类型 ../../Shop.gd 反向绑定节点, 随意变动上下级关系会导致直接事件失效, 而且场景复用频繁也会因为这样没办法绑定指定触发事件.
观察者模式 这是常见的设计模式, 采用全局唯一管理器挂载在进程中等待订阅和推送:
Subscrib: 订阅端, 初始化的时候绑定监听调用服务函数方法 Publish: 推送端, 运行时推送数据给订阅类对象 这里伪代码编写:
# =============================================================
# 假设商人对象等待触发支付
# =============================================================
extends Node
class_name Merchant
# 初始化的时候商人需要订阅结算事件, 因为其无法获取是否能够完成支付
func _init():
PubSub.