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…

Pytest基础

第一章、pytest概述 Pytest 是一个功能强大且易于使用的 Python 测试框架,用于编写和运行单元测试、集成测试和功能测试。以下是 Pytest 测试框架的一些主要特点和用法: 特点: 简单易用: Pytest 的语法简单直观,容易…

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

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

C语言题型归纳

请认真掌握背记并自行编程一遍,运行是检验程序正确的唯一标准!!! 数的交换 :利用第三个变量来实现数值的交换 int tmp; tmp a; a b; b tmp; 数的整除 同时被两个数整除 a%b0 && a%c0 数的分解与合并 …

23111 网络编程 面试题

1.进程与线程的区别 进程之间资源是独立的,是资源分配的最小单位,进程的pid是FILE函数的返回的句柄,子进程初始资源是拷贝父进程的,进程分为用户空间和内核空间; 同一进程下的线程之间共享资源,是任务分配…

做FP独立站怎么引流?这个引流法宝收好了!

近年来,由于卖家数量飙升导致平台竞争持续升级,卖家之间的恶性循环竞争以及平台政策的不断调整等,造成了众多亚马逊等跨境卖家纷纷从平台转向独立站。可是,转型做独立站前要先考虑清楚独立站与平台二者之间的区别。 如果在第三方平…

EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格

EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格 对应表格复制 Sub tableTest()Set winhttp CreateObject("winhttp.WinHttpRequest.5.1")Set HTML CreateObject("htmlfile")Set oWindow HTML.ParentWindowUrl "https://www.taiwanlo…

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

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

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

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