对于这类问题,通知很好。根本没有直接的对象耦合,如果多个对象最终需要知道它是非常可扩展的(例如你的健康条组件,一个决定游戏结束的更高级别的游戏对象,甚至可能敌人/盟友 AI 在健康状况不佳)。
您可以有一个名为“playerHealthChanged”的通知,并让您的健康栏组件和其他对象独立注册以响应该事件。(您可能需要让 HealthComponent 实例知道它是否应该发布此通知,所以只有玩家发布 - 也许它可以在其实体上使用 isKind(of:) ,或者只是有一个 bool 字段来启用发布,设置为 true播放器实例)。
我通常将所有通知名称定义放在一个模块中,以便任何类都可以访问它们:
let kPlayerHealthChangedNotification = Notification.Name("playerHealthChanged")
这是组件发布通知的方式(如果需要,您可以传递 self 以外的对象):
NotificationCenter.default.post(name: kPlayerHealthChangedNotification, object:self)
然后关心玩家健康变化的对象可以像这样在他们的初始化代码中注册 - 创建一个处理函数,而不是添加 self 作为通知的观察者:
@objc func onPlayerHealthChanged(_ notification:Notification) {
// do whatever is needed; notification.object
// has the object from the post
}
// put this in a setup method - init or similar:
NotificationCenter.default.addObserver(self,
selector: #selector(onPlayerHealthChanged(_:)),
name: kPlayerHealthChangedNotification
object:nil)
这是文档:https ://developer.apple.com/documentation/foundation/notifications