当前位置:   article > 正文

【unity知识点】Unity 协程/携程Coroutine_unity携程

unity携程

前言

Unity 协程是一种特殊的函数,可以在游戏中实现延迟执行、按顺序执行和异步操作等功能。它使用了迭代器(Iterator)的概念,通过 yield 关键字来控制执行流程。下面是 Unity 协程的使用和使用场景的详细介绍。

使用协程的步骤:

  1. 在脚本中定义一个协程方法,返回值类型为 IEnumerator
  2. 在协程方法内部使用 yield 关键字来控制执行流程。
  3. 通过调用 StartCoroutine 方法来启动协程。

使用场景示例:

  1. 延迟执行

    IEnumerator DelayedAction()
    {
        yield return new WaitForSeconds(2.0f); // 等待2秒
        Debug.Log("Delayed action executed after 2 seconds");
    }
    
    void Start()
    {
        StartCoroutine(DelayedAction());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上述示例中,协程 DelayedAction 会在等待 2 秒后执行延迟操作。

  2. 按顺序执行:

    IEnumerator SequentialActions()
    {
        Debug.Log("Action 1");
        yield return new WaitForSeconds(1.0f); // 等待1秒
        Debug.Log("Action 2");
        yield return new WaitForSeconds(2.0f); // 等待2秒
        Debug.Log("Action 3");
    }
    
    void Start()
    {
        StartCoroutine(SequentialActions());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上述示例中,协程 SequentialActions 会按顺序执行三个动作,并在每个动作之间等待指定的时间。

  3. 异步操作:

    IEnumerator AsyncOperation()
    {
        AsyncOperation asyncOp = SceneManager.LoadSceneAsync("NextScene");
        asyncOp.allowSceneActivation = false; // 禁止自动切换场景
    
        while (!asyncOp.isDone)
        {
            float progress = Mathf.Clamp01(asyncOp.progress / 0.9f); // 获取加载进度(注意:进度在 0.9 时切换场景)
            Debug.Log("Loading progress: " + (progress * 100) + "%");
    
            if (progress >= 0.9f)
            {
                asyncOp.allowSceneActivation = true; // 允许切换场景
            }
    
            yield return null;
        }
    }
    
    void Start()
    {
        StartCoroutine(AsyncOperation());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在上述示例中,协程 AsyncOperation 会异步加载场景,并打印加载进度。在加载进度达到 0.9 时,允许切换场景。

Unity 协程的使用场景非常广泛,可以用于实现动画效果、延迟操作、按顺序执行多个任务、异步加载资源等。它提供了一种简洁、易于理解和管理的方式来处理需要延迟或异步执行的逻辑。

yield return new WaitForSeconds和yield return new WaitForFixedUpdate的区别

yield return new WaitForSecondsyield return new WaitForFixedUpdate 是用于控制协程执行的两种不同方式,它们的使用场景和效果有所不同。

  1. yield return new WaitForSeconds

    • 用法:这个语句用于在协程中等待一定的时间间隔后再继续执行后续代码。
    • 示例用法:
      IEnumerator MyCoroutine()
      {
          Debug.Log("Start");
          yield return new WaitForSeconds(2.0f); // 等待2秒
          Debug.Log("After 2 seconds");
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 效果:在上述示例中,协程会在执行到yield return new WaitForSeconds(2.0f)时暂停 2 秒,然后再继续执行后续代码。
  2. yield return new WaitForFixedUpdate

    • 用法:这个语句用于在协程中等待下一帧更新后再继续执行后续代码。
    • 示例用法:
      IEnumerator MyCoroutine()
      {
          Debug.Log("Start");
          yield return new WaitForFixedUpdate(); // 等待下一帧更新
          Debug.Log("After FixedUpdate");
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 效果:在上述示例中,协程会在执行到yield return new WaitForFixedUpdate()时等待当前帧更新结束,然后再继续执行后续代码。

总结来说,yield return new WaitForSeconds 用于在协程中控制时间间隔,而 yield return new WaitForFixedUpdate 用于等待下一帧更新。你可以根据实际需求选择合适的等待方式,来实现协程中的逻辑控制。

开始和停止携程

# 开始协程:
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());

# 停止协程:
StopCoroutine(myCoroutine);

# 停止名为 "Start" 的协程
StopCoroutine("Start");

# 停止当前对象上所有正在运行的协程
StopAllCoroutines();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/235922
推荐阅读
相关标签
  

闽ICP备14008679号