arcore之路-unity开发从入门到实践_Unity游戏开发——单例模式的最佳实践
0.前言
StarryFun:Unity游戏开发——关于单例模式的理解zhuanlan.zhihu.com
之前一篇文章讲了单例模式的简单理解,自知其中有很多不严谨的地方,由于本萌新也是在学习阶段,所以去翻看了开源的项目都是怎么实现的,发现了一个比较完整详细的解决方案,并且给提取了出来,准备当作工具在项目中复用,接下来给大家聊一下这个单例框架的实现思路和使用方法。
1.单例框架介绍
先聊聊这个单例框架都有什么玩法
- 可以减少写重复代码
- 使用属性标签更有条理的管理单例模块
- 可以控制单例的生命周期
- 可以选择是否开放自身实例的获取
- 即有基于monobehaviour生命周期的单例,也有类的单例
单例框架是由两部分组成,这里我们主要介绍拥有MonoBehaviour生命周期的单例,类的单例同理所以就不重复介绍了
- ISingleton:一个接口,里面也只有一个初始化方法。使用接口有两个作用,一对单例进行约束,二是提供统一的初始化接口
- MonoSingleton:这个是开放了外界对自身实例进行访问的单例写法,也是比较常规的玩法,使用的方法是继承它就可以了
- MonoSingletonCreator:一个单例的创建器,对特殊情况的处理和实例的创建都在这里完成,属于一个比较核心的类
- MonoSingletonPath:通过属性标签来指定全局单例在场景中的路径,目的是让用户管理单例模块更有条例一些,核心思想是反射+Attribute
- MonoSingletonProperty:这个是关闭了外界对自身实例的访问,也就是实例私有化,对外界也只提供静态方法,这样做有两个好处:1.使成员变量更安全,尤其是多人协作的时候,做了这个限制也就降低了一些未知的风险。2.调用方式为“单例名.方法名”,这比“单例名.Instance.方法名”少了一步,作为一个懒人,使用体验极佳。
3.使用方式
- 单例的实现
- 通过继承实现单例
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游戏开发——单例模式的最佳实践相关推荐
- android手机游戏开发从入门到精通_unity3d游戏开发如何从入门到精通?
对于游戏爱好者来说,unity3d想必大家都不陌生,unity3d和虚幻4算是现在最主流的游戏开发引擎,当然,Unity 3D 游戏开发引擎目前之所以炙手可热,与其完善的技术以及丰富的个性化功能密不可 ...
- unity 通过resouce加载图片_Unity游戏开发笔记-资源管理之资源加载
资源加载是游戏中非常重要也非常繁琐的的一部分,不合理的资源管理,必定回给游戏的内存带来非常大的压力,尤其是一些重度游戏,不但资源特别多,引用关系特别复杂.维护一个不会内存泄漏而且加载效率高的资源加载框 ...
- arcore之路-unity开发从入门到实践_AR开发之路——准备工作
由于现在支持AR功能的手机没有普及,讲AR开发的教程也少,所以要学习AR开发还是要花点成本的,当然也有好处,花了学费,才会逼着自己坚持学下去. 为了学习AR,Relax今天入手了一部华为Nova 3i ...
- C#游戏开发快速入门2.2改变游戏对象的状态
C#游戏开发快速入门2.2改变游戏对象的状态 改变游戏对象的状态,就是要改变游戏对象的位置.朝向和大小.那么,为什么要改变游戏对象的状态呢?当然是因为游戏对象的状态不合适了.在具体说明之前,读者应该先 ...
- C#游戏开发快速入门 2.1 构建游戏场景
C#游戏开发快速入门 2.1 构建游戏场景 如果已经计划好了要编写什么样的游戏,在打开Unity以后,要做的第一件事情就是构建游戏场景(Scene).游戏场景就是玩家游戏时,在游戏视图中看到的一切, ...
- 【web前端特效源码】使用 HTMLCSSJavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开发基础入门教程|网页制作|网站开发定制
b站视频演示效果: [web前端特效源码]使用 HTML&CSS&JavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开 效 ...
- 游戏开发入门(一)游戏开发概述
视频链接:游戏开发入门(一)游戏开发概述(3节课 时常:约1小时03分钟) 该视频围绕电子游戏的发展与开发简单介绍了一些基本常识,同时提出并解决了几个问题 笔记与总结(请先学习视频内容): 1.游戏机 ...
- bk3432开发的应用实例_SpringCloud应用在Kubernetes上的最佳实践—诊断(线上联调)...
作者 | 纳海 阿里巴巴高级开发工程师 导读:上篇我们介绍了应用成功上云后,面对应用的管理,如何做可灰度的线上发布,那么当云上的应用行为不符合预期的时候,您会怎么处理呢?修改代码,打包,部署,然后查看 ...
- 【Unity3D游戏开发】之游戏目录结构之最佳实践和优化 (十一)
游戏目录结构之最佳实践 前置条件 1.多人协作开发,git管理 2.游戏不大,所有Scene合并到一起Scene中,eg.RoleScene.MapScene.StoreScene 3.Master一 ...
最新文章
- HDU 4712 Hamming Distance(随机算法)
- asp.net mvc 页面传值的方法总结
- 〖Android〗代理与正常网络分开同步CyangenMod源码
- itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
- system-copy 和 ShellExecute 用法
- vue.js2.0 新手开发_VueJs2.0建议学习路线
- 进程同步,异步,互斥
- java简单数据结构_图解Java常用数据结构
- java 防重_如何做一个防重设计
- CAD中怎么将Z轴归零?CADZ轴归零教程
- 退货地址导出(拼多多)
- 福建省厦门市谷歌卫星地图下载
- linux查找文件重复项,Linux中如何使用命令查找重复文件
- H5 页面36种漂亮的CSS3网页按钮Button样式
- 短信网关平台选型推荐
- Bag of Tricks for Image Classification with Convolutional Neural Networks(卷积神经网络在图像分类中的技巧)
- Java Online IDE
- sqlitedeveloper数据库管理(SQLite Developer) v4.0.0.528 中文破解版
- 动态规划---01背包问题详解
- sin函数对照表_常见三角函数值对照表
热门文章
- 淘宝首页的HTML以及CSS技术点
- 自定义EditText输入框
- Android 固定式底部上滑抽屉view
- oracle导入中文数据出现乱码
- java web项目中连接mysql数据库,javaweb之eclipse工程连接mysql数据库
- url oracle default schema,oracle @Table中使用schema时insert报错
- java 生成url_JAVA 通过URL生成水印图
- 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
- 【C++深度剖析教程34】C++中的强制类型转换dynamic_cast
- 嵌入式Linux操作系统移植IMX6开发板之实现USB 自动挂载