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

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

相关文章

Qt 基于海康相机 的视频标绘

需求&#xff1a; 基于 视频 进行 标注&#xff0c;从而进行测量。 曾经搞在线教育时&#xff0c;尝试在视频上进行文字或者图形的绘制&#xff0c;但是发现利用Qt widget 传sdk 句柄的方式&#xff0c;只能使用窗口叠加的方式&#xff08;Qt 基于海康相机的视频绘图_海康相…

【常用工具】7-Zip 解/压缩软件——基本使用方法

在实际日常工作或项目中&#xff0c;经常会遇到需要在window操作系统上压缩文件&#xff0c;在Linux操作系统上解压缩的场景&#xff0c;一款实用的压缩软件迫在眉睫&#xff0c;经过实际使用总结&#xff0c;7-Zip可以很好的解决很多压缩和解压缩问题&#xff0c;其基本使用方…

APP测试要点有哪些?本文已经给你梳理好了!

我们日常购物、旅游、支付等活动都离不开手机&#xff0c;由此衍生了很多APP。 比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。 APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 01 APP测试流程 APP测试流程与web…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式&#xff0c;以相关技术概念为起点&#xff0c;实际环境搭建&#xff0c;程序部署为终点&#xff0c;从0到1的实操演示的学习方式&#xff0c;一步一步&#xff0c;保姆级的方式学习k8…

Cesium场景之卫星轨道展示

Cesium场景之卫星轨道展示 | DLLCNX的博客 cesium在进行动画展示这一块的功能比较完善。最近有一个需求&#xff0c;需要进行模拟卫星的飞行轨迹&#xff0c;如果可以实现&#xff0c;针对扫描卫星需要添加模拟扫描光波。 当我首先针对需求进行卫星&#xff0c;将卫星运行与扫…

[UI5 常用控件] 02.Title,Link,Label

文章目录 前言1. Title1.1 结合Panel1.2 结合Table1.3 Title里嵌套Link 2. Link3. Label3.1 普通用法3.2 在Form里使用 前言 本章节记录常用控件Title,Link,Label。 其路径分别是&#xff1a; sap.m.Titlesap.m.Linksap.m.Label 1. Title Title可以结合其他控件一起使用 1.…

List使用addAll()方法报错

当使用Arrays.asList方式创建出来的list&#xff0c;在使用addAll方法的时候报错如下&#xff1a; Exception in thread "main" java.lang.UnsupportedOperationException 这个问题记录下&#xff0c;以防以后忘记。 下面是代码 List<String> objects new A…

MATLAB|【完全复现】含可再生能源和储能的区域微电网的最优运行(考虑鲁棒性和不确定性)【多阶段鲁棒调度模型】

目录 主要内容 模型研究 一、区域微网模型 二、模型优化流程​ 结果一览 下载链接 主要内容 该程序实现了一种基于可再生能源和储能的区域微电网的多阶段优化调度方法&#xff0c;该方法可以同时保证优化调度方案的鲁棒性和非预测性。模型考虑两类不确定性&…

CentOS网络配置进阶:深入研究network服务和NetworkManager

前言 如果你正在使用CentOS系统,并且想要深入了解网络管理和配置,那么本文肯定适合你!在这篇文章中,作者深入探讨了CentOS中的两种网络管理方式:network服务和NetworkManager。通过详实的讲解和实用的示例,你将会学习到如何使用这两种工具来管理网络接口、配置IP地址、网…

防御保护---安全策略

文章目录 目录 一.安全策略概述 概述&#xff1a; 安全策略的作用&#xff1a; 安全策略与传统防火墙的区别 二.案例分析 练习 一.安全策略概述 概述&#xff1a; 防火墙安全策略的作用在于加强网络系统的安全性&#xff0c;保护网络免受恶意攻击、非法访问和数据泄露的威胁。…

acwing周赛140 b题

思路&#xff1a;我们按照从小到大的顺序将数组逆转好&#xff0c;然后枚举数组首项&#xff0c;分别让其1&#xff0c;-1&#xff0c;0&#xff0c;然后求出公差&#xff0c;从前往后遍历即可。 代码&#xff1a; int ans1(){//不动int cha (a[n] - a[1] 1) / (n - 1);int…

未来时尚:数字化管理引领服装企业商品计划的创新浪潮

时尚产业正经历着一场数字化的浪潮&#xff0c;数字化管理正成为引领服装企业商品计划的不可忽视的创新力量。这一变革不仅影响了企业内部的运营方式&#xff0c;更深刻地塑造了未来时尚的面貌。本文将深入探讨数字化管理如何领导着服装企业商品计划进入创新浪潮&#xff0c;重…