using UnityEngine; 
 | 
using Cysharp.Threading.Tasks; 
 | 
using System; 
 | 
  
 | 
public static class UniTaskExtension 
 | 
{ 
 | 
    public static void DelayFrame(this GameObject go, Action action) 
 | 
    { 
 | 
        DelayFrameInternal(1, action); 
 | 
    } 
 | 
  
 | 
    public static void DelayFrame(this Component cmp, Action action) 
 | 
    { 
 | 
        DelayFrameInternal(1, action); 
 | 
    } 
 | 
  
 | 
    private async static UniTask DelayFrameInternal(int frame, Action action) 
 | 
    { 
 | 
        await UniTask.DelayFrame(frame); 
 | 
        action?.Invoke(); 
 | 
    } 
 | 
  
 | 
    public static void DelayFrames(this Component cmp, int frames, Action action) 
 | 
    { 
 | 
        DelayFrameInternal(frames, action); 
 | 
    } 
 | 
  
 | 
    public static void DelayFrames(this GameObject go, int frames, Action action) 
 | 
    { 
 | 
        DelayFrameInternal(frames, action); 
 | 
    } 
 | 
  
 | 
    public static void DelayFrame(Action action) 
 | 
    { 
 | 
        DelayFrameInternal(1, action); 
 | 
    } 
 | 
  
 | 
    public static void DelayTime(this GameObject go, float time, Action action) 
 | 
    { 
 | 
        DelayTimeInternal(time, action); 
 | 
    } 
 | 
  
 | 
    public static void DelayTime(this Component cmp, float time, Action action) 
 | 
    { 
 | 
        DelayTimeInternal(time, action); 
 | 
    } 
 | 
  
 | 
    private async static UniTask DelayTimeInternal(float time, Action action) 
 | 
    { 
 | 
        if (time <= 0f) 
 | 
        { 
 | 
            action?.Invoke(); 
 | 
            return; 
 | 
        } 
 | 
        await UniTask.Delay(TimeSpan.FromSeconds(time)); 
 | 
        action?.Invoke(); 
 | 
    } 
 | 
} 
 |