是一个一对多的关系。
是看到b站一个视频up讲解的设计模式很好,所以记录一些这种方式。
视频链接:
观察者模式讲解:
表面上:
实际上:
表面上是,观察者主动的观察大哥的状态有没有改变
实际上是,大哥主动的发消息给小弟,告诉自己的状态改变。
观察者模式结构:
大哥类
大哥类
状态的属性/字段
观察者的小弟列表
大哥修改状态的方法(状态参数)
修改自己状态state
增加小弟方法
修改小弟列表
减少小弟方法
修改小弟列表
大哥广播的方法:
遍历自己体内所有小弟,告诉他们我的状态改变了。
小弟类
小弟类
小弟自己的状态属性
接受信息的方法(大哥的信息参数)
{
小弟自己的状态属性 ;// 大哥信息参数提取出来(更改自己的状态)
}
其他逻辑 小弟检查到自身状态改变,触发其他不同方法逻辑。做出不同的反应。
小弟发出hello的方法()
{
检查到小弟状态改变,发出hello。
}
案例:
土地 uimanager
使用观察者模式,制作植物的状态。
按下p键,显示ui的按钮,土地是空的状态
土地 状态
空
种子
成长
成熟
bug问题:
声明没有赋值的变量报错。
空指针异常1。
使用transform。find()查找子对象,但是子对象是不可见的。所以查找不到?????
在Unity中,
Transform.Find
方法用于在子对象层级中查找具有特定名称的Transform
组件。这个方法并不考虑对象是否“隐藏”或可见,它只关心对象名称和它们在场景中的层级关系。"隐藏"的Unity对象通常指的是以下几种情况:
禁用状态:如果对象的
GameObject.activeSelf
属性为false
,则对象在场景中不会渲染或参与物理模拟等。但是,即使对象被禁用,它的Transform
仍然存在,因此Transform.Find
仍然可以找到它。渲染设置:对象可能在渲染层面被“隐藏”,比如其材质是透明的,或者它不在当前相机的视野内。这些渲染层面的设置不会影响
Transform.Find
的查找结果。UI元素:对于Unity的UI系统,如果一个UI元素被设置为不可见(比如其
Visible
属性为false
),这同样不会影响它在Transform.Find
中的可查找性。因此,
Transform.Find
方法可以查找到场景层级中任何具有特定名称的子对象,不论这些对象是否处于“隐藏”状态。如果你无法通过Transform.Find
找到某个对象,那么最可能的原因是:
- 对象名称不正确或大小写不匹配(Unity的Transform名称是区分大小写的)。
- 对象不是你调用
Transform.Find
的Transform的直接或间接子对象。- 对象可能已被删除或未正确添加到场景中。
请检查这些可能的原因,确保你正确地使用
Transform.Find
方法。如果你确实想要基于对象的可见性或其他属性来查找对象,你可能需要编写自定义的逻辑来遍历子对象并应用这些条件。
空指针2
发布订阅模式和观察者模式区别:
观察者模式:
大哥管理小弟,知道小弟存在
发布订阅模式:
不知道对方的存在
发布订阅模式和观察者模式之间的主要区别在于它们之间的耦合度、通信方式以及事件调度的方式。以下是相关介绍:
- 耦合度。观察者模式通常具有较高的耦合度,因为观察者(Observer)和目标(Subject)之间是直接联系的,观察者依赖于目标的存在;发布订阅模式提供了更松散的耦合,其中发布者(Publisher)和订阅者(Subscriber)不需要直接交互,而是通过一个调度中心(如事件通道)进行通信。
- 通信方式。在观察者模式中,目标的变化直接通知给所有注册的观察者,这种通信方式是同步的;发布订阅模式通常使用消息队列,允许事件以异步的方式被订阅者处理。
- 事件调度的方式。发布订阅模式有一个事件调度中心,负责管理事件的发布和订阅,这样可以使订阅者与发布者之间的依赖关系被隔离,简化开发过程;观察者模式中,目标(Subject)需要维护对所有观察者的引用,并在状态变化时通知它们。
总结来说,发布订阅模式提供了一种更加灵活、解耦的方式来处理对象之间的依赖关系,特别是在需要处理大量事件或不同类型事件的场景中更为适用。