当前位置: 首页 > wzjs >正文

开网络网站建设公司的优势平面设计师务所

开网络网站建设公司的优势,平面设计师务所,官网微信,做网站的公司一年能赚多少钱实战订阅者发布者模式详解 下面实例是一个射击类游戏,玩家可以切换枪支,最初的设计如下 public class Player:MonoBehaviour {//......省略代码逻辑//我们以及配置好了Scroll的输入,并配置了Scroll的输入事件,当玩家滚动鼠标滚轮…

实战订阅者发布者模式详解

下面实例是一个射击类游戏,玩家可以切换枪支,最初的设计如下

public class Player:MonoBehaviour
{//......省略代码逻辑//我们以及配置好了Scroll的输入,并配置了Scroll的输入事件,当玩家滚动鼠标滚轮时,会调用OnScroll方法,并在ChangeWeapon方法中切换枪支并传回当前枪支的值赋给 currentWeapon 保证在切换枪支时,currentWeapon 能够及时更新处理Player中其他枪支逻辑,例如射击,换弹。private void OnScroll(InputAction.CallbackContext context){float scrollValue=context.ReadValue<Vector2>().y;string weaponState=scrollValue>0?"up":"down";currentWeapon = weapon.ChangeWeapon(weaponState);}
}
public class Weapon:MonoBehaviour
{//......省略代码逻辑public Gun ChangeWeapon(string weaponState){//更换枪支冷却if(weaponSwitchTimer>0){return weapons[currentWeaponIndex];}//切换枪支weapons[currentWeaponIndex].gameObject.SetActive(false);if(weaponState=="up"){currentWeaponIndex=(currentWeaponIndex+1)%weapons.Count;}else if(weaponState=="down"){currentWeaponIndex=(currentWeaponIndex-1+weapons.Count)%weapons.Count;}weapons[currentWeaponIndex].gameObject.SetActive(true);weaponSwitchTimer=weaponSwitchTime;return weapons[currentWeaponIndex];}
}

通过上述代码,我们实现了枪支的切换,并及时更新了当前枪支的值,保证了在切换枪支时,currentWeapon 能够及时更新处理Player中其他枪支逻辑,例如射击,换弹。
但我们不希望只在拨动鼠标滚轮时切换枪支,而是多种方法可以切换枪支,根据我们的需求,我们可以使用一种设计模式来实现。

1. 订阅者发布者模式概述

订阅者发布者模式(也称为观察者模式)是一种设计模式,允许对象订阅事件并在事件发生时得到通知。这种模式通常用于解耦事件的发布者和订阅者,使得它们可以独立变化。

1.1 主要角色

  • 发布者(Publisher):负责发布事件。在本例中,Weapon 充当发布者。
  • 订阅者(Subscriber):负责接收事件通知。在本例中,Player 是订阅者。

2. 代码实现分析

2.1 Player 脚本

public class Player : MonoBehaviour
{private Gun currentWeapon;private Weapon weapon;void Awake(){weapon = GetComponent<Weapon>();currentWeapon = weapon.GetCurrentWeapon();weapon.OnWeaponSwicther += OnWeaponSwicther; // 订阅事件}private void OnWeaponSwicther(Gun newweapon){currentWeapon = newweapon; // 更新当前武器}
}
2.1.1 作用分析
  • 订阅事件weapon.OnWeaponSwicther += OnWeaponSwicther; 这行代码将 OnWeaponSwicther 方法订阅到 OnWeaponSwicther 事件上。
  • 事件处理:当 OnWeaponSwicther 事件被触发时,OnWeaponSwicther 方法被调用,更新当前武器。

2.2 Weapon 脚本

public class Weapon : MonoBehaviour
{public delegate void OnWeaponSwicther(Gun newWeapon);public event OnWeaponSwicther OnWeaponSwicther;public void ChangeWeapen(string weapenState){// 逻辑来改变武器Gun newWeapon = ...; // 获取新的武器实例OnWeaponSwicther?.Invoke(newWeapon); // 触发事件}
}
2.2.1 作用分析
  • 事件声明public event OnWeaponSwicther OnWeaponSwicther;OnWeaponSwicther委托 声明了一个事件,允许其他对象订阅。
  • 事件触发OnWeaponSwicther?.Invoke(newWeapon); 在武器切换时触发事件,通知所有订阅者。

2.3 在其他地方调用

当我们声明了事件后,我们可以在其他地方调用,不仅仅局限在鼠标输入,例如按键调用

public class UITest : MonoBehaviour
{public Weapon weapon;public Button button;void Awake(){button.onClick.AddListener(WeaponTest);}void WeaponTest(){weapon.ChangeWeapen("up");}
}

3. 设计的好处和可维护性

3.1 解耦

  • 模块化:发布者和订阅者之间的解耦使得它们可以独立开发和修改。
  • 灵活性:可以轻松添加或移除订阅者,而无需修改发布者的代码。

3.2 可维护性

  • 易于扩展:可以在不改变现有代码的情况下添加新的订阅者。
  • 清晰的事件流:通过事件机制,逻辑流更加清晰,易于理解和调试。

3.3 实际应用

  • 动态更新:在游戏中,玩家可以动态切换武器,系统会自动更新当前武器的状态。
  • 响应式设计:通过事件机制,系统可以对玩家的操作做出及时响应。

通过这种设计,游戏中的武器切换逻辑变得更加灵活和易于维护。订阅者发布者模式提供了一种优雅的方式来处理对象之间的通信,特别是在复杂的游戏系统中。


文章转载自:

http://wHbDJT1i.rqfmL.cn
http://1ODOV2Dr.rqfmL.cn
http://TMUmuRoJ.rqfmL.cn
http://OLswb5R3.rqfmL.cn
http://1VUdqrKj.rqfmL.cn
http://xQb5u3qX.rqfmL.cn
http://CU9H0jih.rqfmL.cn
http://eVghsfG8.rqfmL.cn
http://hzzWMH4N.rqfmL.cn
http://OqgzzyYg.rqfmL.cn
http://u9AJj0pX.rqfmL.cn
http://iCAdmiZt.rqfmL.cn
http://gA0qHO6Y.rqfmL.cn
http://r3V9S5QL.rqfmL.cn
http://HbSlpmaT.rqfmL.cn
http://YZdvpMGk.rqfmL.cn
http://a8ZgSSCF.rqfmL.cn
http://e32SA6u4.rqfmL.cn
http://56CLdPhF.rqfmL.cn
http://mZWmxYge.rqfmL.cn
http://Meugv0NP.rqfmL.cn
http://i6YGMMlh.rqfmL.cn
http://xXbxpmKw.rqfmL.cn
http://1QCdmesA.rqfmL.cn
http://HizQozP6.rqfmL.cn
http://qyHx3LtT.rqfmL.cn
http://4z45EjdB.rqfmL.cn
http://JkhEGYg5.rqfmL.cn
http://t7KGpIbH.rqfmL.cn
http://WkS5Yx0g.rqfmL.cn
http://www.dtcms.com/wzjs/680441.html

相关文章:

  • 仿制别人网站品牌设计理念
  • 音乐网站开发文档撰写模板长久新开传奇网站
  • 四川餐饮网站建设农村自建房设计图纸及效果图大全
  • 专业网站开发公司地址海南学校网站建设
  • 东阿县住房和城乡建设局网站网络建设方案总结
  • 吉安做网站百度站长统计
  • 如何网站建设网站小程序平台开发多少钱
  • 番禺网站推广公司云南公司网站建设
  • 莆田建设信息网站免费建网站 建站之星
  • 怎么用vps做网站wordpress 自动剪裁
  • pc网站同步手机网站比58同城做的好的网站
  • 网页设计的定义seo sem是做什么的
  • iis6.0如何做网站301免费咨询律师在线一对一问答
  • 全国网站建设有实力旭辉网站建设
  • 网站建设推荐频道江西南昌网站建设服务
  • 网站开发的软件湖南网站seo营销多少费用
  • 律师事务所网站建设网站vr的建设
  • 摄影的网站设计特点腾讯云官网登录入口
  • 设计企业网站百度统计 wordpress
  • 济南建站都选企汇优先做后付注册网站会员违法
  • 做一个平台网站大概多少钱重庆网站建设服务
  • 天水网站制作公司自己做的个人网站无法备案
  • 如何做跨境购物网站电商需要投资吗
  • 中文企业网站html模板保密和档案网站建设方案
  • iis怎么设置网站沈阳互联网公司
  • 网站开发为什么采取ssh框架wordpress 怎么改中文
  • 中山做网站专业的公司网络营销论文
  • 做网站赚钱有哪些途径微信网站特征
  • 哪些网站适合做外贸网站推广谁知道安装卫星天线的电话
  • 破天网站定制手机网站建设和