Unity 代理模式(实例详解)

文章目录

      • 实例1:资源加载代理(Asset Loading Proxy)
      • 实例2:网络请求代理(Network Request Proxy)
      • 实例3:性能优化代理(Performance Optimization Proxy)
      • 实例4:权限控制代理(Authorization Control Proxy)
      • 实例5:热更新代理(Hot Reload Proxy)

在Unity游戏开发中,代理模式(Proxy Design Pattern)用于为另一个对象提供一个代理以控制对这个对象的访问。以下是在Unity环境下实现代理模式的5个不同代码实例说明:

实例1:资源加载代理(Asset Loading Proxy)

// 原始资源加载接口
public interface IResourceLoader
{Texture2D LoadTexture(string path);
}// 真实资源加载器
public class RealResourceLoader : IResourceLoader
{public Texture2D LoadTexture(string path){return Resources.Load<Texture2D>(path);}
}// 资源加载代理,负责异步加载并缓存资源
public class AssetLoadingProxy : IResourceLoader
{private Dictionary<string, IEnumerator> _loadingTasks;private RealResourceLoader _realLoader;public AssetLoadingProxy(){_loadingTasks = new Dictionary<string, IEnumerator>();_realLoader = new RealResourceLoader();}public IEnumerator LoadTextureAsync(string path, Action<Texture2D> onLoaded){if (!_loadingTasks.ContainsKey(path)){var www = UnityWebRequestTexture.GetTexture(path);yield return www.SendWebRequest();if (www.result == UnityWebRequest.Result.Success){var texture = DownloadHandlerTexture.GetContent(www);_loadingTasks[path] = null; // 移除任务记录,避免重复加载onLoaded?.Invoke(texture);}else{Debug.LogError($"Failed to load texture: {www.error}");}}else{while (_loadingTasks[path] != null){yield return null; // 等待资源完成加载}onLoaded?.Invoke(_realLoader.LoadTexture(path)); // 加载完成后调用回调}}
}

实例2:网络请求代理(Network Request Proxy)

// 网络请求接口
public interface INetworkService
{void SendRequest(string url, Action<string> onResponse);
}// 真实网络服务类
public class RealNetworkService : INetworkService
{public void SendRequest(string url, Action<string> onResponse){StartCoroutine(SendRequestCoroutine(url, onResponse));}private IEnumerator SendRequestCoroutine(string url, Action<string> onResponse){using (var request = UnityWebRequest.Get(url)){yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){onResponse(request.downloadHandler.text);}else{Debug.LogError($"Error sending network request: {request.error}");}}}
}// 网络请求代理,添加了请求队列和错误重试机制
public class NetworkRequestProxy : INetworkService
{private INetworkService _realService;private Queue<Action> _requestQueue;private int _maxRetryCount;public NetworkRequestProxy(INetworkService realService, int maxRetries){_realService = realService;_requestQueue = new Queue<Action>();_maxRetryCount = maxRetries;}public void SendRequest(string url, Action<string> onResponse){_requestQueue.Enqueue(() => _realService.SendRequest(url, response =>{if (!string.IsNullOrEmpty(response) || --_maxRetryCount < 0){onResponse(response);}else{SendRequest(url, onResponse); // 重试请求}}));ProcessNextRequest(); // 开始处理队列中的下一个请求}private void ProcessNextRequest(){if (_requestQueue.Count > 0){var nextAction = _requestQueue.Dequeue();StartCoroutine(ProcessRequestCoroutine(nextAction));}}private IEnumerator ProcessRequestCoroutine(Action action){yield return new WaitForSeconds(0.1f); // 假设这里有防止频繁请求的间隔action();}
}

实例3:性能优化代理(Performance Optimization Proxy)

// 高级图形渲染组件接口
public interface IAdvancedRenderer
{void RenderHighQualityMesh(Mesh mesh);
}// 真实高级渲染组件
public class RealAdvancedRenderer : IAdvancedRenderer
{public void RenderHighQualityMesh(Mesh mesh){// 执行高质量、高消耗的渲染操作// ...}
}// 性能优化代理,根据设备性能动态调整渲染质量
public class PerformanceProxyRenderer : IAdvancedRenderer
{private IAdvancedRenderer _realRenderer;private bool _isLowEndDevice;public PerformanceProxyRenderer(IAdvancedRenderer realRenderer, SystemInfo systemInfo){_realRenderer = realRenderer;_isLowEndDevice = systemInfo.graphicsMemorySize < 1024; // 假设低于1GB显存的设备是低端设备}public void RenderHighQualityMesh(Mesh mesh){if (!_isLowEndDevice){_realRenderer.RenderHighQualityMesh(mesh);}else{// 执行低质量、低消耗的替代渲染操作RenderLowQualityMesh(mesh);}}private void RenderLowQualityMesh(Mesh mesh){// ...}
}

实例4:权限控制代理(Authorization Control Proxy)

// 数据库访问接口
public interface IDataAccess
{void SaveData(UserData data);
}// 真实数据库访问类
public class RealDataAccess : IDataAccess
{public void SaveData(UserData data){// 存储用户数据到数据库// ...}
}// 权限控制代理,确保只有管理员可以写入数据
public class AuthorizationProxy : IDataAccess
{private IDataAccess _realAccess;private IUserService _userService;public AuthorizationProxy(IDataAccess realAccess, IUserService userService){_realAccess = realAccess;_userService = userService;}public void SaveData(UserData data){if (_userService.IsCurrentUserAdmin()){_realAccess.SaveData(data);}else{Debug.LogWarning("Non-admin user attempted to save data.");}}
}

实例5:热更新代理(Hot Reload Proxy)

// MonoBehavior基类
public abstract class MonoBehaviourBase : UnityEngine.MonoBehaviour
{// 公共方法声明...
}// 热更脚本接口
public interface IHotReloadable
{void OnHotReload();
}// 热更代理MonoBehavior
public class HotReloadProxy : MonoBehaviourBase
{private IHotReloadable _hotReloadTarget;public void SetHotReloadTarget(IHotReloadable target){_hotReloadTarget = target;}void Update(){// 如果目标实现了热更接口,则在Update时触发OnHotReloadif (_hotReloadTarget != null && Application.isEditor && UnityEditor.EditorUtility.IsDirty(targetScript)){_hotReloadTarget.OnHotReload();}}
}// 真实业务逻辑脚本,通过ILRuntime或类似技术热更新
[HotReloading]
public class RealBusinessLogic : IHotReloadable
{public void OnHotReload(){// 重新加载业务逻辑// ...}// 其他业务逻辑...
}

这些例子展示了如何在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/649841.shtml

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

相关文章

Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境

推荐 海鲸AI-ChatGPT4.0国内站点&#xff1a;https://www.atalk-ai.com 前言 在计算机视觉领域&#xff0c;快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库&#xff0c;广泛应用于各种图像处理和视频分析任务。然而&#xff0c;配置OpenCV环境可…

光纤接口类型

光纤接口 网络设备基础知识 文章目录 光纤接口前言一、光纤接口二、光纤接口的优缺点总结前言 不同的接口类型适用于不同的光纤传输系统和应用需求。在选择光纤设备时,需要根据实际需求和系统要求选择适当的光纤接口类型。 一、光纤接口

计算机基础之微处理器简介

微处理器 微处理器定义 微型计算机的CPU也被称为微处理器&#xff0c;是将运算器、控制器和高速缓存集成在一起的超大规模集成电路芯片&#xff0c;是计算机的核心部件。能完成取指令、执行指令&#xff0c;以及与外界存储器和逻辑部件交换信息等操作。 微处理器发展 CPU从…

[C++]使用纯opencv部署yolov8旋转框目标检测

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 YOLOv8是一种先进的对象检测算法&#xff0c;它通过单个神经网络实现了快速的物体检测。其中&#xff0c;旋转框检测是YOLOv8的一项重要特性&#xff0c;它可以有效地检测出不同方向和角度的物体。…

安全小记-ngnix负载均衡

目录 一.配置ngnix环境二.nginx负载均衡 一.配置ngnix环境 本次实验使用的是centos7,首先默认yum源已经配置好&#xff0c;没有配置好的自行访问阿里云镜像站 https://developer.aliyun.com/mirror/ 接着进行安装工作 1.首先创建Nginx的目录并进入&#xff1a; mkdir /soft &…

【七、centos要停止维护了,我选择Almalinux】

搜索镜像 https://developer.aliyun.com/mirror/?serviceTypemirror&tag%E7%B3%BB%E7%BB%9F&keywordalmalinux dvd是有界面操作的&#xff0c;minimal是最小化只有命里行 镜像下载地址 安装和centos基本一样的&#xff0c;操作命令也是一样的&#xff0c;有需要我…

openlayers+vue实现缓冲区

文章目录 前言一、准备二、初始化地图1、创建一个地图容器2、引入必须的类库3、地图初始化4、给地图增加底图 三、创建缓冲区1、引入需要的工具类库2、绘制方法 四、完整代码总结 前言 缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点、线或面…

C++面试:散列表

目录 1. 散列表的基本概念 散列表的定义 散列函数 哈希冲突 2. 处理冲突的方法 链地址法&#xff08;Separate Chaining&#xff09; 开放地址法 再散列 3. 散列表的性能分析 1. 平均查找长度&#xff08;ASL&#xff09; 2. 负载因子&#xff08;Load Factor&#…

【Linux】-cp模型

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型&#xff0c;即广播网络和点到点网络。与 OSPF 协议相同&#xff0c; IS-IS 协议在广播网络中会将网络视为一个伪节点 &#xff08; Pesudonde&#xff0c;简称 PSN&#xff09;&#xff0c;并选举出一台DIS &#xff08;Designated IS&#xff09…

ASP.NET Core 7 Web 使用Session

ASP.NET Core 好像不能像20年前那样直接使用Session函数&#xff0c;我使用如下方法 1、在NuGet安装以下2个包 2、在Program.cs注册 //注册Session builder.Services.AddSession(options > {options.IdleTimeout TimeSpan.FromMinutes(60);options.Cookie.HttpOnly fals…

CAN相关寄存器

1. CAN_ MCR&#xff1a;CAN主控制寄存器。主要负责CAN工作模式的配置。 CAN_BTR&#xff1a;位时序寄存器。用来设置分频/TBs1/TBs2/Tsw等参数&#xff0c;设置测试模式。 CAN_(T/R)IxR&#xff1a;标识符寄存器。存放&#xff08;待发送/接收)的报文ID、扩展ID、IDE位及RTR…

如何快速搭建实用的爬虫管理平台

目录 一、前言 二、选择合适的爬虫框架 三、搭建数据库 步骤1 步骤2 步骤3 四、搭建Web服务器 步骤1 步骤2 步骤3 步骤4 五、管理爬虫 六、总结 一、前言 爬虫是互联网数据采集的关键工具&#xff0c;但是随着数据量的增加和需求的多样化&#xff0c;手动运行和管…

SIFT图像特征表述

SIFT&#xff08;尺度不变特征变换&#xff09;是一种用于图像处理和计算机视觉领域的特征提取算法。其目的是检测和描述图像中的局部特征。SIFT特征对旋转、尺度缩放、亮度变化保持不变性&#xff0c;对视角变化、仿射变换、噪声也具有一定的稳健性。下面是SIFT特征提取的基本…

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…

12.Golang中类的表示与封装

目录 概述类的表示代码结果 类的封装代码结果 结束 概述 Golang中类的表示与封装 类的表示 代码 注释掉的代码&#xff0c;并不能拿来当赋值或获取值来使用。 package mainimport "fmt"// 类大写则代表&#xff0c;可以被其它包使用 type Hero struct {// 属性方法大…

RHCE作业

1.写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一 (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-20160613.tar.gz&#xff1b; (2) 如果参…

临紧光五行护盾

临紧光五行护盾基础名词解释 粒子系统仿真&#xff0c;离散事件系统设计临紧光五行护盾&#xff08;云藏山鹰临近光五行散射&#xff09;V-ATPase道装&#xff0c;意气实体过程光效集聚模拟器荀况数论云藏山鹰类型物粒子系统导引云藏山鹰类型物与冯诺依曼爆炸学物品分类表杨米尔…

【华为 ICT HCIA eNSP 习题汇总】——题目集10

1、以下哪个动态路由协议不能应用在 IPv6 网络中&#xff1f; A、IS-IS B、RIPng C、BGP4 D、OSPFv3 考点&#xff1a;路由技术原理 解析&#xff1a;&#xff08;A&#xff09; IS-ISv6 是在 IPv6 环境下&#xff0c;IS-IS 协议进行了相应的扩展和改进&#xff0c;以适应 IPv6…

项目风采展示【TRDa】

桌面功能介绍&#xff1a; 1&#xff1a;支持本地音乐、三方音乐控制播放展示功能&#xff1b; 2&#xff1a;支持陀螺仪 3&#xff1a;支持蓝牙列表显示。