zoukankan      html  css  js  c++  java
  • Unity3D 游戏计时功能实现

    最近工作实在是太忙了,没办法认真写博客,但是还是要好好记录下日常的学习。

    需求

    各类游戏中都大量运用到计时功能,不管是直接显示的在前端UI,还是后台运行。

    思路

    Unity中提供了Time类可以方便的进行时间上的获取,下面的例子中,我对其进行的简单的封装,能够方便的运用到各类型的游戏中。不少游戏中同时还提供了加速,暂停等等功能,unity中的TimeScale属性可以很方便的实现这些功能。

    实现

    计时的功能实现起来还是比较的方便。unity的Time.time能个距离游戏开始的时间,利用Mathf.FloorToInt方法取整,就等到了距离游戏开始多少秒,简单的写了两个时间转换的方法。

     

     1 void OnGUI()
     2     {
     3         GUI.skin = clockGuiSkin;
     4         NowTime = TimeFormatBase(Mathf.FloorToInt(Time.time));
     5         GUI.Label(new Rect(screenWidth*0.8f, screenHeight*0.05f, 120f, 30f), NowTime);
     6         
     7         if(GUI.Button(new Rect(10,10,100,30),"暂停"))
     8         {
     9             Debug.Log("Stop");
    10             Stop();
    11         }
    12         if (GUI.Button(new Rect(10, 60, 100, 30), "加速"))
    13         {
    14             timeScale = Mathf.Clamp(timeScale*2,0,100);
    15             
    16             SetTimeScale(timeScale);
    17             Debug.Log("Quick:" + timeScale);
    18         }
    19     }
    Clock

     1 tring TimeFormatBase(float nTotalTime)
     2     {
     3         string time = string.Empty;
     4         float hour = Mathf.Floor(nTotalTime / 3600);
     5         float min = Mathf.Floor(nTotalTime % 3600 / 60);
     6         float sec = nTotalTime % 60;
     7         if(hour >= 0 && hour <10)
     8             time = string.Concat("0",hour,":");
     9         else
    10             time = string.Concat(hour, ":");
    11         
    12         if (min >= 0 && min < 10)
    13             time = string.Concat(time, "0", min, ":");
    14         else
    15             time = string.Concat(time, min, ":");
    16         
    17         if (sec >= 0 && sec < 10)
    18             time = string.Concat(time, "0", sec);
    19         else
    20             time = string.Concat(time, sec);
    21         return time;
    22     }
    TimeFormatBase

     1 string TimeChineseFormat(float nTotalTime)
     2     {
     3         string time = string.Empty;
     4         float day = Mathf.Floor(nTotalTime / 86400);
     5         float hour = Mathf.Floor(nTotalTime % 86400 / 3600);
     6         float min = Mathf.Floor(nTotalTime % 3600 / 60);
     7         float sec = nTotalTime % 60;
     8         if (day > 0)
     9             time = string.Concat(day, "");
    10         if(hour>0)
    11             time = string.Concat(time,hour, "");
    12         if(min>0)
    13             time = string.Concat(time,min, "");
    14         if(sec>0)
    15             time = string.Concat(time,sec, "");
    16         return time;
    17     }
    TimeChineseFormat

    总结

    TImeScale方法改变速度的范围是0~100之间,超过这个范围会报错,所以使用的时候我直接使用了Mathf.Clamp对其进行了限制,防止越界。于此同时,Time.time方法只是记录了游戏运行开始的时间,日常游戏中我们所需要的是进入游戏后的时间,这里还需要进行下改进。有些游戏中还存在时间倒流的功能。TimeScale显然无法处理,如果只是当存的现实时间倒流,其实只要将取的时间变为负值即可,但是timescale方法同时会影响到诸如Update方法的运行,所以对于时间倒流的方法,有时间还是要研究看看,如果有知道的朋友,可以留言分享一下。

  • 相关阅读:
    好的Qt学习资料
    QT QMap介绍与使用
    Qt缺少调试器
    vs2012+Qt5.3.1环境添加新的ui界面的方法
    QT定时器的使用
    Qt中forward declaration of struct Ui::xxx的解决
    linux-svn命令
    如何编写Windows服务
    为你的爬虫提提速?
    Python爬虫的N种姿势
  • 原文地址:https://www.cnblogs.com/nightcat/p/unity2d_004.html
Copyright © 2011-2022 走看看