Unity插件脚本分享与分析——礼物计时系统
前言:众所周知,Unity自带的原生插件非常有限,可以实现的功能又非常少。不过Unity的运营团队也早就意识到了这一点,所以在Unity的Assets store上面出售来自其他开发者制作的插件。这就非常理想了,Unity运营团队不可能把所有功能都做的面面俱到,但是依靠着Unity海量的开发者,一些你没有能力实现的,只要支付相应的费用就可以实现你要的功能。此举可谓是三赢,即Unity丰富了自己引擎的三方库插件,插件开发者收到了相应的报酬,购买方可以实现自己本来实现不了的功能。不过作为Unity新人的我和你,除了要学会如何使用这些插件或者脚本以外,更应该去分析这些插件是如何实现的。知道这些插件实现的过程再结合自己的知识,说不定现在是新人的我们,将来也会成为像那些插件制作者一样的大牛。所以这个文集将会给大家分享Unity中的一些插件和脚本,并给同是新人的你们看看这些插件脚本是如何实现的。
今天是这个文集的第一篇。我给大家带来一个我最近制作的小游戏中使用的一个插件,这个插件的名字叫 Free Gitf System,是一个礼物计时系统。相信大家多少都有玩过一些手游吧,大多数里面会提供一些免费的礼物。但这些礼物获取都会间隔一定的时间,比如2个小时,也就是说当你获得了这个礼物以后需要再过2个小时才能再次领取。而且最关键的一点就是就算关闭了这个游戏,计时仍在继续,不会停止。
在我分享这款插件之前,请大家先思考一下,如果是你,你是如何实现的呢?
这是一款我在Unity Assets store上花5美元购买的插件,当时在做这个功能的时候也确实没办法实现,也就是上面提到的关闭游戏后,计时仍在继续。后来买回来才知道,不过这钱花的值。
这款插件需要的Unity版本是5.5.0或者更高的版本。下面先带来这款插件的视频演示。
Free Gift System
看过上面的视频演示之后想必大家都对这款脚本有了初步的印象,那么下面我就给大家来说说它的实现方法吧。首先,先把脚本下载和导入到你的Unity项目当中。
导入进来后,可以看见一共是八个文件夹和一个文档。拿到一款插件之后想要知道如何使用的话就一定要先仔细的阅读以下使用文档,几乎所有插件都会有一份这样的使用说明。学会看文档是一个开发者应有的技能。不过呢在这里我并不打算带你们看文档,因为几乎没有一个文档会告诉你们这些插件是如何实现的。
要想知道这个插件如何实现的,就要找到插件的核心代码块。上面的文件夹当中,最关键的就是Scripts文件夹下的一个脚本了。
这个脚本就是整个插件的核心了,让我把代码贴上,慢慢道来。
很明显这个脚本的域名空间是FAFreeGift,所以要在你的脚本中使用的话必须引用这个域名空间,即Using FAFreeGift。随后整个代码被分为三个部分,变量声明,初始化和一些核心方法。我们现在就从变量声明开始。
一共是四个静态私有变量,前三个就是定义两次礼物获取的间隔时间,分别对应时、分、秒。最后一个是所花费时间的总秒数。举个例子:2小时30分钟,那么totalTimeInSeconds = 9000。这四个很好理解。现在请看下面的初始化部分。
这里只有一个静态方法,并且外部会传入三个参数,用来初始化上面四个变量。想必这个方法也不用多作解释,大家应该都能看得懂。
在核心方法部分里面,作者一共定义了四个方法,我们现在先来看第一个。这个静态方法返回了一个TimeSpan的结构体,TimeSpan是用来储存相应的时间。如果不是很清楚的话请自行百度,网上对这个结构体有更深入的解释。
1. 获取现在的系统时间CurrentDate。
2. 获取储存在本地的上一次礼物获得的时间。
3. 转换成 DateTime类型。
4. 声明一个新的时间,并把上一次获得礼物的时间加上2个礼物间隔的总秒数,这样就能得到下一次获取礼物的具体时间。
5. 这个difference变量我们可以把它翻译成时间差,就是具体还剩多少时间才能获取礼物。这里就是用刚刚获得的下次礼物的具体时间减去现在的时间。
6. 返回这个时间差。
接下来看上面这个方法。返回一个布尔值,很明显是用来检测两次礼物的间隔时间有没有到,也就是说是否可以获取礼物。
1. 首先获取储存好的一个整形变量,这个变量是用来记录获得过多少次礼物的。
2. 如果FreeGiftsPicked == 0 也就是说玩家从来没有获取过礼物,那肯定是返回true的
3.同样这里又获取时间差difference的TotalSeconds的属性,这个是TimeSpam中的一个静态变量,用来计算总共的秒数。如果这里面的秒数小于等于0,那就表示没有时间差,可以获取礼物。反之,则返回false。
这个方法是用来处理开始点击获取礼物并检测系统是否被黑。
1.初始化时间差。
2.获取礼物获得次数。
3.判断是否已经获得过礼物了。
4.如果获得过了先获取现在的时间。
5.获取上一次获得礼物的时间。
6.转换类型。
7.再用现在的时间减去之前之前的时间获取时间差。
8现在就开始判断是否是第一次获取礼物或者时间差的总秒数是否大于0。由于现在的时间减去上一次获得礼物的时间永远不可能为负数,因为现在的时间是一直在增长的。如果出现负数,很有可能是有人修改过时间,让礼品获取的时间差缩短。
9. 获取获得礼品的次数并增加一次。
10. 把增加后的礼品次数保存至本地,以供以后使用。
11. 把现在的时间储存到本地,而这个时间就变成上一次获得礼物的时间了。
10. receiveNotificationWhenFreeGift()这个方法是告知Ios和安卓提示系统的,下面就会说到。
这个方法就是通知个平台时间到了,可以获取礼物了。别的我不多说,我就说重点的。
先看安卓部分的,当中有一句 Delay = TimeSpan.FromSeconds(totalTimeInSeconds)。Delay是延迟的意思,由于这个方法是当点击获取礼物的同时触发的,也就是说这个礼物必须要等到时间差结束之后才可以通知玩家。所以这里用了延时提示的属性。同理ios也用了同样的方法,notif.fireDate = DateTime.Now.AddSeconds(totalTimeInSeconds);。
到这里,核心模块已经全部介绍完了。下面就看看这些是如何运用到实际的项目中的。
首先using FAFreeGift;必须要在项目中引用。随后就要在Start()方法中初始化时间差。FreeGiftController.initialization(hours, minutes, seconds);
void updateTimeRemainingUIText()这是个核心方法。首先先判断时间差有没有结束,如果结束了,就更新一下点击礼物按钮的状态。updateStatusOfButtons();这个方法就是根据判断结果而让点击按钮是否工作。下面就是直接获取剩余时间,并用下面一大串代码输出的具体的文本当中让玩家看见剩余的时间。
上面这个方法就是当获取礼物这个按钮被点击后,先取消延时方法,不让text刷新。随后执行插件当中的处理礼物获取方法并返回系统是否被黑的结果。结果为true说明一切正常,把UI状态调整一下并协同一个礼物获取的方法。反之,则播放提示系统被黑的动画。
当用户点击完获取礼物的按钮后会告知用户你已经获得了礼物,并让用户点击确定按钮。上面这个就是这个按钮的方法。
首先更新按钮状态。随后每一秒执行updateTimeRemainingUIText方法,具体内容请看前面。最后还是调整ui状态。
现在所有的步骤已经完成,还差一步。就是在游戏关了之后再打开也要继续显示剩余时间。那么我们就要在Start()方法中再次执行InvokeRepeating("updateTimeRemainingUIText", 0.0f, 1.0f);这个方法。
到这里,这个插件所有的分析已经讲完了。如果你有什么疑问可以留言给我,如果你想要这个插件也可以告诉我。