How to loop a function for a limited time

using System.Collections;
using UnityEngine;
using System;

public class Timer : MonoBehaviour
{
    private bool doReturn = true;
    public bool Ability(Action action, float time, string key,bool DoLoop)
    {
        if (Input.GetKeyDown(key)&&!DoLoop)
        {
            doReturn = true;
            StartCoroutine(LateCall(time, action, DoLoop));
        }
        else if(Input.GetKeyDown(key) &&DoLoop)
        {


            //HERE IS THE PIECE OF CODE THATS MISSING!!!!


        }
        return doReturn;    
    }
    private IEnumerator LateCall(float Duration, Action action,bool DoLoop)
    {
        action();
        yield return new WaitForSeconds(Duration);
        doReturn = false;
    }
}

The basic usage of this code is to do an “ability” in my case call a function for a limited time, and some “abilities” need to be continuous or in this case the function needs to be looped for a time, I wanna keep the code as simple as possible.

The thing i can’t seem to find is how to loop an Action for a limited amount of time, also invoke didn’t seem to work.
The functions I’m using are in another class, the whole reason behind that is so I could make this a more universal script.

I’m not sure if I understand exactly what your code needs to do. But if what I’m guessing is right, this is how I would solve this problem. All you need to do is call StartLoop once, and it will take care of the rest. It may take a bit more work to fit into your code, but I think it’s the simplest solution.

The condition for the loop could easily be changed to something other than time, or time and some other condition.

public float loopDuration = 2.0f; //How long the loop lasts in seconds
private float time = 0.0f;

void StartLoop() {
  StartCoroutine(DoLoop());
}

IEnumerator DoLoop() {

  do {
   
    //Your code goes here

    time += Time.deltaTime;
    yield return new WaitForEndOfFrame();
  } while (time < loopDuration); 

  time = 0.0f;

}