Unity 外观模式(实例详解)

文章目录

      • 示例1:初始化游戏场景中的多个子系统
      • 示例2:管理音频播放
      • 示例3:场景加载流程
      • 示例4:UI管理器
      • 示例5:网络服务通信

在Unity中使用外观模式(Facade)时,主要目的是为了简化复杂子系统间的交互,为外部提供一个更简洁、统一的接口。以下是一个简化的概念性示例,并扩展为5个不同场景下的代码实例:

示例1:初始化游戏场景中的多个子系统

// 子系统接口或类定义
public interface ISubSystemA
{void Initialize();
}public class SubSystemA : ISubSystemA
{public void Initialize(){Debug.Log("Subsystem A initialized.");}
}public interface ISubSystemB
{void Initialize();
}public class SubSystemB : ISubSystemB
{public void Initialize(){Debug.Log("Subsystem B initialized.");}
}// 外观(Facade)类
public class GameInitializerFacade
{private ISubSystemA _subSystemA;private ISubSystemB _subSystemB;public GameInitializerFacade(ISubSystemA subSystemA, ISubSystemB subSystemB){_subSystemA = subSystemA;_subSystemB = subSystemB;}public void InitializeGame(){_subSystemA.Initialize();_subSystemB.Initialize();Debug.Log("All subsystems initialized through Facade.");}
}// 使用外观模式初始化游戏
public class GameManager : MonoBehaviour
{void Start(){var initializer = new GameInitializerFacade(new SubSystemA(), new SubSystemB());initializer.InitializeGame();}
}

示例2:管理音频播放

public interface IAudioPlayer
{void PlayMusic(string track);void PlaySoundEffect(string effect);
}public class AudioPlayer : IAudioPlayer
{// 实现音频播放逻辑...
}public class AudioManagerFacade
{private IAudioPlayer _audioPlayer;public AudioManagerFacade(IAudioPlayer audioPlayer){_audioPlayer = audioPlayer;}public void PlayMainMenuMusic(){_audioPlayer.PlayMusic("MainTheme");}public void PlayJumpSound(){_audioPlayer.PlaySoundEffect("Jump");}
}// 在游戏中通过外观来控制音频
public class SceneController : MonoBehaviour
{private AudioManagerFacade _audioManager;void Start(){_audioManager = new AudioManagerFacade(new AudioPlayer());_audioManager.PlayMainMenuMusic();}void OnJump(){_audioManager.PlayJumpSound();}
}

示例3:场景加载流程

public interface ISceneLoader
{void Load(SceneName scene);void Unload(SceneName scene);
}public class SceneManager : ISceneLoader
{// 实现场景加载卸载功能...
}public class SceneLoadingFacade
{private ISceneLoader _sceneLoader;public SceneLoadingFacade(ISceneLoader loader){_sceneLoader = loader;}public void LoadMainMenu(){_sceneLoader.Load(SceneName.MainMenu);}public void LoadGameplay(){_sceneLoader.Unload(SceneName.MainMenu);_sceneLoader.Load(SceneName.Gameplay);}
}// 游戏流程控制
public class TransitionController : MonoBehaviour
{private SceneLoadingFacade _loadingFacade;void Start(){_loadingFacade = new SceneLoadingFacade(new SceneManager());_loadingFacade.LoadMainMenu();}public void OnPlayButtonClicked(){_loadingFacade.LoadGameplay();}
}

示例4:UI管理器

public interface IUIManager
{void ShowMenu(MenuType menu);void HideMenu(MenuType menu);
}public class UIManager : IUIManager
{// 实现菜单显示隐藏逻辑...
}public class UIFacade
{private IUIManager _uiManager;public UIFacade(IUIManager manager){_uiManager = manager;}public void OpenSettings(){_uiManager.ShowMenu(MenuType.Settings);}public void CloseAllMenus(){_uiManager.HideMenu(MenuType.All);}
}// 游戏中UI控制
public class MenuInteraction : MonoBehaviour
{private UIFacade _uiFacade;void Start(){_uiFacade = new UIFacade(new UIManager());}void OnSettingsButtonClick(){_uiFacade.OpenSettings();}void OnBackPressed(){_uiFacade.CloseAllMenus();}
}

示例5:网络服务通信

public interface INetworkService
{void Connect(string address);void SendData(byte[] data);void Disconnect();
}public class NetworkServiceImpl : INetworkService
{// 实现网络连接和数据发送逻辑...
}public class NetworkServiceFacade
{private INetworkService _networkService;public NetworkServiceFacade(INetworkService service){_networkService = service;}public void ConnectToServer(string ip, int port){string address = $"{ip}:{port}";_networkService.Connect(address);}public void SendGameData(GameData data){byte[] serializedData = SerializeGameData(data);_networkService.SendData(serializedData);}public void DisconnectFromServer(){_networkService.Disconnect();}
}// 游戏中网络模块调用
public class NetworkController : MonoBehaviour
{private NetworkServiceFacade _networkFacade;void Start(){_networkFacade = new NetworkServiceFacade(new NetworkServiceImpl());}void OnConnectButtonClicked(){_networkFacade.ConnectToServer("192.168.0.1", 12345);}void OnSendGameData(){GameData gameData = GetGameData();_networkFacade.SendGameData(gameData);}void OnDisconnectButtonClicked(){_networkFacade.DisconnectFromServer();}
}

以上每个例子都展示了如何通过外观模式将复杂的子系统操作封装成简单易用的方法,在Unity项目中提供了更高层次的抽象和控制。

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/646133.shtml

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

相关文章

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包,即把源代码一个一个的 js 文件,打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式,entry指定打包入口,output指定打包输出目录。 另外,由于 webpack默认只能打…

6轴机器人运动正解-逆解控制【1】——三种控制位姿的方式

概览: 通过运动学正解控制机器人运动通过运动学逆解控制机器人运动一个简单的物体搬运(沿轨迹运动) 后续会陆续更新(本例仅供学习交流用) 一、6轴机器人 二、运动正解控制 通过修改各个轴的角度,实现末…

宠物互联网医院系统:数字化呵护你爱宠的新时代

宠物互联网医院系统正在为宠物主人提供一种前所未有的数字化健康护理体验。通过结合创新技术,这一系统旨在让宠物医疗变得更加便捷、智能和个性化。让我们深入探讨宠物互联网医院系统的技术核心,以及如何应用代码为你的爱宠提供最佳关怀。 1. 远程医疗…

linux clickhouse 安装

1、官网下载clickhouse安装包 下载地址, clickhouse分lts和stable版本,lts是长期版本,一般选择安装lts版本。 其中clickhouse-server是clickhouse服务,就是用来访问数据存储数据,clickhouse-client是用来通过命令访问数…

Java中的HTTPS通信

在Java中实现HTTPS通信,主要涉及到SSL/TLS协议的使用,用于提供数据传输的安全性。下面我们将深入探讨如何使用Java进行HTTPS通信。 一、基本概念 HTTPS,全称为Hypertext Transfer Protocol Secure,是HTTP的安全版本。它使用SSL/…

CSS之高度塌陷和外边距塌陷

目录 1.高度塌陷(原因,如何解决) 【概念介绍】 【解决办法】 【概念介绍-BFC】 【拓展-BFC的触发条件】 2.外边距塌陷 (原因,如何解决) 【概念介绍】 【两种情况】 1.相邻块元素 2.嵌套块元素 【…

码龙乘风 - AI助你不断升级的编程体验

这几年,人工智能(AI)技术飞速发展,现已深入到编程工具之中,助力程序员不断提高工作效率。下面我就谈谈 AI 给编程带来的一些实用功能,以及如何利用好这些功能,让编码变得更轻松、高效。 一、AI辅助编写代码 现在已有不少编程工具加入了AI助手,可以在编码时自动补全代码、提示…

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢! 本文对…

eNSP学习——VLAN基础配置及Access接口

目录 原理概述 实验内容: 实验目的: 实验步骤: 实验拓扑 配置过程 实验编址 基本配置 创建vlan 配置Access接口 原理概述 早期的局域网技术是基于总线型结构的。总线型拓扑结构是由一根单电缆连接所有主机,就导致所…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman,1983年9月推出GNU项目,并发起自由软件运动(free software movement或free/open…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

7.FPR/TNR-机器学习模型性能的常用的评估指标

FPR/TNR指标在机器学习中并不常用,因此,此处简单的介绍相应的概念和公式,帮助大家全面了解机器学习相关的评估指标。 一.FPR/TNR的定义和公式 在机器学习中,性能评估是了解模型在处理任务中的效果的关键部分。FPR(Fa…

内网穿透、远程桌面、VPN的理解

最近在研究内网穿透的相关技术,然后回想起一些相关的技术,比如说要远程桌面公司的电脑,VPN连入内网等。然后想着在此处记录一下,各个的区别,这个纯粹是从技术层面的理解,此处不详细解释怎么去实现或者用什么…

el-table在鼠标移动到单元格时变为下拉框,否则是普通文本

el-table将多个单元格改为下拉框&#xff0c;导致渲染卡顿&#xff0c;解决方法在鼠标移动到单元格时变为下拉框&#xff0c;否则是普通文本 <el-table-column label"显示方向" width"150px" align"center" key"direction" prop&q…

Jmeter分布式压测过程常见问题

1、JMeter分布式压测试&#xff0c;结果树响应数据为空 解决&#xff1a;打开主控机的jmeter-bin,打开jmeter-properties,将modeStandard 前面的#去掉&#xff0c;保存重启jmeter 2、JMeter压力测试报Address already in use: connect错误 方法一&#xff1a; cmd中&#x…

SpringBoot实现热部署

一、热部署&#xff08;Hot Swap&#xff09; 从Java1.4起&#xff0c;JVM引入了HotSwap&#xff0c;能够在Debug的时候更新类的字节码。所以使用热部署&#xff0c;可以实现修改代码后&#xff0c;无须重启服务就可以加载修改的代码&#xff0c;但是它只能用来更新方法体。 实…

2023-2024年重庆职业院校技能大赛“信息安全管理与评估”比赛样题

2023 年重庆职业院校技能大赛&#xff08;高等职业教育&#xff09; “信息安全管理与评估”样题任务书 第一阶段&#xff1a;任务 1 网络平台搭建&#xff08;50 分&#xff09;任务 2 网络安全设备配置与防护&#xff08;250 分&#xff09; 第二阶段&#xff1a;第一部分 网…

web蓝桥杯真题--14、关于你的欢迎语

介绍 营销号&#xff0c;有时候需要一些特定的欢迎语&#xff0c;但针对特定的用户&#xff0c;我们希望可以个性化一点。本题需要在项目文件中修改代码存在的问题&#xff0c;实现根据模版生成特定用户的欢迎语。 准备 本题已经内置了初始代码&#xff0c;打开实验环境&…

flutter-相关个人记录

1、flutter 安卓打包打包报错 flutter build apk -v --no-tree-shake-icons 2、获取华为指纹证书命令 keytool -list -v -keystore ***.jks 3、IOS项目中私有方法查找隐藏文件中 1、cd 项目目录地址 2、grep -r xerbla. "xerbla"为需要查找的关键字 3…

【秒剪】如何一键恢复至素材原长?

Step1:点击下方【剪辑】 Step2:点击【时长截取】 Step3:点击【恢复至原长】 Step4:点击【恢复所有片段到原长】