unity 延迟等待执行

本文介绍了如何在Unity中封装延迟执行的方法,使得代码更优雅、使用更方便。通过创建静态工具类,提供简单的延迟执行接口。延迟执行适用于等待特效完成等场景,可以使用StopCoroutine停止携程。如果需要全局延迟执行,可以挂载到持久存在的 GameObject 上。作者提倡使用 . 语法提高代码可读性,并欢迎分享更好的延迟执行方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于unity延迟执行网上也有很多了,我这里只是封装下,让写代码变得更加优雅,使用更加方便。
一个问题想要表述清楚,读者也能看明白,无非3个点:What(要说的是什么),How(怎么用你这个东西?什么情况下有用?),Why(为什么要这么做,这么做有啥好处?我不这么用可以不可以?等等)
首先来看 what,直接上代码了

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

public static class StaticUtils
{
     public static Coroutine DelayToDo(this MonoBehaviour mono, float delayTime, Action action, bool ignoreTimeScale = false)
    {
        Coroutine coroutine = null;
        if (ignoreTimeScale)
        {
            coroutine = mono.StartCoroutine(DelayIgnoreTimeToDo(delayTime, action));
        }
        else
        {
            coroutine = mono.StartCoroutine(DelayToInvokeDo(delayTime, action));

        }
        return coroutine;
    }

    public static IEnumerator DelayToInvokeDo(float delaySeconds, Action action)
    {
        yield return new WaitForSeconds(delaySeconds);
        action();
    }

    public static IEnumerator DelayIgnoreTimeToDo(float delaySeconds, Action action)
    {
        float start = Time.realtimeSinceStartup;
        while (Time.realtimeSinceStartup < start + delaySeconds)
        {
            yield return null;
        }
        action();
    }

    public static bool IsNullOrEntry(this string str)
    {
        return String.IsNullOrEmpty(str);
    }
}

代码也有注释,应该很清楚了,,,这里要创建一个static的类,这样的类也算是一个工程中必要的工具类了吧,可以添加自己的扩展工具方法,使自己的代码写的更加流畅,,,嗯,(代码最后送大家一个函数,怎么用呢?平时我们判断一个字符串是null还是“”,怎么判断的呢,每次都要string.IsNullOrEmpty(str),巨麻烦,现在你只用str.IsNullOrEmpty(),代码书写起来流畅无打断,是不是很安逸)
好吧,回归正题,如何用(How)?
用就很简单了,在继承了MonoBehaviour的脚本方法里,直接:

  this.DelayToDo(1.0f, () =>
        {
           //要搞的事情
        });

有哪些使用的场景(情况)的呢?
如要等一个特效完了,才显示界面等,反正就是各种等待都行。

这里DelayToDo返回了Coroutine ,所以要停止携程也很简单 调用StopCoroutine(coroutine ),传入刚的返回就行了。因为使用的是协程,所以他的生命周期和所挂脚本的gameobjtect是一致的,如果销毁或隐藏了gameobject,该延迟就会停止执行。
如果要使用全局的(无论一个界面还是物体被销毁或隐藏了该延时执行都要继续进行下去)的话,你可以建一个一直的存在的物体挂一个脚本,用这个脚本去调用上面DelayToDo。还有一种方便的方式是,如果你的项目中使用Dotween的话,可以使用:

  DOVirtual.DelayedCall(1.0f, () =>
        {
            //要搞的事情
        });

最后,来说各种Why,
这么做有啥好处?
好处是,写代码方便,提高效率,延迟执行一句代码搞定,能使用 . 的就使用 . 。这样代码看起来也简洁很多。
我不这么做行不行?我有更好的方法?
可以,当然可以。。那个,如果你有好的方法方式,还请留言给出,大家一起交流。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值