当手机锁屏或者切换出游戏一段时间再次进入时怎么样弥补这段时间到游戏的计时中去 ...

题目有点长,但是还是能说明我接下来要说的事情。首先、如果你做的游戏或者项目(手机上)的会有以计时为最后获奖的基准的话,比如书一些益智类解谜游戏。玩家可能会通过先掌握了游戏谜面然后再锁屏作弊,这个时候这样的计时弥补方式就显得非常有必要了
先将如下代码准备好,当然你也可以由自己的写法,这都不是重要的地方,之后我会把重要的代码贴出来。这里我先说明一下我的代码的用意,变量num5-num1是作为显示的时间数字,显示在界面上的顺序依次为如图从左到右。

[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     }
最后解释一下这句代码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/blog-3579-726.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值