C# 游戏结束后如何继续倒计时?
我想做一个计时器,重置商家的商品价格和数量 像许多android游戏一样,当不玩游戏时,计时器会继续下降。 当您不玩游戏时,计时器应继续倒计时。 游戏结束后如何保持倒计时 下面是我的倒计时C# 游戏结束后如何继续倒计时?,c#,android,unity3d,timer,C#,Android,Unity3d,Timer,我想做一个计时器,重置商家的商品价格和数量 像许多android游戏一样,当不玩游戏时,计时器会继续下降。 当您不玩游戏时,计时器应继续倒计时。 游戏结束后如何保持倒计时 下面是我的倒计时 using UnityEngine; using System.Collections; using UnityEngine.UI; public class margaretSellTimer : MonoBehaviour { public Text TimerText; public
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 ();
}
}
使用UnityEngine;
使用系统集合;
使用UnityEngine.UI;
公共课margaretSellTimer:单一行为{
公共文本TimerText;
公共字符串dy;
公众浮动日;
公众游船时间;
公众花车记录;
公众浮标秒;
InitMerchantMorgaret initMerchants;
玩家;
//用于初始化
无效开始(){
initMerchants=GameObject.FindGameObjectWithTag(“initMerchant”).GetComponent();
Player=GameObject.FindGameObjectWithTag(“Player”).GetComponent();
start例程(Wait());
}
//每帧调用一次更新
无效更新(){
如果(天数==1){
dy=“日”;
}否则,如果(天数>1){
dy=“天”;
}否则{
dy=“日”;
}
如果(秒<10)
{
TimerText.text=(天+“”+dy+小时+”:“+分钟+”:0“+秒);
}
如果(秒>9)
{
TimerText.text=(天+“”+dy+小时+”:“+分钟+”:“+秒);
}
}
公共空间倒计时()
{
如果(秒0){
最小分钟();
秒=60;
}
}
如果(第0分钟){
小时数();
分钟=59;
秒=60;
}
}
若有(0小时){
天数();
小时=23;
分钟=59;
秒=60;
}
}
如果(分钟>=0)
{
毫秒();
}
如果(小时而不是使用客户端逻辑,请使用服务器端状态和DB保存用户计时器状态,或者您只需使用登录时间[计时器开始的位置]保存在DB中,当用户再次登录或恢复播放时,调用后端api以匹配客户端和服务器时间之间的偏移时间
若服务器上的用户时间已过期,则显示您想要显示的内容,依此类推。
另一种方法是为了减少错误机会,为计时器的最后一个状态添加服务器端状态和用户端本地存储/文件存储,并可以从那里恢复,并根据需要与服务器匹配以进行更正
关键是上次时间偏移。不要使用客户端逻辑,而是使用服务器端状态和DB保存用户计时器状态,或者您只需使用登录时间[计时器开始的位置]保存在DB中,当用户再次登录或恢复播放时,调用后端api以匹配客户端和服务器时间之间的偏移时间
若服务器上的用户时间已过期,则显示您想要显示的内容,依此类推。
另一种方法是为了减少错误机会,为计时器的最后一个状态添加服务器端状态和用户端本地存储/文件存储,并可以从那里恢复,并根据需要与服务器匹配以进行更正
键是上次时间偏移量。在用户离开会话时获取UNIX时间戳,并通过PlayerPrefs将其存储在设备上
当用户返回时,从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将是一个事件,但您也可以在该方法中执行操作。在用户离开会话时获取UNIX时间戳,并通过PlayerPrefs将其存储在设备上
当用户返回时,从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将是一个事件,但您也可以在该方法中执行操作。要从elapsedSeconds
获得天
、小时
、分钟
和秒
,您可以使用
像这样:
TimeSpan interval = TimeSpan.FromSeconds(elapsedSeconds);
days = interval.Days;
hours = interval.Hours;
minutes = interval.Minutes; // etc
要从elapsedSeconds
获取天
、小时
、分钟
和秒
,可以使用
像这样:
TimeSpan interval = TimeSpan.FromSeconds(elapsedSeconds);
days = interval.Days;
hours = interval.Hours;
minutes = interval.Minutes; // etc
退出游戏时保存状态,而不是继续计时。然后,当游戏再次开始时,计算保存状态与当前时间之间的偏移量,并从此处继续计时。^这是一个很好的解决方案。但我想如果目的是在某个时间后发送推送通知,则可能需要创建background服务使用本机android代码或某些第三方插件。看在上帝的份上…只需使用Invoke。退出游戏时,保存状态,而不是继续计时。然后当游戏再次启动时,计算保存状态与当前时间之间的偏移量,并从那里继续计时。^这是一个好的解决方案。但是我猜猜如果目的是在某个时间后发送推送通知,那么可能需要使用本机android代码或某些第三方插件创建后台服务。看在上帝的份上……只需使用Invoke。这很好,但在我上面的代码中,如何将elapsedseconds转换为小时、分钟和秒?@DennisLiu检查我的答案,你会发现如果不想转换为几分钟或几秒钟,它就更复杂了。考虑到你想检查2H是否已经通过,1H37 M23已经通过了,你如何检查这两个小时?以秒为单位,检查是否超过7200。这很好,但是在我上面的代码中,如何转换秒到小时、分钟和秒?@丹尼斯利检查我的答案。如果你不想转换为几分钟或几秒,它会变得更复杂。