前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity2D游戏开发-延迟执行的方式

Unity2D游戏开发-延迟执行的方式

作者头像
码客说
发布2023-08-08 13:03:31
5040
发布2023-08-08 13:03:31
举报
文章被收录于专栏:码客

使用协程(Coroutines)

示例

协程可以将一个方法转换为多个帧执行,yield return可以将其拆分成多段执行。

使用yield return可以将一个方法拆分成多段执行,非常适合用于过场动画、顺序执行多个过程等。

代码语言:javascript
复制
private void ShowShootAnimi()
{
	_animator.SetBool(AnimUtils.IsShoot, true);
}

private IEnumerator HideShootAnimi()
{
    yield return new WaitForSeconds(1);
    // 这里的代码会在1秒后执行
    _animator.SetBool(AnimUtils.IsShoot, false);
}

public void Shoot() {
	StartCoroutine(HideShootAnimi()); 
}

yield return

在 Unity 中,yield return 关键字用于实现协程,它可以将一个方法拆分成多段执行。

yield return 的常见用法有:

暂停一帧

让协程暂停一帧后继续执行。

代码语言:javascript
复制
yield return null;

暂停固定帧间隔

固定帧更新(Fixed Update) 的频率默认是 0.02 秒一次,不受场景渲染性能影响。

跟上面的区别在于,如果游戏是60帧,如果电脑性能差的话,可能只能达到30帧,那么上面的方法的延迟就是1/30,而给方法不受影响依旧是1/60。

代码语言:javascript
复制
yield return new WaitForFixedUpdate();

暂停数秒

让协程暂停指定秒数后继续执行。

代码语言:javascript
复制
yield return new WaitForSeconds(2f);

暂停到指定时间

让协程暂停到指定时间后继续执行。

代码语言:javascript
复制
yield return new WaitUntil(() => player.IsDead);

或者

代码语言:javascript
复制
yield return new WaitUntil(() => Time.time >= waitTime);

启动一个协程

启动一个协程作为子程序运行,子程序运行后在继续。

代码语言:javascript
复制
yield return StartCoroutine(LoadScene());

多个协程并行执行

代码语言:javascript
复制
IEnumerator Main() {
  yield return StartCoroutine(Coroutine1());
  yield return StartCoroutine(Coroutine2()); 
}

Coroutine1 和 Coroutine2 两个协程会并行执行,而 Main 协程处于暂停状态。

当 Coroutine1 和 Coroutine2 都执行完毕后,Main 协程才会继续往下执行。

网络请求后运行

yield return www: 用于异步网络请求,请求完成后继续执行。

代码语言:javascript
复制
WWW www = new WWW("https://www.psvmc.cn");
yield return www;

立即结束协程的执行

代码语言:javascript
复制
yield break;

总结起来,yield return 的作用是将协程分割成多个部分,控制协程的执行顺序和节奏。 使用它可以实现很多有用的效果,如时间延迟、等待资源加载等

使用Invoke方法

Invoke可以在指定的时间后调用一个方法。

Invoke方法使用简单,通过一个方法就可以轻松实现延迟调用,所以也很常用。

代码语言:javascript
复制
private void ShowShootAnimi()
{
    _animator.SetBool(AnimUtils.IsShoot, true);
}

private void HideShootAnimi()
{
    _animator.SetBool(AnimUtils.IsShoot, false);
}

public void Shoot()
{
    ShowShootAnimi();
    Invoke(nameof(HideShootAnimi), 1);
}

使用延迟帧计时器

通过Time.deltaTime计时,当累积时间超过延迟时间时执行代码。

如果要精确控制延迟的时机,帧计时器会更灵活。

代码语言:javascript
复制
float elapsedTime = 0; 

void Update() {
  elapsedTime += Time.deltaTime;

  if(elapsedTime >= 2) {
    // 2秒后执行的代码
  
    elapsedTime = 0; 
  }
}

使用线程睡眠

使用Thread.Sleep可以使当前线程睡眠指定时间。

线程睡眠会 Block 当前线程,通常只在需要完全阻塞执行流程的时候使用。

一般不推荐使用。

代码语言:javascript
复制
void DelayedFunction() {
  Thread.Sleep(2000); 
  // 线程睡眠2秒后继续执行
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用协程(Coroutines)
    • 示例
      • yield return
        • 暂停一帧
        • 暂停固定帧间隔
        • 暂停数秒
        • 暂停到指定时间
        • 启动一个协程
        • 网络请求后运行
        • 立即结束协程的执行
    • 使用Invoke方法
    • 使用延迟帧计时器
    • 使用线程睡眠
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档