Unity 中介者模式 (实例详解)

文章目录

    • 简介
    • 实例1:玩家与UI交互
    • 实例2:战斗模块中的攻击事件协调
    • 实例3:游戏场景中的事件广播
    • 实例4:模块间通信 - 地图导航与角色移动
    • 实例5:UI模块间同步 - 菜单切换与选项状态

简介

在Unity游戏开发中,中介者(Mediator)模式用于降低多个对象之间的耦合度,通过引入一个中介类来封装和管理对象间的交互。下面我将提供五个简化的代码实例来说明如何在Unity项目中应用中介者模式:

实例1:玩家与UI交互

// 定义用户界面组件接口
public interface IUiComponent
{void UpdateHealth(int health);void UpdateScore(int score);
}// 玩家类,实现UI组件接口的更新方法调用
public class Player : MonoBehaviour
{private Mediator _mediator;public void SetMediator(Mediator mediator){_mediator = mediator;}// 当玩家生命值改变时,通知中介者更新UIpublic void ChangeHealth(int amount){int newHealth = GetHealth() + amount;_mediator.UpdateHealth(newHealth);}// 获取当前生命值的方法(实际项目中会有具体实现)private int GetHealth() { return 100; }
}// UI面板类,实现IUiComponent接口
public class HealthAndScoreUI : MonoBehaviour, IUiComponent
{public void UpdateHealth(int health){// 更新UI显示的生命值Debug.Log("Updating health to: " + health);}public void UpdateScore(int score){// 更新UI显示的分数Debug.Log("Updating score to: " + score);}
}// 中介者类
public class Mediator
{private IUiComponent _ui;public void RegisterUi(IUiComponent ui){_ui = ui;}public void UpdateHealth(int health){if (_ui != null)_ui.UpdateHealth(health);}// 同理可以定义UpdateScore等方法
}// 在场景初始化或Awake阶段进行关联
public class GameManager : MonoBehaviour
{public Mediator Mediator;public Player Player;public HealthAndScoreUI HealthScoreUI;void Start(){Player.SetMediator(Mediator);Mediator.RegisterUi(HealthScoreUI);}
}

实例2:战斗模块中的攻击事件协调

public interface IBattleParticipant
{void ReceiveDamage(int damage);void Attack(IBattleParticipant target);
}public class Warrior : MonoBehaviour, IBattleParticipant
{private Mediator _mediator;public void SetMediator(Mediator mediator){_mediator = mediator;}public void AttackButtonClicked(){_mediator.Attack(this);}public void ReceiveDamage(int damage){// 实际处理伤害逻辑}public void Attack(IBattleParticipant target){// 计算并发出攻击int attackDamage = CalculateAttackDamage();_mediator.DistributeDamage(this, target, attackDamage);}// 其他战斗相关方法...
}public class BattleMediator
{private List<IBattleParticipant> _participants;public void RegisterParticipant(IBattleParticipant participant){_participants.Add(participant);}public void DistributeDamage(IBattleParticipant attacker, IBattleParticipant defender, int damage){defender.ReceiveDamage(damage);}// 其他战斗协调逻辑...
}

实例3:游戏场景中的事件广播

public class SceneMediator
{private List<IMediatorListener> _listeners;public void RegisterListener(IMediatorListener listener){_listeners.Add(listener);}public void UnregisterListener(IMediatorListener listener){_listeners.Remove(listener);}public void NotifyPlayerJoined(Player player){foreach (var listener in _listeners){listener.OnPlayerJoined(player);}}// 其他事件通知方法...
}public interface IMediatorListener
{void OnPlayerJoined(Player player);
}public class ScoreKeeper : MonoBehaviour, IMediatorListener
{public void OnPlayerJoined(Player player){// 更新玩家加入后的得分信息}
}public class ChatManager : MonoBehaviour, IMediatorListener
{public void OnPlayerJoined(Player player){// 在聊天频道广播玩家加入消息}
}

实例4:模块间通信 - 地图导航与角色移动

public interface INavigationRequestor
{void RequestMove(Vector3 destination);
}public class CharacterController : MonoBehaviour, INavigationRequestor
{private NavigationMediator _mediator;public void SetNavigationMediator(NavigationMediator mediator){_mediator = mediator;}public void MoveToTargetPosition(Vector3 position){_mediator.RequestMove(position);}
}public class NavigationMediator
{private IAstarPathFinder _pathFinder;public void RegisterPathFinder(IAstarPathFinder pathFinder){_pathFinder = pathFinder;}public void RequestMove(Vector3 destination){var path = _pathFinder.FindPath(transform.position, destination);// 处理路径规划结果,并通知CharacterController开始移动}
}public interface IAstarPathFinder
{List<Vector3> FindPath(Vector3 start, Vector3 end);
}

实例5:UI模块间同步 - 菜单切换与选项状态

public interface IMenuComponent
{void EnableMenu();void DisableMenu();void NotifyOptionChanged(string optionName, object newValue);
}public class MainMenu : MonoBehaviour, IMenuComponent
{private MenuMediator _mediator;public void SetMediator(MenuMediator mediator){_mediator = mediator;}public void OnSettingsButtonClicked(){_mediator.ToggleMenuToShow(SettingsMenu.instance);}// 实现菜单启用、禁用以及选项更改的通知方法
}public class SettingsMenu : MonoBehaviour, IMenuComponent
{// 实现菜单组件接口的方法// ...public void OnResolutionChange(int width, int height){Screen.SetResolution(width, height, true);_mediator.NotifyOptionChanged("Resolution", new Resolution(width, height));}
}public class MenuMediator
{private IMenuComponent _currentActiveMenu;public void RegisterMenu(IMenuComponent menu){if (_currentActiveMenu == null)ActivateMenu(menu);}public void ToggleMenuToShow(IMenuComponent newMenu){DeactivateCurrentMenu();ActivateMenu(newMenu);}private void ActivateMenu(IMenuComponent menu){_currentActiveMenu = menu;_currentActiveMenu.EnableMenu();}private void DeactivateCurrentMenu(){if (_currentActiveMenu != null){_currentActiveMenu.DisableMenu();_currentActiveMenu = null;}}public void NotifyOptionChanged(string optionName, object newValue){// 根据optionName更新所有关联菜单的状态或其他模块响应选项更改}
}

以上每个例子都展示了中介者模式如何在不同场景下作为沟通桥梁,减少直接依赖,简化了各个模块之间的交互逻辑。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识K8S(Kubernetes )

一、概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。&#xff08;官网&#xff09; Kuberne…

Go语言基础之接口

接口类型 一个接口类型就是一组方法的集合&#xff0c;它规定了需要实现的所有方法。 接口的定义 每个接口类型由任意个方法签名组成&#xff0c;接口的定义格式如下&#xff1a; type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列表1方法名2( 参数列表2 ) 返回值列…

【开源】基于JAVA+Vue+SpringBoot的智慧家政系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

Qt项目文件以及对象树

"在哪里走散&#xff0c;你都会找到我~" 前篇&#xff0c;我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目&#xff0c;Qt会为自动创建诸如&#xff1a;.pro、.h\.cpp、.iu等文件&#xff0c;这些文件到底是什么&#xff1f;我们在使用Qt时 应该…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

mysql注入联合查询

环境搭建 下载复现漏洞的包 下载小皮面板 将下载好的文件解压在小皮面板的phpstudy_pro\WWW路径下 将这个文件phpstudy_pro\WWW\sqli-labs-php7-master\sql-connections\db-creds.inc 中的密码更改为小皮面板中的密码 选择php版本 在小皮中启动nginx和数据库 使用环回地址访…

JavaScript 学习笔记(JS进阶 Day4)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

NodeJs环境安装与配置

最近电脑重装了系统&#xff0c;开发环境啥的都得重装&#xff0c;顺便记录下 nodeJs 的安装与配置&#xff0c;方便需要的同学查看&#xff0c;也方便自己以后查找。 安装 下载地址&#xff1a;https://nodejs.cn/download/ 根据需要选择自己环境需要的下载即可&#xff0c;…

【cdh】hive执行SQL提示缺少3.0.0-cdh6.3.2-mr-framework.tar.gz文件

问题&#xff1a;执行SQL报错提示缺少文件 异常信息如下 在hdfs上查看的时候连文件夹都没有&#xff0c;所以这个异常会抛出&#xff0c;但是我是基于CDH搭建的&#xff0c;可以直接基于下面操作 执行完成之后查看HDFS文件 重新执行SQL发现可以正常执行了

web前端项目-实现录音功能【附源码】

录音功能 运行效果&#xff1a;本项目可实现录音软件的录音、存储、播放等功能 HTML源码&#xff1a; &#xff08;1&#xff09;index.html&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/h…

【BUG】联想Y7000电池电量为0且无法充电解决方案汇总

因为最近火灾很多&#xff0c;所以昨天夜晚睡觉的时候把插线板电源关掉了&#xff0c;电脑也关机了。 各位一定要注意用电安全&#xff0c;网上的那些事情看着真的很难受qvq。 第二天早上起床的时候一看发现电脑直接没电了&#xff0c;插上电源后也是显示 你一定要冲进去啊(ू˃…

springboot外出务工人员信息管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期间某村外…

2024阿里云和腾讯云的第一战打响:搭建《幻兽帕鲁》私服游戏

为了搭建《幻兽帕鲁》游戏私服&#xff0c; 2024年阿里云 VS 腾讯云的第一场战争开始了…… 事情是这样的&#xff1a; 1月19日&#xff0c;最离谱新游 《幻兽帕鲁》突然爆火了&#xff0c;这是一款日本开发商展耗费4年开发的冒险类游戏&#xff0c;这款戏一推出就迅速俘获了…

DOM 型 XSS 攻击演示(附链接)

一、介绍 DOM&#xff08;Document Object Model&#xff09;型 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种 Web 应用程序中的安全漏洞&#xff0c;其特点是攻击者成功地注入了恶意脚本&#xff0c;这些脚本在用户的浏览器中执行&#xff0c;从而导致恶意行为…

AcWing 895. 最长上升子序列(DP序列模型)

[题目概述] 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 1000 &#xff0c; …

【刷题】 leetcode 面试题 08.05.递归乘法

递归乘法 1 题目描述2 思路一&#xff08;返璞归真版&#xff09;3 思路二&#xff08;二进制乘法器版&#xff09;4 思路三&#xff08;变态版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 题目…

不确定优化入门:用简单实例讲明白随机规划、鲁棒优化和分布鲁棒优化

文章目录 1 引言2 学习动机3 经典问题4 解决方案4.1 忽略不确定性4.2 随机规划4.3 鲁棒优化4.4 分布鲁棒优化 5 总结相关阅读 1 引言 按2024的原定计划&#xff0c;今年开始要学习不确定优化了。 粗略翻阅了一些相关的书籍和教程&#xff0c;大都包含许多数学公式&#xff0c…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备&#xff08;例如硬盘&#xff09;是否可读写&#xff0c;但在Java中并没有直接针对硬件级别的磁盘探活API。然而&#xff0c;我们可以模拟一个场景&#xff0c;即检查某个目录或文件是否可以被Java程序正常读写&#xff0c;以此作为主盘活跃的一个…

HCIP复习课(bgp实验)

1、ip配置&#xff1a; R1&#xff1a; R2&#xff1a; R9&#xff1a; R10&#xff1a; R11&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; 2、隧道配置&#xff1a; R2&#xff1a; 静态&#xff1a; R10&am…

第15次修改了可删除可持久保存的前端html备忘录:换了一个容器时钟,匹配背景主题:现代深色

第15次修改了可删除可持久保存的前端html备忘录&#xff1a;换了一个容器时钟&#xff0c;匹配背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv&qu…