2016-07-15 118 views
0

我想製作一個計時器來重置商家的物品價格和數量。如何在遊戲關閉時繼續倒數計時器?

與許多安卓遊戲一樣,有些計時器在不玩遊戲時會繼續下去。 當你不玩遊戲時,計時器應該繼續倒計時。 遊戲關閉時如何保持倒數計時器正在運行?

下面是我倒數計時器

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class margaretSellTimer : MonoBehaviour { 
    public Text TimerText; 
    public string dy; 
    public float days; 
    public float Hours; 
    public float Minutes; 
    public float Seconds; 

    initMerchantMargaret initMerchants; 
    player Player; 

    // Use this for initialization 
    void Start() { 
     initMerchants = GameObject.FindGameObjectWithTag ("initMerchant").GetComponent<initMerchantMargaret>(); 
     Player = GameObject.FindGameObjectWithTag ("player").GetComponent<player>(); 
     StartCoroutine(Wait()); 

    } 

    // Update is called once per frame 
    void Update() { 
     if (days == 1) { 
      dy = "day "; 
     } else if (days > 1) { 
      dy = "days "; 
     } else { 
      dy = "day "; 
     } 

     if(Seconds < 10) 
     { 
      TimerText.text = (days + " " + dy + Hours + ":" + Minutes + ":0" + Seconds); 
     } 
     if(Seconds > 9) 
     { 
      TimerText.text = (days + " " + dy + Hours + ":" + Minutes + ":" + Seconds); 
     } 


    } 

    public void CountDown() 
    { 
     if(Seconds <= 0) { 
      if(Minutes > 0) { 
       MinusMinute(); 
       Seconds = 60; 
      } 
     } 
     if (Minutes <= 0) { 
      if(Hours > 0) { 
       MinusHours(); 
       Minutes = 59; 
       Seconds = 60; 
      } 
     } 

     if (Hours <= 0) { 
      if(days > 0) { 
       MinusDays(); 
       Hours = 23; 
       Minutes = 59; 
       Seconds = 60; 
      } 
     } 

     if(Minutes >= 0) 
     { 
      MinusSeconds(); 
     } 

     if(Hours <= 0 && Minutes <= 0 && Seconds <= 0 && days <= 0) 
     { 
      StopTimer(); 
     } 
     else 
     { 
      Start(); 
     } 

    } 

    public void MinusDays() { 
     days -= 1; 
    } 

    public void MinusHours() { 
     Hours -= 1; 
    } 

    public void MinusMinute() { 
     Minutes -= 1; 
    } 

    public void MinusSeconds() { 
     Seconds -= 1; 
    } 

    public IEnumerator Wait() { 
     yield return new WaitForSeconds(1); 
     CountDown(); 
    } 

    public void StopTimer() { 
     Seconds = 5; 
     Minutes = 0; 
     Hours = 0; 
     days = 0; 

     Player.margaretItemSell.Clear(); 
     Player.productMargaretSell.Clear(); 
     Player.productSellMargaret.Clear(); 

     initMerchants.margaretSell(); 

     Start(); 
    } 
} 

感謝。

+2

而不是繼續的計時器,保存狀態,當你退出遊戲。然後,當遊戲再次開始時,計算保存狀態和當前時間之間的偏移量,並從那裏繼續計時。 – Cheesebaron

+1

^那麼這是一個很好的解決方案。但我猜如果目的是在一定時間後發送推送通知,那麼可能需要使用原生android代碼或某些第三方插件來創建後臺服務。 –

+0

爲了上帝的緣故,只需使用Invoke。 – Fattie

回答

1

當用戶離開會話並通過PlayerPrefs將其存儲在設備上時取出UNIX時間戳。

當用戶回來時,從PlayerPrefs獲取數據並將其與當前時間戳進行比較。

這不會阻止用戶時間旅行,因爲這將需要服務器存儲。

private void OnLeaveSession() 
{ 
    long timestamp= (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds; 
    string value = timestamp.ToString(); 
    PlayerPrefs.SetString("Time", value); 
} 

private void OnResumeSession() 
{ 
    long timestamp= (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds; 
    string value = PlayerPrefs.GetString("Time"); 
    long oldTimestamp = Convert.ToInt64(value); 
    long elapsedSeconds = timestamp - oldTimestamp; 
    OnResumeSession(elapsedSeconds); // forward to listeners 
} 

OnResumeSession將是一個事件,但您也可以在該方法中執行操作。

+0

這是偉大的,但在我上面的代碼如何將elapsedseconds轉換爲小時,分鐘和秒? –

+0

@DennisLiu檢查我的答案 –

+0

你不想轉換爲小時或分鐘,這使得它更復雜。考慮你想檢查2h是否已經過去,1h37m23s已經過去了,你如何檢查兩個小時?隨着elapsedSeconds,只是檢查是否> 7200. – Everts

1

而不是使用客戶端邏輯的,使用服務器端狀態和DB保存用戶定時器的狀態,或者你只是使用的登錄時間[其中計時器開始]在DB,當用戶重新登錄保存或恢復播放,請致電後端api匹配客戶端和服務器時間之間的偏移時間。

如果用戶時間在服務器上過期顯示您想要顯示的內容等等。 這樣做的另一種方法是減少錯誤機會爲計時器的最後一個狀態添加服務器端狀態和用戶端本地存儲/文件存儲,並且可以從那裏恢復並與服務器匹配以根據需要執行更正。

關鍵是上次偏移。

1

要獲得DaysHours,從elapsedSecondsMinutesSeconds,您可以使用TimeSpane

像這樣:

TimeSpan interval = TimeSpan.FromSeconds(elapsedSeconds); 
days = interval.Days; 
hours = interval.Hours; 
minutes = interval.Minutes; // etc 
+0

多數民衆贊成在@Umair M,我很抱歉,我可以;剔兩個答案。但感謝您的幫助.. :) –

+0

Np。你可以投票了;) –

+0

是的,我做它:) –