Unity3D 设计模式学习之观察者模式

游戏里成就系统可以使用观察者模式。要实现成就系统之前,一般需要企划单位先将需要的成就事件列出来,并在项目完成到某个段落之后,才开始加入实现开发中。

大致实现逻辑:
先定义“游戏事件”,如敌方角色阵亡、玩家角色阵亡、玩家角色升级等。当游戏进行过程中,有任何“游戏事件”被触发时,系统就要通知对应的“成就项目”,进行累积或条件判断,如果达到,则完成“成就项目”并通知玩家或直接给予奖励

比较简单的实现方式

比较简单的实现方式,就是直接在完成游戏事件,就通知成就系统
这里写个简单的代码

if finshed
AchievementSystem.NotifyGameEvent(xxx);

然后在成就系统中,通过枚举、字符串来判断是哪种事件,并传达相应的参数

然后在根据对应传入的函数参数再次执行对应的方法,以达到某种需求作用
需求如:累积属性或判断单词成就是否实现

为什么使用观察者模式来做成就系统?

如果让成就系统负责每一个游戏事件的方法,并针对每一个单独的游戏事件,去进行“成就项目的目的或判断”,会让成就系统的扩充被限制在每个游戏事件处理方法中。

当以后需要针对某一个游戏事件增加成就项目时,就必须通过修改原有“事件处理方法”中的程序才能达成。

例如:想要再增加一个成就项目“杀死装备武器为Rocket”以上的敌人数,那么只能修改Notify_EnemyKilled方法,在其中追加程序代码来实现修改的目标。

并且,“游戏事件”发生时可能不是只有成就系统会被影响,其他系统也可能需要追踪相关的游戏事件。因此,如果都是在“游戏事件”的触发点进行每个系统调用的话,那么触发点的程序代码将变的非常复杂。

所以要将“游戏事件”与“成就系统分开”,让成就系统仅关注于某些游戏事件的发生;而游戏事件的发生,也不是只提供成就系统使用,这样的设计才是适当的设计。

如何完成这样的设计?

如果能将“游戏事件的产生与通知”独立成为一个系统,并且让其他系统都能通过“订阅”或“关注”的方式,来追踪游戏事件系统发生的事。

即:当游戏事件系统发生时,会负责去通知所有“订阅”了游戏事件的系统,此时被通知的系统,再根据自己的系统逻辑自行决定后续的处理操作。

按上述流程来设计,其实就是观察者模式所要表达的内容

观察者模式的定义

GOF对观察者模式(Observer)的定义:
在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。它允许一个被观察的对象(称为主题或被观察者)维护一组依赖于它的对象列表(称为观察者),并在状态发生变化时自动通知观察者。 在Unity中,可以使用C#语言和相关的Unity API来实现观察者模式。下面是一个简单的示例: ```csharp // 定义观察者接口 public interface IObserver { void OnNotify(); } // 定义被观察者类 public class Subject { private List<IObserver> observers = new List<IObserver>(); public void AddObserver(IObserver observer) { observers.Add(observer); } public void RemoveObserver(IObserver observer) { observers.Remove(observer); } public void NotifyObservers() { foreach (var observer in observers) { observer.OnNotify(); } } } // 实现观察者类 public class Observer : IObserver { public void OnNotify() { // 处理通知的逻辑 } } // 使用观察者模式 public class Example : MonoBehaviour { private Subject subject = new Subject(); private Observer observer = new Observer(); private void Start() { subject.AddObserver(observer); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { subject.NotifyObservers(); } } } ``` 在上面的示例中,Subject类是被观察者,它维护了一个观察者列表。Observer类是观察者,它实现了IObserver接口的OnNotify方法来处理通知的逻辑。Example类演示了如何使用观察者模式,在Start方法中将观察者添加到被观察者的列表中,在Update方法中按下空格键时通知观察者。 这只是一个简单的例子,实际应用中可能会有更复杂的场景和逻辑。观察者模式Unity中的应用广泛,可以用于处理事件、消息传递、UI更新等各种情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值