原文来自:https://github.com/TYJia/GameDesignPattern_U3D_Version

基本思想:事件与其他对象行为的解耦——例如一个代码描述了日本核电站爆炸的事件,世界人民买盐这种行为显然不应该由核电站爆炸直接调用,而是通过卫星电视告诉广大群众,群众想买盐还是想买仙人掌就由他们自己决定了~

为什么要使用它

  • 解耦,物价局改了粮价不需要挨家挨户通知公民,只需要让电视台播个新闻就好
  • 如果要挨家挨户通知,物价局必须有每个公民的地址,这显然不合理,也会浪费很多资源
  • 扩展困难——如果公民改了地址或者有新公民出生了,那还需要告诉物价局,这也很荒唐

代码示例:

射手(Shooter,观察者,这里是听众)告诉广播电台(Radio)自己要听发射气球的广播

吹气球的人(Emitter) 向上发出气球,并告诉广播电台自己发射了气球

广播电台广播发射了气球的消息,所有射手向气球射击

这个例子中吹气球的人不会关心谁是射手,射手也不用在意谁是吹气球的人

Emitter

通过EmitBall()方法释放气球(白色球体),并通知Radio有释放气球的事件(调用 OnEmitEvent (Transform target) )

Shooter

告诉Radio要收听(观察)OnEmitEvent事件,事件发生时向气球射击,发出红色子弹

Radio.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Radio : MonoBehaviour
{public delegate void EmitHandler(Transform target);public EmitHandler OnEmitEvent;public static Radio Instance;void Awake(){Instance = this;}
}

Shooter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Shooter : MonoBehaviour
{public GameObject Bullet;private void Start(){AddObserver();}private void AddObserver(){Radio.Instance.OnEmitEvent += Shoot;}private void Shoot(Transform target){GameObject go = Instantiate(Bullet, transform.position, Quaternion.identity);go.GetComponent<Rigidbody>().velocity = (target.position - transform.position).normalized * 30f;}
}

Emitter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Emitter : MonoBehaviour
{public GameObject Ball;void Start(){Invoke("EmitBall", 1f);}void EmitBall(){GameObject go = Instantiate(Ball);go.GetComponent<Rigidbody>().velocity = Vector3.up * 2f;Invoke("EmitBall", Random.Range(0.5f, 1.5f));if (Radio.Instance.OnEmitEvent != null){Radio.Instance.OnEmitEvent(go.transform);}}
}

ObjDestroy.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ObjDestroy : MonoBehaviour {// Use this for initializationvoid Start (){Invoke("DestroyThis",3f);}private void DestroyThis(){Destroy(gameObject);}
}

游戏中的设计模式之观察者模式 笔记相关推荐

  1. 游戏开发入门(二)游戏中的设计模式

    视频链接:游戏开发入门(二)游戏中的设计模式(3节课 时常:约2小时40分钟) 该视频主要围绕游戏中常见的设计模式展开讲解并实践,需要大家多多实践与理解 笔记与总结(请先学习视频内容): 1.有必要深 ...

  2. 游戏里的设计模式之观察者模式

    游戏里的设计模式之观察者模式 观察者模式 观察这样一来,当一个对象改变状态时,它的所有依赖者都会收到通 知自动更新. ---------<head first 设计模式> ​ 观察者模式的 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. 游戏中的设计模式(1)--观察者模式

    作为本系列文章的第一篇,笔者在此想表达一下个人对于设计模式的一些理解.因此笔者自问自答几个问题.1,什么是设计模式?2,在软件快速迭代的今天,设计模式是否重要?3,四人帮提出了23个设计模式,是不是设 ...

  5. 多人联机射击游戏中的设计模式应用

    转:http://blog.csdn.net/lovelion/article/details/8262987 反恐精英(Counter-Strike, CS).三角洲部队.战地等多人联机射击游戏广受 ...

  6. 【转】多人联机射击游戏中的设计模式应用(一)

    为了方便大家更加系统地学习和掌握各种常用的设计模式,下面通过一个综合实例--"多人联机射击游戏"来学习如何在实际开发中综合使用设计模式. 反恐精英(Counter-Strike, ...

  7. 多人联机射击游戏中的设计模式应用(一)

    为了方便大家更加系统地学习和掌握各种常用的设计模式,下面通过一个综合实例--"多人联机射击游戏"来学习如何在实际开发中综合使用设计模式. 反恐精英(Counter-Strike, ...

  8. 多人联机射击游戏中的设计模式应用(二)

          (6) 观察者模式      联机射击游戏可以实时显示队友和敌人的存活信息,如果有队友或敌人阵亡,所有在线游戏玩家将收到相应的消息,可以提供一个统一的中央角色控制类(CenterContr ...

  9. 游戏开发入门 二、游戏中的设计模式

    笔记与总结: 1.有必要深刻的认识到设计模式的意义         游戏开发是一个软件工程,他的特点是需求极易变化.对于任何一个软件工程,我们要从代码的组织方式上来提高其可读性(别人也很容易理解),安 ...

最新文章

  1. 基于Docker的SaaS解决方案
  2. linux语言windows 语言,作业系统一般用什么编码语言程式设计?如:Windows,Linux,是组合语言吗?还是自己开发的程式码?...
  3. apue 2013-03-16
  4. 从概设流程、审美、设计思路几个方面,漫谈游戏美术设计的思维方式
  5. 8 个 Python 实用脚本,赶紧收藏备用!
  6. python创建函数、可以接受任意多个整数参数并求和_pythonxlwt:求和函数最大参数限制?...
  7. java判断当前时间距离第二天凌晨的秒数
  8. Selenium脚本编写技巧和窍门
  9. Android编程之LocalBroadcastManager源码详解
  10. 虚拟 ​router 原理分析- 每天5分钟玩转 OpenStack(101)
  11. 信息安全工程师教程知识点总结(第二版)
  12. 手把手教你用Python操作Word自动编写离职报告!
  13. 随机过程之马尔科夫链
  14. idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案
  15. uni-app微信小程序——商城(8)——订单详情
  16. 黑莓android系统,黑莓Passport的手机系统是什么?能升级安卓5.0吗?
  17. 飞利浦净化器还能走多远
  18. JQuery 日期选择框,精确到时分秒类型。
  19. 明日之后服务器崩了最新消息,《明日之后》崩了是什么原因?明日之后崩了怎么登陆服务器...
  20. 数字孪生数字工厂 数字孪生工厂解决方案

热门文章

  1. 制作bat文件的方法
  2. 自动化处理--python读取word中表格内容
  3. FreeBSD安装(虚拟机)version:13.1
  4. 缩点 CF893C Rumor
  5. ucenter api php,UCenter API使用入门
  6. [Python] 字符串操作及方法总结
  7. [20120919] 关于紫光输入法.txt
  8. python妙用桌面计算器
  9. “万物盲盒”的时代,企业如何玩转“盲盒”经济?
  10. Jetson nano 入手系列之2—板载摄像头IMX219启动