我想制作一个可以重置商家商品价格和数量的计时器。
与许多安卓游戏一样,有些计时器在不玩游戏时会继续下降。 当您不玩游戏时,计时器应继续倒计时。 如何在游戏结束时保持倒数计时器?
以下是我的倒数计时器
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 ();
}
}
感谢。
答案 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
获取Hours
,Minutes
,Seconds
和elapsedSeconds
,您可以使用TimeSpane。
像这样:
TimeSpan interval = TimeSpan.FromSeconds(elapsedSeconds);
days = interval.Days;
hours = interval.Hours;
minutes = interval.Minutes; // etc