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.hqwc.cn/news/437873.html

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

相关文章

MySQL数据查询语言DQL

MySQL数据查询语言DQL 目录 MySQL数据查询语言DQLDQL关键字数据查询语言DQL1.查询表2.子查询3.联表查询4.GROUP BY5.HAVING6.分页查询7.排序查询 DQL关键字 DQL关键字含义SELECTSELECT 字段列表,查询检索的列或表达式,它指定了最终结果包含的列FROMFROM…

vue —— h函数的学习与使用

文章目录 一、h函数是什么?二、h函数格式说明及使用示例1:简单创建一个VNode(vue3)示例2:vue2中h函数用法示例3:vue3中h函数的用法vue2和vue3中h函数的区别? 三、h函数实现原理四、h函数常用场景…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本,其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

opencv学习笔记

学习OpenCV3 文章目录 学习OpenCV3openCV模块介绍 图片处理滤波/卷积核高斯滤波 算子索贝尔(sobel)算子沙尔(Scharr)算子拉普拉斯算子Canny边缘检测 **实际使用** 形态学获取形态学卷积核全局二值化自适应阈值二值化腐蚀操作膨胀操作开运算、闭运算形态学梯度顶帽操作黑帽操作 …

Redis 学习笔记 2:Java 客户端

Redis 学习笔记 2:Java 客户端 常见的 Redis Java 客户端有三种: Jedis,优点是API 风格与 Redis 命令命名保持一致,容易上手,缺点是连接实例是线程不安全的,多线程场景需要用线程池来管理连接。Redisson&…

Flink的SQL开发

概叙 Flink有关FlinkSQL的官网: https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/overview/ 阿里云有关FlinkSQL的官网: https://help.aliyun.com/zh/flink/developer-reference/overview-5?spma2c4g.11186623.0.0.3f55bbc6H3LVyo Ta…

谷歌seo内容营销怎么做?

谷歌SEO内容营销就像是在为两个观众准备一场表演,一边是用户,一边则是谷歌搜索引擎,那么所谓的内容营销,你自然需要知道你的观众想看什么,这就是关键词研究,帮你了解用户在搜索什么,然后&#x…

表单常用正则表达式(手机,邮箱,身份证,数字,空格...)

#表单常用正式表达式 为了后面项目的拿来即用以便不时之需,特意整理一文,把常用的表单验证的正则表达式整理如下。 不能为空 pattern: /^[^\s]$/ 验证手机号 pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

阿里云购买云服务部署小记

1.先购买云服务器 阿里云网址 阿里云云服务器购买 我这是前端时间出活动买的 点击购买 注: 3M的带宽,可以支持同一秒访问30-35个人不卡(其他依次类似类推) 购买前配置的话 选的也没那么多 一般开发人员根据自己喜好顺手的来 跟我一样是刚接触小白的话 听客服…

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为:能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样,Gartner评估了400多款低代码/无代码…

PWN 常用工具-补充

目录 pwndbg 如何加载文件 如何运行到Main函数停止 如何查看程序的内存布局 查看内存地址存储的值 如何查看某个地址存储的指令 搜索字符串 打印 调试相关 断点相关 查看栈内数据 查看栈调用顺序 从程序回到gdb 修改内存中的值 file 可执行文件特征 动态链接文…