- Home /
Timer run in background ?
Can i run timer in background. When i minimize game then my timer should be works continue can i do ?
I was try Application.runInBackground=true;
but it can't works.
public class Counter : MonoBehaviour
{
public Text counterText;
private int counterValue;
// Use this for initialization
void Start ()
{
Application.runInBackground=true;
StartCoroutine ("StartCounter");
}
IEnumerator StartCounter ()
{
yield return new WaitForSeconds (1f);
counterText.text = "Counter : " + counterValue.ToString ();
counterValue++;
StartCoroutine ("StartCounter");
}
}
Answer by sudhir_kotila · Feb 19, 2015 at 06:54 AM
I have found answer of my question.
NOTE : THIS CODE WORKS FOR ANDROID AND IOS BOTH (FOR IOS MUST REQUIRED UNITY 4.6.1 OR ABOVE)
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
public class Counter : MonoBehaviour
{
public Text counterText, pauseText, resumeText, msgText;
private int counterValue, focusCounter, pauseCounter;
private DateTime lastMinimize;
private double minimizedSeconds;
void OnApplicationPause (bool isGamePause)
{
if (isGamePause) {
pauseCounter++;
pauseText.text = "Paused : " + pauseCounter;
GoToMinimize ();
}
}
void OnApplicationFocus (bool isGameFocus)
{
if (isGameFocus) {
focusCounter++;
resumeText.text = "Focused : " + focusCounter;
GoToMaximize ();
}
}
// Use this for initialization
void Start ()
{
StartCoroutine ("StartCounter");
Application.runInBackground = true;
}
IEnumerator StartCounter ()
{
yield return new WaitForSeconds (1f);
counterText.text = "Counter : " + counterValue.ToString ();
counterValue++;
StartCoroutine ("StartCounter");
}
public void GoToMinimize ()
{
lastMinimize = DateTime.Now;
}
public void GoToMaximize ()
{
if (focusCounter >= 2) {
minimizedSeconds = (DateTime.Now - lastMinimize).TotalSeconds;
msgText.text = "Total Minimized Seconds : " + minimizedSeconds.ToString ();
counterValue += (Int32)minimizedSeconds;
}
}
}
Why the focusCounter on line55? [`if (focusCounter >= 2) {`]
Why would you want the app to recalculate its counter only after the second time it is refocused?
Ah! I think I worked it out... I'm guessing that the first time the app is focused is on initial load.
Take care with OnApplicationPause and OnApplicationFocus. You should normally work with OnApplicationPause status. The Documentations https://docs.unity3d.com/ScriptReference/$$anonymous$$onoBehaviour.OnApplicationPause.html says: "On Android, when the on-screen keyboard is enabled, it causes a OnApplicationFocus(false) event. Additionally, if you press "Home" at the moment the keyboard is enabled, the OnApplicationFocus() event is not called, but OnApplicationPause() is called ins$$anonymous$$d."
In the documentation link, there is an example to workaround the dangerous part with Focus and Pause.
Answer by zharik86 · Feb 18, 2015 at 07:21 AM
Coroutines run in the same thread as your function Update(). If you use target platform as Android, you could build a plugin. Or use OnApplicationPause and calculate the time passed in the application and do whatever it is you were wanting to do in the time frame between.
void OnApplicationPause(bool paused) {
if(paused) {
//Save the time
} else {
//Recalculate the time
}
}
I hope that it will help you.
Answer by elmar1028 · Feb 18, 2015 at 06:53 AM
If you want your game to run in background constantly I would suggest you to go to Player Settings and make sure "Run in Background" is checked.
Elmar1028 > I am try that through coding but not works. have you any other way for do this?
Note: this works with Standalone, Blackberry, Windows App, and WebGL settings, but not Android, iPhone, or Windows 8 Phone.
Your answer
Follow this Question
Related Questions
[closed]how to match boxcollider2d size with image after preserv aspect? 4 Answers
How to get Profiler window into my project? 1 Answer
Ignore(absorb) Raycast on Canvas in mobile 1 Answer
xcode linker error 0 Answers
Screen record in unity3d 7 Answers