Это делается через корутины либо через таски. Вот пример через корутину:
using System.Collections;
using UnityEngine;
public class Fire : MonoBehaviour
{
private void Start()
{
StartCoroutine(Burn(5f, 1f));
}
private IEnumerator Burn(float time, float damageInterval)
{
while (time > 0)
{
time -= damageInterval;
Debug.Log("ApplyDamage");
yield return new WaitForSeconds(damageInterval);
}
yield break;
}
}
В методе старт я стартую корутину. Сама корутина, в моем случае, будет в течение time времени писать лог через каждые damageInterval секунд. yield break нужен для того, чтобы корутина завершилась после выполнения цикла.