Unity3D常见的设计模式(五)

系列文章目录

unity知识点


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、桥接模式(Bridge)
  • 👉二、适配器模式(Adapter)
  • 👉三、 外观模式(Facade)
  • 👉四、原型模式(Prototype)
  • 👉五、建造者模式(Builder)
  • 👉壁纸分享
  • 👉总结


请添加图片描述

👉前言

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用 设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决 方案,这也是设计模式能被广泛应用的原因。

博客将会介绍Unity中常用的设计模式,每种设计模式都会给出详细的示例代码。希望这篇博客对Unity的开发者有所帮助。
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、桥接模式(Bridge)

介绍:
Unity中的桥接模式(Bridge Pattern)是一种设计模式,主要用于将抽象部分与其实现部分分离,从而允许它们独立变化‌。这种模式特别适用于那些需要处理多个维度变化的情况,例如在游戏中角色和装备的多样化组合。
桥接模式的核心思想是将抽象部分与实现部分分离,使得两者可以独立变化。在Unity中,这通常用于处理角色和装备的关系,使得每当新增角色或装备时,不需要修改已有的代码,从而减少代码的重复和维护难度‌。

代码如下:

public abstract class Shape 
{protected IDrawAPI _drawAPI;protected Shape(IDrawAPI drawAPI) {_drawAPI = drawAPI;}public abstract void Draw();
}public interface IDrawAPI 
{void DrawCircle(int x, int y, int radius);
}public class DrawAPI1 : IDrawAPI 
{public void DrawCircle(int x, int y, int radius) {Debug.Log("DrawAPI1 Circle " + x + "," + y + "," + radius);}
}public class DrawAPI2 : IDrawAPI 
{public void DrawCircle(int x, int y, int radius){Debug.Log("DrawAPI2 Circle " + x + "," + y + "," + radius);}
}public class Circle : Shape 
{private int _x, _y, _radius;public Circle(int x, int y, int radius, IDrawAPI drawAPI) : base(drawAPI) {_x = x;_y = y;_radius = radius;}public override void Draw() {_drawAPI.DrawCircle(_x, _y, _radius);}
}

👉二、适配器模式(Adapter)

介绍:
‌Unity中的适配器模式‌主要用于将一个类的接口转换为另一个接口,以便原本不兼容的对象能够协同工作。适配器模式在Unity中非常有用,特别是在处理不同版本的API、不同组件间的交互、对接外部库等场景中。
假设有一个老版本的输入系统,它直接处理键盘按键事件,而新的Unity Input System需要一个特定的接口。可以通过创建一个适配器来使老版输入系统与新接口兼容。

代码如下:

public interface ITarget 
{void Request();
}public class Adaptee 
{public void SpecificRequest() {Debug.Log("Specific Request");}
}public class Adapter : ITarget 
{private Adaptee _adaptee = new Adaptee();public void Request() {_adaptee.SpecificRequest();}
}

👉三、 外观模式(Facade)

介绍:
外观模式用于为复杂的子系统提供一个简单的接口。在Unity中,外观模式常用于将复杂的系统或流程封装起来,简化客户端的调用,例如场景管理器和资源管理器。

代码如下:

public class SceneLoader 
{public void LoadScene(string sceneName) {Debug.Log("Loading Scene " + sceneName);}
}public class SoundManager
{public void PlaySound(string soundName) {Debug.Log("Playing Sound " + soundName);}
}public class ResourceManager 
{public void LoadResource(string resourceName) {Debug.Log("Loading Resource " + resourceName);}
}public class GameFacade 
{private SceneLoader _sceneLoader;private SoundManager _soundManager;private ResourceManager _resourceManager;public GameFacade() {_sceneLoader = new SceneLoader();_soundManager = new SoundManager();_resourceManager = new ResourceManager();}public void StartGame(string sceneName, string soundName, string resourceName) {_sceneLoader.LoadScene(sceneName);_soundManager.PlaySound(soundName);_resourceManager.LoadResource(resourceName);}
}

👉四、原型模式(Prototype)

介绍:
Unity中的原型模式‌是一种设计模式,允许通过复制现有的对象来创建新对象,而不是通过直接实例化类。这种模式的核心思想是通过创建一个对象的副本(即原型)来避免昂贵的初始化操作,从而提高性能和资源利用率。

原型模式的工作原理是定义一个原型接口或基类,提供克隆方法(如 Clone)。具体的类实现该接口,提供自己的克隆方法,该方法返回当前对象的深拷贝或浅拷贝。客户端可以通过克隆原型对象来创建新对象,而无需知道如何构造对象。拷贝的类型可以分为浅拷贝和深拷贝:

‌浅拷贝‌:只复制对象的基本数据类型,对于引用类型的字段,只复制引用地址。
‌深拷贝‌:不仅复制对象的所有值,还递归地复制所有引用对象,创建独立的副本。

代码如下:

public abstract class Prototype 
{public string Type;public abstract Prototype Clone();
}public class ConcretePrototypeA : Prototype 
{public ConcretePrototypeA() {Type = "A";}public override Prototype Clone() {return (Prototype)MemberwiseClone();}
}public class ConcretePrototypeB : Prototype 
{public ConcretePrototypeB() {Type = "B";}public override Prototype Clone(){return (Prototype)MemberwiseClone();}
}public class PrototypeManager 
{private Dictionary<string, Prototype> _prototypes = new Dictionary<string, Prototype>();public Prototype this[string key]{get { return _prototypes[key].Clone(); }set { _prototypes.Add(key, value); }}
}

👉五、建造者模式(Builder)

介绍:
‌Unity中的建造者模式‌是一种创建型设计模式,主要用于创建复杂的对象。通过分离对象的构建过程,建造者模式允许以更灵活和可扩展的方式创建不同变体的对象,尤其适用于需要构造具有多个可选或必须组件的对象,并且希望客户端代码无需了解内部构造细节的情况‌。
在Unity中,建造者模式常用于创建复杂的Prefab,例如角色或NPC。

代码如下:

public class Character 
{private string _name;private string _gender;private string _race;private string _class;private int _level;private int _health;private int _mana;public string Name {get { return _name; }set { _name = value; }}public string Gender {get { return _gender; }set { _gender = value; }}public string Race {get { return _race; }set { _race = value; }}public string Class {get { return _class; }set { _class = value; }}public int Level {get { return _level; }set { _level = value; }}public int Health {get { return _health; }set { _health = value; }}public int Mana {get { return _mana; }set { _mana = value; }}
}public abstract class CharacterBuilder 
{protected Character _character;public Character Character {get { return _character; }}public virtual void BuildName(string name) {_character.Name = name;}public virtual void BuildGender(string gender){_character.Gender = gender;}public virtual void BuildRace(string race) {_character.Race = race;}public virtual void BuildClass(string className) {_character.Class = className;}public virtual void BuildLevel(int level) {_character.Level = level;}public virtual void BuildHealth(int health) {_character.Health = health;}public virtual void BuildMana(int mana) {_character.Mana = mana;}
}public class HumanBuilder : CharacterBuilder 
{public HumanBuilder(){_character = new Character();}public override void BuildRace(string race){if (race.Equals("Human")){_character.Race = race;}else{throw new System.Exception("Invalid race for Human builder.");}}public override void BuildClass(string className){if (className.Equals("Warrior") || className.Equals("Mage")){_character.Class = className;}else{throw new System.Exception("Invalid class for Human builder.");}}
}public class CharacterDirector 
{private CharacterBuilder _builder;public CharacterDirector(CharacterBuilder builder) {_builder = builder;}public void Construct(string name, string gender, string race, string className, int level, int health, int mana) {_builder.BuildName(name);_builder.BuildGender(gender);_builder.BuildRace(race);_builder.BuildClass(className);_builder.BuildLevel(level);_builder.BuildHealth(health);_builder.BuildMana(mana);}
}

请添加图片描述

👉壁纸分享

请添加图片描述
请添加图片描述


👉总结

本次总结的就是unity常见的五种设计模式 有需要会继续增加功能
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34517.html

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

相关文章

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

群控系统服务端开发模式-应用开发-邮件工厂结构封装

首先在系统根目录下extend文件夹下创建邮件工厂文件夹并更名叫Mail。 一、邮件发送父类 在Mail目录下创建邮件发送父类并更名为MailSenderInterface.php&#xff0c;代码如下 <?php /*** 邮件发送父类* User: 龙哥三年风水* Date: 2024/12/5* Time: 14:22*/ namespace Ma…

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…

操作系统学习

问题&#xff1a; 因为想用傲梅来给系统盘扩容&#xff0c;导致无法进入操作系统&#xff0c;报错如下&#xff1a; 无法加载应用程序或操作系统&#xff0c;原因是所需文件丢失或包含错误. 文件:Windowslsystem32lwinload.efi错误代码: 0xc000007b 你需要使用恢复工具。如果…

Web应用程序文件包含-Server2233-解析

B-6 Web应用程序文件包含 任务环境说明:服务器场景名称:Server2233

计算机的错误计算(一百七十五)

摘要 就计算机的错误计算&#xff08;一百七十三&#xff09;与&#xff08;一百七十四&#xff09;中案例&#xff0c;讨论其另外一种形式&#xff1a; 的错误计算问题。 例1. 已知 计算 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB的输出中有4位错误数字&#xff0…

F-K变换法

f-k变换实质上是一种二维傅里叶变换。 在时间域上,对一道地震信号做傅里叶变换,可以得到在时间上不同频度(称为频率)的 波动组分的振幅和相位信息。同样地,在空间上,我们也可以对多道地震信号做类似傅里叶变 换的数值变换,得到在空间上不同频度(称为波数)的波动组分的振幅…

webstorm关闭了弹窗 Confirm Exit 恢复回来

webstorm关闭了 Confirm Exit WebStorm 关闭了“Confirm Exit”功能&#xff0c;意味着当用户尝试关闭IDE时&#xff0c;不会显示确认对话框&#xff0c;直接退出程序。 如果你想要恢复这个功能&#xff0c;可以按照以下步骤操作&#xff1a; 打开WebStorm。 进入设置界面&a…

集成学习之-stacking

一、引言 对于单模型来说&#xff0c;模型的抗干扰能力低&#xff0c;且难以拟合复杂的数据。 所以可以集成多个模型的优缺点&#xff0c;提高泛化能力。 集成学习一般有三种&#xff1a;boosting是利用多个弱学习器串行&#xff0c;逐个纠错&#xff0c;构造强学习器。 baggin…

Linux-使用 tslib 库

上一章我们学习了如何编写触摸屏应用程序&#xff0c;包括单点触摸和多点触摸&#xff0c;主要是对读取到的 struct input_event 类型数据进行剖析&#xff0c;得到各个触摸点的坐标。本章向大家介绍 tslib 库&#xff0c;这是 Linux 系统下&#xff0c;专门为触摸屏开发的应用…

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

[Redis#15] 持久化 | AOF | rewrite | aof_buf | 混合持久化

目录 1 使用AOF 流程 问题一&#xff1a;父进程在fork之后继续写旧AOF文件的意义 问题二&#xff1a;执行BGREWRITEAOF时的特殊情况处理 2 命令写入 3 文件同步 4 重写机制 工作流程&#xff1a; 触发条件 混合持久化 持久化 sum AOF&#xff08;Append Only File&a…

重生之我在异世界学智力题(1)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言智力题题目&#xff1a;《奇怪的时钟…

【WRF后处理】WRF时区(UTC)需转化为北京时间(CST)!!!

目录 WRF运行时间标准注意事项-本地时区问题 输入数据&#xff1a;ERA5时间标准ERA5数据和WRF模型需要转换为北京时间&#xff01;&#xff01;&#xff01;北京时间&#xff08;CST&#xff09;与协调世界时&#xff08;UTC&#xff09;的关系转换方法 参考 WRF运行时间标准 …

css怎么使页面高度占满屏幕?

下面是一个小程序的页面&#xff0c;用uniapp写的&#xff0c;现在有一个问题&#xff0c;就是最外层的allmy的图层&#xff0c;屏幕是灰色&#xff0c;我怎么才能使这个图层占满屏幕&#xff0c;就是让灰色占满屏幕。 直接先给page设置一个height:100%;然后allmy的height:100%…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源&#xff0c;前期咱们已经阐述了如何在本地搭建&#xff08;Nacos集群搭建【Oracle作外部数据源】&#xff09;&#xff0c;本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…

Halcon 深度学习目标分类:原理与应用全解析

摘要&#xff1a; 本文深入探讨了 Halcon 在深度学习目标分类方面的原理及广泛的应用场景。详细阐述了从数据准备到模型训练与分类决策的目标分类工作流程&#xff0c;剖析了其背后的深度学习技术支撑。同时&#xff0c;结合多个行业领域&#xff0c;展示了 Halcon 目标分类技术…

【burp】burpsuite基础(五)

Burp Suite基础&#xff08;五&#xff09; 声明&#xff1a;该笔记为up主 泷羽的课程笔记&#xff0c;本节链接指路。 警告&#xff1a;本教程仅作学习用途&#xff0c;若有用于非法行为的&#xff0c;概不负责。 抓包方式 burp在抓包上十分全面&#xff0c;这里介绍几种抓包…

固态电池产业路径思考

《固态电池产业路径思考》主要探讨了固态电池的研究思路、解决方案、已取得的成果以及TC固态电池的介绍。以下是核心内容的整理&#xff1a; 一、固态电池优势 高比能耐高温易匹配高电压镍钴锰&#xff08;NCM&#xff09;正极和金属锂负极 二、固态电池关键共性问题 固态电…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…