Simple timer using InvokeRepeating
I have tried making a simple timer script that uses Invoke, and more recently, InvokeRepeating. It seems simple enough, but I'm having an issue where it will blast through the first 10 seconds, calling Tick() in rapid succession.
Here is my current code.
public class TimerBehavior : MonoBehaviour {
public delegate void TickDelegate(int secondsRemaining);
public TickDelegate OnTick;
public delegate void CompleteDelegate();
public CompleteDelegate OnComplete;
int secondsRemaining = 0;
public void Go(int seconds){
secondsRemaining = seconds;
InvokeRepeating("Tick", 0, 1f);
}
void Tick(){
if (OnTick != null) { OnTick (secondsRemaining); }
if (secondsRemaining > 0) {
secondsRemaining--;
}
if(secondsRemaining == 0){
if(OnComplete != null){ OnComplete(); }
Stop ();
}
}
public void Stop(){
CancelInvoke ("Tick");
}
}
For simplicity-sake, ignore the fact that there will be issues if Go() is called while the timer is already ticking.
Is there anything blatantly wrong with this code?
Answer by iamrahulmaurya · Jul 02, 2016 at 02:44 PM
@pixel_fiend Bro,Try this https://www.youtube.com/watch?v=NpJ-S_RxzrQ∈dex=4&list=PLTm4FjoXO7nedF_AHxqgjgtxq1Ktl9ViK
In this it is using Coroutine but you can figure it out easily for InvokeRepeating
Note that InvokeRepeating is also independent of the GameObject's Update() method, and will continue to be invoked even if the object is disabled.
Answer by Dibbie · Jul 02, 2016 at 03:26 AM
Your code look fine to me, youd want to run "CancelInvoke" in your "Tick" if Update is calling "Go" or any other function or loop that happens more than once... If Start or a function that is only ever really called once calls "Go" then you shouldnt have any problems at all initially.
Your answer
Follow this Question
Related Questions
Getting a timer to go to 0 1 Answer
Countdown timer... 2 Answers
I need a "loop" timer that disables a action until the timer resets. 0 Answers
Set a delay for firing 0 Answers