Unity 外观模式(实例详解)

news2024/12/28 5:37:22

文章目录

      • 示例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.coloradmin.cn/o/1418875.html

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

相关文章

如何配置MacLinuxWindows环境变量

这里写目录标题 什么是环境变量什么是PATH为什么要配置环境变量 如何配置环境变量环境变量有哪些环境变量加载顺序环境变量加载详解 配置参考方法一: export PATHLinux环境变量配置方法二:vim ~/.bashrcLinux环境变量配置方法三:vim ~/.bash_…

使用程序设计流程图解析并建立神经网络(不依赖深度学习library)

介绍: ## Flow chart for a simple neural network: #(1)Take inputs 输入 #(2)Add bias (if required) #(3)Assign random weights to input features 随机一个权重 #(4)Run the code for training. 训练集训练 #(5)Find the error in prediction. 找预测损失 #(6…

RAG应用-七个最常见的故障点

近日,国外研究者发布了一篇论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》,探讨了在实际工程落地RAG应用过程中容易出的七类问题。 论文地址:https://arxiv.org/pdf/2401.05856.pdf 一、丢失内容&…

网络协议与攻击模拟_10DHCP攻击与DHCP欺骗

一、DHCP的报文格式 Message type:消息类型(1表示请求,2表示响应)Hardware type:硬件类型Hardware address length:硬件地址长度Hops:DHCP报文经过中继的数目。Transaction ID:事务…

树莓派部署Nginx服务结合内网穿透实现远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Ngi…

springboot mongodb简单教程

(1)依赖 compile(org.springframework.boot:spring-boot-starter-data-mongodb) (2)application.properties配置文件 spring.data.mongodb.host127.0.0.1 spring.data.mongodb.port27017 spring.data.mongodb.databasetest &a…

如何成为一个更好的沟通者?

新年伊始,我想跟大家分享9条我给自己定下的「沟通准则」。 这9条准则,是我对自己的要求,也是我身体力行践行了许多年的做法。我可能也没能践行得非常完美,但这也是我一直在努力的目标。 如果你希望能够跟别人「好好说话」&#xf…

Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统 磁盘机械式磁盘固态硬盘 机械式磁盘结构磁盘,磁道,扇区柱面 文件系统的初始化划卷(划盘) 挂载C盘放了什么东西Boot Block(启动模块) 0号组放了什么东西Super Block(超级…

[m1pro ] ssh: connect to host localhost port 22: Connection refused

在学习Hadoop 的时候,使用 ssh localhost 遇到以下问题 原因: 本地没有打开远程登录 解决办法:打开远程登录 成功结果

leetcode刷题(剑指offer) 191.位1的个数

191.位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者:爱写代码的刚子 时间:2024.1.29 前言&#xff1…

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM(多头注意力-TCN-LSTM)是一种结合了多个注意力机制、时序卷积网络(TCN&#xff0…

ORB-SLAM策略思考之RANSAC

ORB-SLAM策略思考之RANSAC 1. 初始化器的RANSAC ORB-SLAM中的初始化器是一个端到端的地图初始化策略,即不需要人的参与双线程同时计算本质矩阵和单应性矩阵使用基于RANSAC和卡方检验的评价方法 为了保证两种算法评价的一致性,计算本质矩阵F和单应性矩阵…

ETCD监控方法以及核心指标

文章目录 1. 监控指标采集1.1 监控指标采集1.2 配置promethues采集和大盘 2. 核心告警指标3. 参考文章 探讨etcd的监控数据采集方式以及需要关注的核心指标,便于日常生产进行监控和巡检。 1. 监控指标采集 etcd默认通过/metrics指标暴露相关指标,因此不…

引入 js 文件报错: Uncaught SyntaxError: Unexpected token <

文章目录 问题分析问题 在开发中引入 Cesium.js 文件时报错如下 分析 我是这么引入的<body><noscript><strong>Were sorry but <%= htmlWebpackPlugin.options.title %> doesnt work properly without JavaScript enabled.Please enable it to c

C++仿函数、万能头文件、transform学习

这是网上的一个代码,里面的一些东西以前没用过; #include <bits/stdc++.h> using namespace std;// A Functor class increment { private:int num; public:increment(int n) : num(n) { }int operator () (int arr_num) const {return num + arr_num;} };// Driver …

Python列表中的append功能及用法举例

Python列表中的append功能及用法举例 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;append()&#x1f333;&#x1f340;功能介绍&#x1f340;&#x1f340;语法&#x1f340;&#x1f340;示例&#x1f340;&#x1f340;注意事项&#x…

Spark3内核源码与优化

文章目录 一、Spark内核原理1、Spark 内核概述1.1 简介1.2 Spark 核心组件1.3 Spark 通用运行流程概述 2、Spark 部署模式2.1 YARN Cluster 模式(重点)2.2 YARN Client 模式2.3 Standalone Cluster 模式2.4 Standalone Client 模式 3、Spark 通讯架构3.1 Spark 通信架构概述3.2…

江科大stm32学习笔记5——蜂鸣器

目录 一、接线 二、代码部分 三、查看库函数的方法 一、接线 蜂鸣器选择有源高电平触发蜂鸣器。 GND——GND VCC——正极 I/O——B12 注意&#xff1a;32上的PA15、PB3、和PB4是默认调试端口&#xff0c;如果使用需要进行额外配置&#xff0c;一般避开这三个端口。 二、…

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…