题目有点长,但是还是能说明我接下来要说的事情。首先、如果你做的游戏或者项目(手机上)的会有以计时为最后获奖的基准的话,比如书一些益智类解谜游戏。玩家可能会通过先掌握了游戏谜面然后再锁屏作弊,这个时候这样的计时弥补方式就显得非常有必要了
。
先将如下代码准备好,当然你也可以由自己的写法,这都不是重要的地方,之后我会把重要的代码贴出来。这里我先说明一下我的代码的用意,变量num5-num1是作为显示的时间数字,显示在界面上的顺序依次为如图从左到右。
接下俩就是一段关键性的代码,之所以说他重要,是因为这段代码是在电脑上非常不好测。我尝试了多次的断点调试都不能成功获取执行的顺序,另外,这个效果还必须在手机上才能得出效果(当然这个现在不必担心了,本人已经测试了多次也在多台机器上测试过,都没有问题)。而且,Unity自带的Android Plugins中的UnityPlayer.UnitySendMessage,经测试在强制暂停时,OnPause、OnStop周期中UnitySendMessage无效。
最后解释一下这句代码long temp=System.DateTime.Now.Ticks-tempTimeWhenSleep;里面的System.DateTime.Now.Ticks是将当前系统的时间转换成一个统一单位的计时长整数类型的数字,之后再将其转换成对应分钟或者小时。之所以会这样写,是考虑到如果直接使用System.DateTime.Now.Hour或者System.DateTime.Now.Minute会非常麻烦,因为会出现在时钟到整点的时候出现不正确的情况,比如1:56:34—2:10:12的时候就要写很长的的逻辑判断。所以我这里就使用一个计时单位就是System.DateTime.Now.Ticks这一个,减少了一些逻辑上的麻烦。我经过测试从它的右边向左数弟九位为秒,之后就方便了。
![](http://www.unitymanual.com/data/attachment/album/201405/21/160853kdwwyfa5w5d3oow3.png)
[code]csharpcode:
01 | using UnityEngine; |
02 | using System.Collections; |
03 | using System.Collections.Generic; |
04 | bool isPause; |
05 | bool isFouse; |
06 | // Use this for initialization |
07 | void OnEnable() |
08 | { |
09 | isPause= false ; |
10 | isFouse= false ; |
11 | } |
12 | private float timeCounter; |
13 | int num1=0; |
14 | int num2=0; |
15 | int num3=0; |
16 | int num4=0; |
17 | int num5=0; |
18 | long tempTimeWhenSleep; |
19 | void Update () { |
20 | timeCounter += Time.deltaTime; |
21 | if (timeCounter>=1) |
22 | { |
23 | num1+=1; |
24 | timeCounter=0; |
25 | if (num1>=10) |
26 | { |
27 | num2+=1; |
28 | num1=0; |
29 | if (num2>=6) |
30 | { |
31 | num3+=1; |
32 | num2=0; |
33 | if (num3>=10) |
34 | { |
35 | num4+=1; |
36 | num3=0; |
37 | if (num4>=10) |
38 | { |
39 | num5+=1; |
40 | num4=0; |
41 | } |
42 | } |
43 | } |
44 | } |
45 | } |
46 | |
接下俩就是一段关键性的代码,之所以说他重要,是因为这段代码是在电脑上非常不好测。我尝试了多次的断点调试都不能成功获取执行的顺序,另外,这个效果还必须在手机上才能得出效果(当然这个现在不必担心了,本人已经测试了多次也在多台机器上测试过,都没有问题)。而且,Unity自带的Android Plugins中的UnityPlayer.UnitySendMessage,经测试在强制暂停时,OnPause、OnStop周期中UnitySendMessage无效。
所以,只能用到
OnApplicationPause,当程序暂停;
OnApplicationFocus,当程序获得或失去焦点;
强制暂停时,先 OnApplicationPause,后 OnApplicationFocus;
重新“启动”手机时,先OnApplicationFocus,后 OnApplicationPause;
虽然,有了这样的方法可以知道什么时候暂停,什么时候暂停回到界面上。但是实现的如我题目所说的效果还是有一定的难度。首先,如上所说,暂停或者激活的时候上面两个方法都会执行。这样势必要小心些你的代码。而且我刚刚也说过了,这个效果一定要在手机上才能看到效果,在电脑上点击调试暂停时么诶有用的。所以就有了我的如下逻辑代码,这个也是参考了很多别人的博客上的文章。
[code]csharpcode:
01 | void OnApplicationPause() |
02 | { |
03 | if (!isPause) |
04 | { |
05 | tempTimeWhenSleep=System.DateTime.Now.Ticks; |
06 | } |
07 | else |
08 | { |
09 |
10 | isFouse= true ; |
11 | } |
12 | isPause= true ; |
13 | |
14 | } |
15 | void OnApplicationFocus() |
16 | { |
17 | if (isFouse) |
18 | { |
19 | long temp=System.DateTime.Now.Ticks-tempTimeWhenSleep; |
20 |
21 | if (temp>100000000&&temp<600000000) |
22 | { |
23 | num2+= int .Parse (temp.ToString ().Substring (0,1)); |
24 | num1+= int .Parse (temp.ToString ().Substring (1,1)); |
25 | if (num2>=6) |
26 | { |
27 | num3+=1; |
28 | num2=0; |
29 | } |
30 | } |
31 | else if (temp>=600000000&&temp<6000000000) |
32 | { |
33 | num3+= int .Parse ((temp/60).ToString ().Substring (0,1)); |
34 | num2= int .Parse (temp.ToString ().Substring (1,1))>6?0: int .Parse (temp.ToString ().Substring (1,1)); |
35 | num1= int .Parse (temp.ToString ().Substring (2,1)); |
36 | } |
37 | else if (temp>=6000000000&&temp<60000000000) |
38 | { |
39 | num4+= int .Parse ((temp/600).ToString ().Substring (0,1)); |
40 | num3+= int .Parse ((temp/60).ToString ().Substring (1,1)); |
41 | } |
42 | else if (temp>=60000000000) |
43 | { |
44 | Application.LoadLevel ( "main" ); |
45 | } |
46 | isFouse= false ; |
47 | isPause= false ; |
48 | } |
49 | if (isPause) |
50 | { |
51 | isFouse= true ; |
52 | tempTimeWhenSleep=System.DateTime.Now.Ticks; |
53 | } |
54 |
55 | } |
转载自博客 http://www.unitymanual.com/blog-3579-726.html