学习笔记:unity中Invoke&协程Coroutine用法入门&延时执行某段代码

直接上例子:
在这里插入图片描述
创建一个cube,挂载CubeController脚本
CubeController代码:

public class CubeController : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("time:" + Time.time);
            changeColor();
        }
    }

    public void changeColor() 
    {
        transform.GetComponent<Renderer>().material.color = Color.red;
        Debug.Log("time:" + Time.time);
    }
}

逻辑是:按下鼠标左键时,控制台输出游戏运行时间,cube的颜色变成红色,再输出一次时间。
运行一下:
在这里插入图片描述
即,我在游戏3.15秒的时候,按下了鼠标左键,把cube变成了红色。

那么如果说,我想实现:点击鼠标左键两秒之后cube才变红,如何实现呢?

在这种情况下,可以使用Invoke方法和协程去做。

Invoke方法

public class CubeController : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("time:" + Time.time);
            Invoke("changeColor", 2f);
        }
    }

    public void changeColor() 
    {
        transform.GetComponent<Renderer>().material.color = Color.red;
        Debug.Log("time:" + Time.time);
    }
}

调用changeColor()时,用Invoke(string 方法名,float 延迟时间),实现了方法在time这段时间后调用。这里延迟时间我给的实参是2f。
运行一下:
在这里插入图片描述
即在1.91s点击鼠标,然后3.90秒变色了。
可以看到,两次输出的time相差约2秒。因为帧率的原因,这个时间只能做到大约准确。
注意【取自网络】:
1 :它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;
2:Invoke(); 只能调用无参方法,因为invoke()形参只有方法名。
3:在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用到;

另外:
还有个InvokeRepeating方法
InvokeRepeating(string 方法名,float 第一次延迟时间,间隔时间)

InvokeRepeating("changeColor", 2f,4f);

即,第一次在两秒后调用,然后每隔四秒调用一次。

协程Coroutine

public class CubeController : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("time:" + Time.time);
            StartCoroutine(changeColorWait());
        }
    }
    public void changeColor() 
    {
        transform.GetComponent<Renderer>().material.color = Color.red;
        Debug.Log("time:" + Time.time);
    }
    IEnumerator changeColorWait() 
    {
        yield return new WaitForSeconds(2f);
        changeColor();
    }
}

区别最开始的代码,多了一个迭代器IEnumerator changeColorWait()
yield return new WaitForSeconds(2f);//等待2秒
其实是等待 2f*Time.timeScale,timescale默认是1,如果timescale变了,也要考虑更改WaitForSeconds的参数。
然后用StartCoroutine方法去调用迭代器changeColorWait,实现了等待2s的功能。
运行一下:
在这里插入图片描述
即在1.48s点击鼠标,然后3.48秒变色了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值