Subtracting a time difference from an int?
Hey! I have a question, I have been trying to make a timer that keeps going down while the application is closed (using System.DateTime) here is my script.
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
public class Craft : MonoBehaviour {
DateTime currentDate;
DateTime oldDate;
public float tinpaneltimer;
public bool tinpaneltimerOn = false;
public string saveLocation;
public static Craft instance;
public Text CraftSteelButtonText;
public Text CraftElectrumButtonText;
public Text CraftTinPanelButtonText;
public int Iron;
public int Coal;
public int Steel;
public int Silver;
public int GoldOre;
public int Electrum;
public int Diff;
public int Tin;
public int TinPanel;
public int XP;
public int XPCap;
public int Level;
public int XPCapMulitplier;
public Text SteelAmount;
public Text ElectrumAmount;
public Text TinPanelAmount;
public Text SlotSteelText;
public Text SlotElectrumText;
public Text SlotTinPanelText;
public bool CraftSteelOn = false;
public bool CraftElectrumOn = false;
public bool CraftTinPanelOn = false;
public Button CraftSteelButton;
public Image CraftSteelButtonImage;
public Image CraftSteelButtonImageRight;
public Button CraftElectrumButton;
public Image CraftElectrumButtonImage;
public Image CraftElectrumButtonImageRight;
public Button CraftTinPanelButton;
public Image CraftTinPanelButtonImage;
public Image CraftTinPanelButtonImageRight;
public Image Panel1;
public Image Panel2;
public Image Panel3;
public Image LevelBar;
public AudioSource Audio;
void Start()
{
CheckDate ();
if (tinpaneltimer == 0) {
tinpaneltimer = 120;
}
if (tinpaneltimerOn == true) {
tinpaneltimer -= instance.CheckDate ();
}
}
void Awake()
{
instance = this;
saveLocation = "lastSavedDate1";
}
public float CheckDate()
{
currentDate = System.DateTime.Now;
string tempString = PlayerPrefs.GetString (saveLocation, "1");
long templong = Convert.ToInt64 (tempString);
DateTime oldDate = DateTime.FromBinary (templong);
print ("Old Date: " + oldDate);
TimeSpan difference = currentDate.Subtract (oldDate);
**tinpaneltimer = (120 - difference);** //Here is where im trying to figure it out
print ("Difference: " + difference);
return (float)difference.TotalSeconds;
}
public void SaveDate()
{
PlayerPrefs.SetString (saveLocation, System.DateTime.Now.ToBinary ().ToString ());
print ("Saving this date to player prefs: " + System.DateTime.Now);
}
public void ExitButton()
{
Panel1.gameObject.SetActive (false);
Panel2.gameObject.SetActive (false);
Panel3.gameObject.SetActive (false);
LevelBar.gameObject.SetActive (true);
}
public void ClickSlot1()
{
Panel1.gameObject.SetActive (true);
LevelBar.gameObject.SetActive (false);
}
public void ClickSlot2()
{
Panel2.gameObject.SetActive (true);
LevelBar.gameObject.SetActive (false);
}
public void ClickSlot3()
{
Panel3.gameObject.SetActive (true);
LevelBar.gameObject.SetActive (false);
}
void Update()
{
if (tinpaneltimer == 0) {
StartC3 ();
}
if (tinpaneltimerOn == true) {
CheckDate ();
tinpaneltimer -= Time.deltaTime;
}
//Maybe either have a long time for bigger items or just not and have same craft time.
SlotSteelText.text = "" + Steel;
SlotElectrumText.text = "" + Electrum;
SlotTinPanelText.text = "" + TinPanel;
if (CraftSteelOn == true) {
CraftSteelButtonImage.fillAmount += 1f / 2f * Time.deltaTime;
CraftSteelButtonImageRight.fillAmount += 1f / 2f * Time.deltaTime;
}
if (CraftElectrumOn == true) {
CraftElectrumButtonImage.fillAmount += 1f / 2f * Time.deltaTime;
CraftElectrumButtonImageRight.fillAmount += 1f / 2f * Time.deltaTime;
}
if (CraftTinPanelOn == true) {
CraftTinPanelButtonImage.fillAmount += 1f / (120 - tinpaneltimer) * Time.deltaTime;
CraftTinPanelButtonImageRight.fillAmount += 1f / (120 - tinpaneltimer) * Time.deltaTime;
}
//Store Date.Time when you start the craft and keep checking it until the subtraction is equal to variable
SteelAmount.text = "" + Steel;
ElectrumAmount.text = "" + Electrum;
TinPanelAmount.text = "" + TinPanel;
XP = PlayerPrefs.GetInt ("XP");
XPCap = PlayerPrefs.GetInt ("XPCap");
Level = PlayerPrefs.GetInt ("Level");
XPCapMulitplier = PlayerPrefs.GetInt ("XPCapMultiplier");
Iron = PlayerPrefs.GetInt ("Iron");
Coal = PlayerPrefs.GetInt ("Coal");
Steel = PlayerPrefs.GetInt ("Steel");
Silver = PlayerPrefs.GetInt ("Silver");
GoldOre = PlayerPrefs.GetInt ("GoldOre");
Electrum = PlayerPrefs.GetInt ("Electrum");
TinPanel = PlayerPrefs.GetInt ("TinPanel");
Tin = PlayerPrefs.GetInt ("Tin");
}
public void CraftSteel()
{
if (Iron >= 1 && Coal >= 1) {
Audio.Play ();
CraftSteelOn = true;
XP = XP + 20;
PlayerPrefs.SetInt ("Level", Level);
PlayerPrefs.SetInt ("XPCap", XPCap);
PlayerPrefs.SetInt("XP", XP);
PlayerPrefs.SetInt ("XPCapMultiplier", XPCapMulitplier);
StartC ();
}
if (Iron <= 1 || Coal <= 1) {
CraftSteelButtonText.text = "CANT AFFORD";
}
}
public void CraftElectrum()
{
if (Silver >= 1 && GoldOre >= 1) {
Audio.Play ();
CraftElectrumOn = true;
XP = XP + 20;
PlayerPrefs.SetInt ("Level", Level);
PlayerPrefs.SetInt ("XPCap", XPCap);
PlayerPrefs.SetInt("XP", XP);
PlayerPrefs.SetInt ("XPCapMultiplier", XPCapMulitplier);
StartC2 ();
}
if (Silver <= 1 || GoldOre <= 1) {
CraftElectrumButtonText.text = "CANT AFFORD";
}
}
public void CraftTinPanel()
{
if (Tin >= 4) {
SaveDate ();
tinpaneltimerOn = true;
Audio.Play ();
CraftTinPanelOn = true;
XP = XP + 13;
PlayerPrefs.SetInt ("Level", Level);
PlayerPrefs.SetInt ("XPCap", XPCap);
PlayerPrefs.SetInt("XP", XP);
PlayerPrefs.SetInt ("XPCapMultiplier", XPCapMulitplier);
}
if (Tin <= 4) {
CraftTinPanelButtonText.text = "CANT AFFORD";
}
}
public IEnumerator WaitForView()
{
CraftSteelButtonText.text = "CRAFTED";
CraftSteelButton.interactable = false;
yield return new WaitForSeconds (2f);
PlayerPrefs.SetInt ("Iron", PlayerPrefs.GetInt ("Iron") - 1);
PlayerPrefs.SetInt ("Coal", PlayerPrefs.GetInt ("Coal") - 1);
PlayerPrefs.SetInt ("Steel", PlayerPrefs.GetInt ("Steel") + 1);
CraftSteelOn = false;
CraftSteelButtonImage.fillAmount = 0;
CraftSteelButtonImageRight.fillAmount = 0;
CraftSteelButton.interactable = true;
CraftSteelButtonText.text = "CRAFT";
}
public IEnumerator WaitForView2()
{
CraftElectrumButtonText.text = "CRAFTED";
CraftElectrumButton.interactable = false;
yield return new WaitForSeconds (2f);
PlayerPrefs.SetInt ("Silver", PlayerPrefs.GetInt ("Silver") - 1);
PlayerPrefs.SetInt ("GoldOre", PlayerPrefs.GetInt ("GoldOre") - 1);
PlayerPrefs.SetInt ("Electrum", PlayerPrefs.GetInt ("Electrum") + 1);
CraftElectrumOn = false;
CraftElectrumButtonImage.fillAmount = 0;
CraftElectrumButtonImageRight.fillAmount = 0;
CraftElectrumButton.interactable = true;
CraftElectrumButtonText.text = "CRAFT";
}
public IEnumerator WaitForView3()
{
CraftTinPanelButtonText.text = "CRAFTED";
yield return new WaitForSeconds (1f);
CraftTinPanelButton.interactable = false;
PlayerPrefs.SetInt ("Tin", PlayerPrefs.GetInt ("Tin") - 4);
PlayerPrefs.SetInt ("TinPanel", PlayerPrefs.GetInt ("TinPanel") + 1);
tinpaneltimer = 120;
CraftTinPanelOn = false;
tinpaneltimerOn = false;
CraftTinPanelButtonImage.fillAmount = 0;
CraftTinPanelButtonImageRight.fillAmount = 0;
CraftTinPanelButton.interactable = true;
CraftTinPanelButtonText.text = "CRAFT";
}
void StartC()
{
StartCoroutine (WaitForView ());
}
void StartC2()
{
StartCoroutine (WaitForView2 ());
}
void StartC3()
{
StartCoroutine (WaitForView3 ());
}
}
Ok so the "**" show where the problem is and I know that that line will return the error "Operator "-" cant be used on operants "int" and "timespan" I'm trying to figure out a way to subtract the TimeSpan difference between the (oldDate and the currentDate) and a int. If you now how to do this please leave a comment! Maybe it has something to do with Converting it to an Int but i dont know how to.
Answer by nu-assets · Aug 13, 2016 at 11:04 AM
The TimeSpan struct has no operators overloaded for numeric types.
You can solve this either this way:
TimeSpan dt = TimeSpan.FromSeconds(120) - difference;
float tinpaneltimer = (float)dt.TotalSeconds;
or this way:
float tinpaneltimer = (float)(120 - difference.TotalSeconds);
Provided that tinpaneltimer
is meassured in seconds.
Yes that is perfect thank you! And yes tin panel timer is measured in seconds.
I have tried using this but it doesn't change the timer at all. I tried using both methods could you look over the script again and see if anything could be interfering?
I would recommend splitting the functionality to a separate class. This allows you to run separated unit test on the entity and of course it's reusable.
I could give you a simple example timer class. But maybe it's better to open a new question to allow others to better find it.
Well I asked a second questions already and no one has added a response but 224 people are following you can view it by going to my questions on my profile. $$anonymous$$aybe you should give the example class there so everyone can see. The question is called "Time Date timer not working" (Something like that)
Your answer
Follow this Question
Related Questions
Having trouble converting this int to string, can someone help? 0 Answers
Convert "Double" to "Float" or "Int"? 1 Answer
Timespan to int total seconds 0 Answers
Cannot convert float to int? 1 Answer
reloading Greater Than or Equal To c# 0 Answers