arcore之路-unity开发从入门到实践_Unity游戏开发——单例模式的最佳实践

030cb462c2f34783aa8b6848a3e5e3fe.png

0.前言

StarryFun:Unity游戏开发——关于单例模式的理解​zhuanlan.zhihu.com
77396b1a0abdef9ff2cce6ad3ae394c6.png

之前一篇文章讲了单例模式的简单理解,自知其中有很多不严谨的地方,由于本萌新也是在学习阶段,所以去翻看了开源的项目都是怎么实现的,发现了一个比较完整详细的解决方案,并且给提取了出来,准备当作工具在项目中复用,接下来给大家聊一下这个单例框架的实现思路和使用方法。

1.单例框架介绍

先聊聊这个单例框架都有什么玩法

  • 可以减少写重复代码
  • 使用属性标签更有条理的管理单例模块
  • 可以控制单例的生命周期
  • 可以选择是否开放自身实例的获取
  • 即有基于monobehaviour生命周期的单例,也有类的单例

单例框架是由两部分组成,这里我们主要介绍拥有MonoBehaviour生命周期的单例,类的单例同理所以就不重复介绍了

e932f05b90c1b1782802f8ec4b4f2d91.png
单例模块所有脚本
  • ISingleton:一个接口,里面也只有一个初始化方法。使用接口有两个作用,一对单例进行约束,二是提供统一的初始化接口
  • MonoSingleton:这个是开放了外界对自身实例进行访问的单例写法,也是比较常规的玩法,使用的方法是继承它就可以了
  • MonoSingletonCreator:一个单例的创建器,对特殊情况的处理和实例的创建都在这里完成,属于一个比较核心的类
  • MonoSingletonPath:通过属性标签来指定全局单例在场景中的路径,目的是让用户管理单例模块更有条例一些,核心思想是反射+Attribute
  • MonoSingletonProperty:这个是关闭了外界对自身实例的访问,也就是实例私有化,对外界也只提供静态方法,这样做有两个好处:1.使成员变量更安全,尤其是多人协作的时候,做了这个限制也就降低了一些未知的风险。2.调用方式为“单例名.方法名”,这比“单例名.Instance.方法名”少了一步,作为一个懒人,使用体验极佳。

3.使用方式

  • 单例的实现
  1. 通过继承实现单例
using QF;
using UnityEngine;public class Class2MonoSingleton : MonoSingleton<Class2MonoSingleton>
{// 重写这个方法可以手动控制初始化public override void OnSingletonInit(){Debug.Log(this.name + "OnInit");}// 基于mono生命周期的脚本正常实现就行了private void Awake(){Debug.Log(this.name + ":" + "Awake");}private void Start(){Debug.Log(this.name + ":" + "Start");}// 重写这个方法就会在销毁的时候把单例置空protected override void OnDestroy(){base.OnDestroy();Debug.Log(this.name + "OnDestroy");}
}

2. 通过属性器实现单例

using QF;
using UnityEngine;// 第一步,引入ISingleton,并实现接口方法
public class Class2MonoSingletonProperty : MonoBehaviour, ISingleton
{public int myFirstIndex;// 第二步,使用属性器,拿到自身实例,并且私有化private static Class2MonoSingletonProperty mInstance{get{return MonoSingletonCreator.CreateMonoSingleton<Class2MonoSingletonProperty>();}}// 接口提供的初始化方法,可以自己控制单例的初始化时机public void OnSingletonInit(){Debug.Log(this.name +" : OnInit");}// 这个一般用不到,感觉可以考虑不实现这个方法public void Dispose(){MonoSingletonProperty<Class2MonoSingletonProperty>.Dispose();}// 自定义的一个静态方法public static void FirstFunc(int firstIndex){// 因为自身实例私有化了,只能通过这种方式获取成员变量mInstance.myFirstIndex = firstIndex;}// 剩下的就跟mono生命周期一样了// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}
}
  • 单例的使用

首先这些单例不需要手动挂载到场景中,使用时直接调用就好了

using UnityEngine;public class MonoSingletonTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 继承单例的使用法法Class2MonoSingleton.Instance.Func();// 属性器单例的使用方法:类名+静态方法Class2MonoSingletonProperty.Func(1);}
}

78164f2c4c4f97404bdc114af509c3ff.png

如果想让单例管理的更有条例,可以使用标签属性(Attribute)

f3b32c2502ca0637f214b6890839c8e8.png

d56132925937522bde93b60c6a436b0a.png

4.总结

以上代码取自QF框架中的单例模块,在我看来已经可以满足项目中的各种需求了,使用起来也很顺手,也非常贴合之前我对单例模式的理解,也算是对于单例的最佳实践了。下面是QF框架的下载地址,大家可以只使用其中的单例模块,当然也可以尝试其他更厉害的功能。

QF框架下载地址

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

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

相关文章

压控元器件和流控元器件

压控元器件&#xff1a;通过电压控制器件是否工作&#xff0c;常见的有MOSFET、IGBT 流控元器件&#xff1a;通过电流控制器件是否工作&#xff0c;常见的有光耦、三极管

python位运算

这几天&#xff0c;在看C代码&#xff0c;要做一个imsi的decode 里面的代码都是用C写的&#xff0c;位运算什么的。看的有点乱。 由于要在pc上进行解析&#xff0c;所以打算用python写&#xff0c;那么问题来了Python进行位运算要怎么玩&#xff1f; 看的比较多的教程是把这方面…

光耦的简介

光耦&#xff0c;光电耦合器的简称&#xff0c;它是以光信号作为介质传输电信号的元器件。光耦的输入端和输出端信号可以非常好的进行隔离&#xff0c;因此在隔离电路中经常会见到光耦。光耦合器一般由三部分组成&#xff1a;光的发射、光的接收及信号放大。输入的电信号驱动发…

接待员如何向客人upsell_客房留言卡也能收获好评,看看高情商酒店如何做的?...

客人对酒店最客观的评价从点评中就能看到&#xff0c;那酒店服务如何才能被客人看到呢&#xff1f;可不可以通过一张留言卡&#xff0c;被客人感知到呢&#xff1f;本文整理了多个客房服务实际场景案例&#xff0c;帮助酒店了解如何写好这张留言卡。一、什么场景下放置留言卡&a…

“2020 RT-Thread开发者大会” 思考感悟

从2019年开始参加RT-Thread的一次线下培训活动后&#xff0c;就深深的喜欢上这个国产的RTOS&#xff0c;之后RT-Thread举办的活动基本都有参加&#xff08;但每次活动抽奖都抽不到&#xff01;&#xff09;。当然&#xff0c;最为盛大的还属一年一度的RT-Thread开发者大会&…

构造函数demo

package cn.xuexi; /** 简单的写了一个构造函数的类* 总结一下构造函数的坑* 1、构造函数的名字必须与类型保持一致* 2、构造函数不能有任何返回值类型的修饰&#xff0c;void也不行* 3、构造函数中不能使用return 语句 */ public class GouZaoDemo { public static void main(…

小红书笔记_小红书的沙雕笔记,害人不浅啊

话说&#xff0c;当代人的十大必备软件是什么&#xff1f;要猫姐来说的话。除了微信微博抖音&#xff0c;小红书也肯定少不了&#xff01;它简直就是大部分PLMM的“种草神器”。就连明星都纷纷入驻小红书变身为“美妆博主”。前一阵上了热搜榜和李晨分手的范冰冰也是小红书的一…

禅、魏晋风度及其他

禅、魏晋风度及其他 从本质上说&#xff0c;禅与文学艺术活动是相悖的。禅讲“静虚”&#xff0c;讲“色空”&#xff0c;讲“人中无我”、“法中无我”。所谓“菩提本无树&#xff0c;明镜亦非台&#xff0c;本来无一物&#xff0c;何处惹尘埃”&#xff08;王蒙说这也不算彻底…

2020 RT-Thread开发者大会 ART-Badge电子胸牌(可二次开发)

2020 RT-Thread开发者大会 ART-Badge电子胸牌&#xff08;可二次开发&#xff09;&#xff0c;动手实验IOT会场有介绍使用PersimmonUI设计器进行柿饼UI的开发&#xff0c;使用拖拽控件、注册事件的方式进行GUI的开发。开发语言使用JS&#xff0c;界面实现非常方便&#xff0c;后…

datatables分页下一页不能点击_干货,删不掉Word文末最后一页?学会5个方法,再也不愁啦...

在处理Word文档时&#xff0c;经常会在文档最后出现一页空白&#xff0c;非常讨厌&#xff0c;更可恶的是总是删不掉&#xff0c;按退格键或者delete键都无济于事。你是不是也正在为删除Word文末空白页发愁呢&#xff1f;有没有好的方法解决这一问题呢&#xff1f;有的&#xf…

swift 第四课 随意 设置button 图片和文字 位置

项目中经常遇到按钮改变文字和图片位置的情况&#xff0c;所以尝试写一个 button 的分类&#xff1a; 参照连接 http://blog.csdn.net/dfqin/article/details/37813591 import Foundation import UIKit /*枚举 设置 图片的位置*/ enum ButtonImagePosition : Int{case Position…

C#中get和set访问器的用法

C#中的get和set访问器可用来获取和设置类中字段&#xff08;即属性&#xff09;的值&#xff0c;通过get和set访问器提供访问接口&#xff0c;从而可以避免对字段的直接访问造成的不安全性。 using System; using System.Collections.Generic; using System.Linq; using Syste…

asm扩容流程_Oracle rac asm 扩容

环境介绍&#xff1a;故事发生在Oracle 11.2.0.4 RAC/ Linux 6.8 的数据库集群服务器上。DATA/ ARCH/ 磁盘组空间不足&#xff0c;进行扩容。首先&#xff0c;如果要在线使用udev方式扩容asm&#xff0c;建议先备份两个节点所有在用网卡信息&#xff0c;避免bug误删除网卡信息。…

计分员计分程序

1.估计这个任务需要多长时间&#xff1a;两星期 2.需求分析&#xff1a; 作为一名现场记分员&#xff0c;我希望详细记录比赛现场比分增长情况&#xff0c;以便观众及运动员、教练员及时掌握比赛状况。&#xff08;满意条件&#xff1a;每一次比分的改变&#xff0c;都要形成一…

蓝牙入门基础知识(一)

蓝牙起源 1995年5月20日&#xff0c;在美国华盛顿州&#xff0c;索尼爱立信、IBM、英特尔、诺基亚、东芝成立了蓝牙技术联盟&#xff08;Bluetooth Special Interest Group&#xff0c;SIG&#xff09;。SIG是一个制定蓝牙规范&#xff0c;推送蓝牙技术发展的国际组织。SIG授权…

用python将图片写入ppt_用python做ppt服务用于导入图片

项目需要做WINFORM程序与powerpoint交互&#xff0c;把winform生成的图片自动拷贝到ppt中。目前使用python做了一个简单的服务解决。由于要求是32位程序&#xff0c;所以下面全都是32位的版本。第一步&#xff0c;安装python2.7 32位。第二部&#xff0c;安装py2exe 32位。第三…

C#语言入门详解---委托(刘铁猛)

委托&#xff1a;函数指针的升级版&#xff0c;可以类比C语言中的函数指针进行理解 变量的本质就是以变量名所对应的内存地址为起点的一段内存&#xff0c;这段内存中存储的就是变量的数据&#xff0c;这段内存的大小由变量的数据类型决定。 函数代表算法&#xff0c;函数的本…

【LintCode题集】Q6、Q64

最近开始刷LintCode上的题目&#xff0c;先从标签为容易的开始刷。今天刷的这两题目差不多为同一类型的题目&#xff0c;都是为按照一定的规则合并两个已经有序的数组。 [Q6] 描述&#xff1a; 合并两个排序的整数数组A和B变成一个新的数组。 样例&#xff1a; 给出A[1,2,3,4]&…

input标签的值只能两位小数_解决input只能输入金额类型的方案(金额输入框只能输入2位小数)...

欢迎加我技术交流QQ群 &#xff1a;811956471前言&#xff1a;最近在用uni-app框架&#xff0c;写一个项目(支付宝和微信小程序)遇到一个需求&#xff0c;要求金额输入框只能输入2位小数&#xff0c;且第一位数不能是 "."&#xff0c;只能是数字。发现用 input事件监…

C# winform中判断控件类型

C# winform中对控件类型的判断&#xff1a; public void UpdataControl(Control control, string data) {if (control is TextBox){doSomething1();}if (control is Label){doSomething1();}if (control is Button){doSomething1();}}