如何在游戏结束时继续倒计时?

时间:2016-07-15 10:43:53

标签: c# android unity3d timer

我想制作一个可以重置商家商品价格和数量的计时器。

与许多安卓游戏一样,有些计时器在不玩游戏时会继续下降。 当您不玩游戏时,计时器应继续倒计时。 如何在游戏结束时保持倒数计时器?

以下是我的倒数计时器

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 ();
    }
}

感谢。

3 个答案:

答案 0 :(得分:1)

使用服务器端状态和DB 来保存用户计时器状态,或者只使用登录时间[计时器启动时]来保存在数据库中以及用户再次登录或恢复时,而不是使用客户端逻辑播放时,调用后端api以匹配客户端和服务器之间的偏移时间。

如果用户时间在服务器上过期,则显示您要显示的内容等。 这样做的另一种方法是减少错误机会,为最后一个计时器状态添加服务器端状态和用户端本地存储/文件存储,并可以从那里恢复并与服务器匹配以根据需要进行更正。

密钥是最后一次偏移。

答案 1 :(得分: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将是一个事件,但您也可以在该方法中执行操作。

答案 2 :(得分:1)

要从Days获取HoursMinutesSecondselapsedSeconds,您可以使用TimeSpane

像这样:

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