【问题标题】:How to make a live counter in unity3d如何在unity3d中制作实时计数器
【发布时间】:2018-11-24 10:09:36
【问题描述】:

我最近开始使用 Unity3D 并制作了几个关卡。
我现在唯一的问题是如何获得实时计数器?
所以我的角色在击中某个物体时会死亡。
我希望我的角色最多获得 3 条生命,并在他击中该物体时获得 -1 条生命。
并且它会在他死后保留数据,因此如果您重新启动应用程序,您将无法恢复生命。 并且在一定时间后,他获得了 +1 直播。

谢谢你:)

【问题讨论】:

  • 请添加您目前拥有的代码
  • 雨果,我还没有

标签: unity3d counter live


【解决方案1】:

在您的游戏运行时。只需创建一个变量 counterTime 来计算时间,只要 counterTime 通过一定的时间,您希望将 counterTime 重置为 0 并增加您的寿命。 当用户退出您的应用时,将上次时间保存到 PlayerPref,例如:

PlayerPref.SaveString("LastTime", DateTime.Now);

当用户复出游戏时,只需检查上次和现在之间的持续时间来计算总生命需要增加。例如:

DateTime lastTime = DateTime.Parse(PlayerPref.GetString("LastTime"));
TimeSpan timeDif= DateTime.Now - lastTime;
int duration = timeDif.TotalSeconds;

【讨论】:

    【解决方案2】:

    您可以使用 PlayerPrefs.SetInt 、 PlayerPrefs.GetInt 在文件存储中存储和读取玩家的 hp。在此处阅读更多信息:

    https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

    至于几分钟后给玩家+1 hp,您可以将DateTime.Now 存储在PlayerPrefs 变量中,只要您给玩家一些hp 并使用TimeSpan 和TotalMinutesPassed:

    TimeSpan passedTime = DateTime.Now - lastStoredDateTime;
    int totalMinutesPassed = passedTime.TotalMinutes;
    

    我猜应该是这样的(没有测试这段代码只是显示一个大概的想法):

    void SetPlayerLives(int lives)
    {
        playerLives = lives;
        PlayerPrefs.SetInt("player-lives",playerLives);
    }
    //TODO: also sth like => int GetPlayerLives() function
    void CheckLiveRegen() //call this function whenever you want to check live regen:
    {
        int LIVE_REGEN_MINUTES = 5; //regen 1 live every 5 minutes
        DateTime lastStoredDateTime = DateTime.Parse(PlayerPrefs.GetString("last-live-regen", DateTime.Now.ToString()));
        TimeSpan passedTime = DateTime.Now - lastStoredDateTime;
        double totalMinutesPassed = passedTime.TotalMinutes;
        if(totalMinutesPassed >= LIVE_REGEN_MINUTES) 
        {
            int val = (int) totalMinutesPassed / LIVE_REGEN_MINUTES;
            // Add val to your player lives! + store new lives value
            SetPlayerLives(playerLives+val);
            //update last-live-regen value:
            PlayerPrefs.SetString("last-live-regen", DateTime.Now.ToString());
        }
    }
    

    注意: DateTime 、 TimeSpan 类在早于 2017.4 (LTS) 的版本中存在一些错误(特别是在 android 平台中)确保记录值并检查函数是否正常工作。 https://forum.unity.com/threads/android-datetime-now-is-wrong.488380/

    【讨论】:

    • 哦,还有一个问题,我怎样才能添加一个活,如果他死了,他得到 -1,当他有 0 时,他不能再这样做了?
    • 我不确定你的意思是什么,但我想如果你的意思是像保存 live-1 一样?您可以再次使用新值调用 SetPlayerLives ( PlayerPrefs.SetInt )。 ( SetPlayerLives(playerLives-1) ? ) 并且你可以检查你的 playerLives != 0 当你想重启游戏还是什么?
    • 好的,我会尽量告诉我我的问题!
    • 所以,我一直在寻找一个实时计数器,但现在没有找到任何可以与 unity3d 正常工作的计数器。我正在尝试寻找一个新的,它具有:最多 3 条生命,然后观看广告或等待 10 分钟获得一条生命。并且它会保留它,因此如果您重新启动,您仍然会保留所有当前的生活(0、1、2 等)。你有什么不和,或者你可以教我吗?
    【解决方案3】:

    查看以下链接以了解如何统一创建生命计数器 http://codesaying.com/life-counter-in-unity/

    为了计算自上次关闭游戏以来经过的时间,您应该在函数 OnApplicationPause 中保存上次 playerprefs 的时间,并在 Awake 函数中计算所经过的时间。

     void Awake () {
    
         if(!PlayerPrefs.HasKey("Lives")){
             PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.ToString());
         }
         lives = PlayerPrefs.GetInt("Lives", maxLives);
         //update life counter only if lives are less than maxLives
         if (lives < maxLives)
         {
             float timerToAdd = (float)(System.DateTime.Now - Convert.ToDateTime(PlayerPrefs.GetString("LifeUpdateTime"))).TotalSeconds;
             UpdateLives(timerToAdd);
         }
    
     }
    
    
     void UpdateLives(double timerToAdd ){
         if (lives < maxLives)
         {
             int livesToAdd = Mathf.FloorToInt((float)timerToAdd / lifeReplenishTime);
             timerForLife = (float)timerToAdd % lifeReplenishTime;
             lives += livesToAdd;
             if (lives > maxLives)
             {
                 lives = maxLives;
                 timerForLife = 0;
             }
             PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.AddSeconds(-timerForLife).ToString());
         }else{
             PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.ToString());
         }
     }
     void OnApplicationPause(bool isPause)
     {
         if (isPause)
         {
             timeOfPause = System.DateTime.Now;
         }
         else
         {
             if(timeOfPause == default(DateTime)){
                 timeOfPause = System.DateTime.Now;
             }
             float timerToAdd = (float)(System.DateTime.Now - timeOfPause).TotalSeconds;
             timerForLife += timerToAdd;
             UpdateLives(timerForLife);
         }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2023-03-09
      • 2012-04-19
      • 2019-01-14
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多