0.前言

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

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

1.单例框架介绍

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

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

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

单例模块所有脚本
  • 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);}
}

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

4.总结

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

QF框架下载地址

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

  1. android手机游戏开发从入门到精通_unity3d游戏开发如何从入门到精通?

    对于游戏爱好者来说,unity3d想必大家都不陌生,unity3d和虚幻4算是现在最主流的游戏开发引擎,当然,Unity 3D 游戏开发引擎目前之所以炙手可热,与其完善的技术以及丰富的个性化功能密不可 ...

  2. unity 通过resouce加载图片_Unity游戏开发笔记-资源管理之资源加载

    资源加载是游戏中非常重要也非常繁琐的的一部分,不合理的资源管理,必定回给游戏的内存带来非常大的压力,尤其是一些重度游戏,不但资源特别多,引用关系特别复杂.维护一个不会内存泄漏而且加载效率高的资源加载框 ...

  3. arcore之路-unity开发从入门到实践_AR开发之路——准备工作

    由于现在支持AR功能的手机没有普及,讲AR开发的教程也少,所以要学习AR开发还是要花点成本的,当然也有好处,花了学费,才会逼着自己坚持学下去. 为了学习AR,Relax今天入手了一部华为Nova 3i ...

  4. C#游戏开发快速入门2.2改变游戏对象的状态

    C#游戏开发快速入门2.2改变游戏对象的状态 改变游戏对象的状态,就是要改变游戏对象的位置.朝向和大小.那么,为什么要改变游戏对象的状态呢?当然是因为游戏对象的状态不合适了.在具体说明之前,读者应该先 ...

  5. C#游戏开发快速入门 2.1 构建游戏场景

    C#游戏开发快速入门 2.1  构建游戏场景 如果已经计划好了要编写什么样的游戏,在打开Unity以后,要做的第一件事情就是构建游戏场景(Scene).游戏场景就是玩家游戏时,在游戏视图中看到的一切, ...

  6. 【web前端特效源码】使用 HTMLCSSJavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开发基础入门教程|网页制作|网站开发定制

    b站视频演示效果: [web前端特效源码]使用 HTML&CSS&JavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开 效 ...

  7. 游戏开发入门(一)游戏开发概述

    视频链接:游戏开发入门(一)游戏开发概述(3节课 时常:约1小时03分钟) 该视频围绕电子游戏的发展与开发简单介绍了一些基本常识,同时提出并解决了几个问题 笔记与总结(请先学习视频内容): 1.游戏机 ...

  8. bk3432开发的应用实例_SpringCloud应用在Kubernetes上的最佳实践—诊断(线上联调)...

    作者 | 纳海 阿里巴巴高级开发工程师 导读:上篇我们介绍了应用成功上云后,面对应用的管理,如何做可灰度的线上发布,那么当云上的应用行为不符合预期的时候,您会怎么处理呢?修改代码,打包,部署,然后查看 ...

  9. 【Unity3D游戏开发】之游戏目录结构之最佳实践和优化 (十一)

    游戏目录结构之最佳实践 前置条件 1.多人协作开发,git管理 2.游戏不大,所有Scene合并到一起Scene中,eg.RoleScene.MapScene.StoreScene 3.Master一 ...

最新文章

  1. HDU 4712 Hamming Distance(随机算法)
  2. asp.net mvc 页面传值的方法总结
  3. 〖Android〗代理与正常网络分开同步CyangenMod源码
  4. itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
  5. system-copy 和 ShellExecute 用法
  6. vue.js2.0 新手开发_VueJs2.0建议学习路线
  7. 进程同步,异步,互斥
  8. java简单数据结构_图解Java常用数据结构
  9. java 防重_如何做一个防重设计
  10. CAD中怎么将Z轴归零?CADZ轴归零教程
  11. 退货地址导出(拼多多)
  12. 福建省厦门市谷歌卫星地图下载
  13. linux查找文件重复项,Linux中如何使用命令查找重复文件
  14. H5 页面36种漂亮的CSS3网页按钮Button样式
  15. 短信网关平台选型推荐
  16. Bag of Tricks for Image Classification with Convolutional Neural Networks(卷积神经网络在图像分类中的技巧)
  17. Java Online IDE
  18. sqlitedeveloper数据库管理(SQLite Developer) v4.0.0.528 中文破解版
  19. 动态规划---01背包问题详解
  20. sin函数对照表_常见三角函数值对照表

热门文章

  1. 淘宝首页的HTML以及CSS技术点
  2. 自定义EditText输入框
  3. Android 固定式底部上滑抽屉view
  4. oracle导入中文数据出现乱码
  5. java web项目中连接mysql数据库,javaweb之eclipse工程连接mysql数据库
  6. url oracle default schema,oracle @Table中使用schema时insert报错
  7. java 生成url_JAVA 通过URL生成水印图
  8. 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
  9. 【C++深度剖析教程34】C++中的强制类型转换dynamic_cast
  10. 嵌入式Linux操作系统移植IMX6开发板之实现USB 自动挂载