零基础入门 24:Unity设计模式之单键模式

Hello,各位小伙伴,上一篇结束以后,Unity里的UGUI系列分享就已经结束了,不知道大家是否已经灵活掌握运用了呢?

之后的内容会给大家分享一些所谓的干货,都是实战必备。

今天给大家分享一下,Unity里的单键模式。那么什么是单键模式呢?

单键模式(Singleton)要求一个类有且只能有一个实例。在Unity里,这个实例可以依赖也可以不依赖于GamoObject。并且这个实例对外提供一个全局的访问变量,在同一时刻只能被一个线程所访问。

在实际项目中,我们很多时候都需要用到单键,代码的类型标记为Static静态类型,只要能拿到类的地方,全局均可访问使用,从项目开始到结束,除非手动释放置空(依赖于GameObject的单键可以被标记跨场景删除),不然不会被清除,这就是单键。

那么进入今天的正题


前面介绍过,Unity里的单键可以依赖也可以不依赖于GameObject。而且大家需要谨记一件事,继承于MonoBehaviour的类是不能够通过new的形式去创建对象的,这个大家要谨记。避免不要的bug和空值。

好了,先给大家介绍不依赖于GameObject的单键。

一、不依赖于GameObject的单键

我们在Unity里创建一个脚本,名为SingletonTest1

打开脚本,然后定义一个私有的静态对象并且置空,如下图,static代表静态对象类型,=null代表设置为空对象

因为我们先介绍不依赖于GameObject的单键,所以这里我们把类的继承关系去掉。如下图,删除对MonoBehaviour的继承

然后我们在创建一个提供给外部访问的实例静态对象,如下图,我又创建了一个静态类的实例对象,但是是Public的,用于提供给外部访问

如上图,我在Instance的位置加了{ get{} },Instance本身并不是一个函数,而是一个变量,如果是函数都需要带括号()进行声明,这里是一个大括号{}声明的,这个大家可以区分一下,不要混淆。这里是C#对变量的一种特殊操作方式,可以用关键特性get和set进行取值和赋值

我们这里因为要当成提供给外部使用的实例对象,所以这里使用Get进行外部取值。

然后对取值进行完善,并且不依赖于GameObject,直接通过new的方式创建一个类的对象赋值即可,记住上面说的一点,继承MonoBehaviour的对象不能通过new的方式创建

这样就完成对不依赖于GameObject的单键类的创建,然后我们随便公开一个方法输出一句日志,再创建另外一个调用脚本来测试一下对这个单键类的使用。

如下图,我们在调用SingleTonTest1的时候,是点出来一个Instance,即我们单键类提供给外部使用的唯一一个静态实例对象,再通过该实例对象,访问单键类的内部函数和变量。

然后我们将这个LogSingleTon脚本挂载到一个空场景的摄像机上,运行即可查看效果。

如上图所示,运行后我们的调用单键类里的日志可以被正常打出,并且Hierarchy面板里没有其他的对象生成,这就完成了我们对第一种单键对象的创建和使用。

接下来介绍第二种单键对象的创建和使用方法,就是依赖于GameObejct的。

二、依赖于GameObject的单键

第二种方法是依赖于GameObject的单键对象创建方式,我们依然创建一个测试脚本,并且命名为SingleTonTest2。

然后依然打开脚本,创建一个私有的和公开的静态类对象,和之前一样

因为我们第二种演示方式需要依赖于GameObject,所以我们就不删除对MonoBehaviour的继承了,然后来完善对外部获取单例对象的实现。

OK,这样就完成了依赖于GameObject的单键对象的创建,然后我们继续创建一个测试方法提供给外部调用使用。

切回到Unity再次运行项目,就可以看到俩种单键模式的日志输出了,如下图,俩种单键模式的日志都已经输出了,并且第二种依赖于GameObject的单键模式会在Hierarchy面板里创建一个我们命名为SingleTonTest2的对象,上面挂载了我们的SingleTonTest2的脚本组件。

前面提到,依赖于GameObject的单键对象,可以通过标记来实现跨场景之后不销毁,怎么做呢?其实就是加一句话就可以了。

好了,以上就是俩种不同的单键模式的创建和使用,希望大家能对单键模式有一个正确的理解。

后续开始会陆续进行Unity实战的干货分享,不管你是不是零基础入门,只要跟着来,就一定可以学的会。

大家下期见 ヾ( ̄▽ ̄)Bye~Bye~

原文发布于微信公众号 - 韩东吉的Unity杂货铺(DeveloperJimin)

原文发表时间:2017-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

C#网络编程(同步传输字符串) - Part.2

在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可...

13030
来自专栏刘望舒

Java并发编程(四)Java内存模型

相关文章 Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 前言 此前我们讲到了线程、同步...

21360
来自专栏kangvcar

MongoDB 入门极简教程

11710
来自专栏Android机器圈

Java设计模式总汇二(小白也要飞)

PS:上一篇我介绍了适配器设计模式、单例设计模式、静态代理设计模式、简单工厂设计模式,如果没有看过第一篇的小火鸡可以点这个看看http://www.cnblog...

35490
来自专栏有趣的django

面试题目及答案

1 Python的函数参数传递 看两个例子: a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] de...

1.3K90
来自专栏草根专栏

使用xUnit为.net core程序进行单元测试(1)

一. 导读 为什么要编写自动化测试程序(Automated Tests)? 可以频繁的进行测试 可以在任何时间进行测试,也可以按计划定时进行,例如:可以在半夜进...

35050
来自专栏乐沙弥的世界

Linux/Unix shell sql 之间传递变量

       灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell s...

10130
来自专栏ChaMd5安全团队

【首发】记DedeCMS一处由哈希长度拓展攻击引起的越权漏洞

漏洞影响:Dedecms(织梦CMS) V5.7.72 正式版20180109 (最新版)

22230
来自专栏逆向技术

16位汇编语言第二讲系统调用原理,以及各个寄存器详解

   16位汇编语言第二讲系统调用原理,以及各个寄存器详解 昨天已将简单的写了一下汇编代码,并且执行了第一个显示到屏幕的helloworld 问题?   hel...

24400
来自专栏YG小书屋

ES-Spark连接ES后,ES Client节点流量打满分析

72430

扫码关注云+社区

领取腾讯云代金券