欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/10 编程问答 73 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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游戏开发——单例模式的最佳实践的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。