What other ways can i invoke my Function outside of update and start?

I’m creating a script that manages the players stats, and so far i’ve created a function that works, but if i call it in update it invokes multiple times, i cant put it in start either because it needs to check every frame for variables. Is there another way to evoke it once?
here’s my script

public float maxHealth = 100;
    public float maxStamina = 100;
    public float maxMana = 100;

    public float playerHealth = 100;
    public float playerStamina = 100;
    public float playerMana = 100;

    public bool losingStamina;
    
    


	void Update () {
        if (losingStamina == true)
        {
            CancelInvoke("regenStamina");
            

        }
        else if (playerStamina < maxStamina)
            {
            
                InvokeRepeating("regenStamina", 3f, 1.0f);
            }
        




    }
    void regenStamina()
    {
        //StamRegenDelay -= 1;
        playerStamina += 1f;
        if (playerStamina >= maxStamina)
        {
            playerStamina = maxStamina;
        }
            

    }

If you want something simpe script,

    private System.Action OnceAction { get; set; } = null;

    private void Awake()
    {
        OnceAction = RegenStamina;
    }

    private void Update()
    {
        if (OnceAction != null) OnceAction.Invoke();
    }

    private void RegenStamina()
    {
        OnceAction = null;

        //  playerStamina += 1f;
        // ...
    }

used to Update() function, another way is …

using System.Collections;
using System.Collections.Generic;

using UnityEngine;

public class Updator : MonoBehaviour
{
    public static Updator Get { get; set; } = null;

    public static void Start(IEnumerator iterator)
        => Get.list.Add(iterator);
    

    private readonly List<IEnumerator> list = new List<IEnumerator>();

    private void Awake()
        => Get = this;

    private void Update()
    {
        for (int i = 0; i < list.Count; ++i)
        {
            if (!list*.MoveNext()) list.RemoveAt(i--);*

}
}

}
Alternatively, using StartCoroutine() function is good idea …