- Home /
How do I replace Invoke Repeating to allow a repeat rate change
I am making a matching game like simon. I currently have everything working, and I am using Invoke Repeating in the start method to call my display method to change the click objects
void Start ()
{
ResetGame();
InvokeRepeating("Display", 2, repeatInterval);
}
ResetGame setting the game state to the beginning
then Update simply calls a method to make the first light, and change the state to diplay that the repeating Display function is looking for.
void Update ()
{
if (currentState == Ready)
{
Add();
}
}
Now what I would like to do is be able to change the repeat interval variable when certain conditions are met, but when I change this variable with code there is no increase in speed, I assume do to everything being setup at Start and never called again.
I have tried moving the call to update but it gets called so often the game becomes unplayable fast.
How/Where would I make my display(0 function call to get it to repeat in the same manner as Invoke repeating , but allow the repeatrate (repeatInterval) to be changed when conditions are met?
Thanks for your help in advance
Answer by Loius · May 04, 2013 at 05:50 PM
This is just off the top of my head so there might be silly things I missed.
Essentially you've got to ask constantly 'is this function ready to run? if it is, run it and reset its timer' and you also need a way to change its timer:
using System.Collections.Generic;
class MyRepeater {
public delegate void RepeaterFunction();
public RepeaterFunction function;
public float timer;
public float repeatTime;
public MyRepeater(RepeaterFunction f, float time) {
if ( null == repeaters ) repeaters = new ...;
repeaters.Add(f, this); // haha
repeatTime = time;
}
public static Dictionary<RepeaterFunction,MyRepeater> repeaters;
}
void Start() {
MyRepeater repeater = new MyRepeater(TheFunction, 1.0f);
}
void TheFunction() {
Debug.Log("Called function");
}
void Update() {
foreach(MyRepeater mr in MyRepeater.repeaters.Values) {
mr.timer-= Time.deltaTime;
if ( mr.timer <= 0 ) {
mr.function();
mr.timer = mr.repeatTime;
}
}
}
void ChangeTime(MyRepeater.RepeaterFunction function, float newTime) {
MyRepeater.repeaters[function].repeatTime = newTime;
}
Your answer
Follow this Question
Related Questions
Initialising List array for use in a custom Editor 1 Answer
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Using InvokeRepeating in the Update method? 2 Answers
Update and Awake not being called. 1 Answer