MonoBehaviour中的协程问题

Q:1个MonoBehaviour中,只能同时运行1个协程吗(同时1词用的不准确,准确来说应该是:1个MonoBehavior的1帧中,只能有1个协程处于运行状态吗?)

  • A:错。1帧内可以有多个协程都处于Start状态下,且他们都会被执行到。

Q:1个MonoBehaviour中,存在一个协程方法Func1(),该方法在之前被Start了,且其内容尚未被执行完毕,方法还未退出,现在又StartCoroutine(Func1()),那么之前开启的协程会被中断并重新开始吗?

  • A:不会,之前的协程内容不会被掐断,会继续执行。而新开启的协程也是按照Func1中定义的代码从第一行开始执行。究其本因,是因为这两个协程虽然用到了相同的处理过程,但是由于迭代器IEnumerator不同,所以他们可以被视为是两个“代码过程相同,但是函数名不同的方法”。其在内存中的地址也不同,因此不会互相被执行到。
  • PS:验证方法:
    1.新建1个新场景Scene
    2.在场景中添加1个新的空物体
    3.新建1个脚本,挂载到该空物体上
    4.脚本内容填写为:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{

    // Use this for initialization
    void Start ()
    {
        print(DateTime.Now);
    }

    // Update is called once per frame
    void Update ()
    {
        StartCoroutine(携程1());
    }

    int coroutineCount = 0;
    IEnumerator 携程1()
    {
        //yield return new WaitForSeconds(1);
        float timer = 0;
        float thisCoroutineOrder = coroutineCount++;
        while (timer < 5)
        {
            timer += Time.deltaTime;
            yield return null;
        }

        print(timer + "_" + thisCoroutineOrder);
    }
}

5.运行游戏,观察Log。即可证明上述结论(同1个协程方法被多次“创建”,而非被多次“调用”)

11/16/2023 3:43:46 PM
UnityEngine.MonoBehaviour:print(Object)
TestScript:Start() (at Assets/Scripts/Test/TestScript.cs:12)

5.007182_0
UnityEngine.MonoBehaviour:print(Object)
<携程1>c__Iterator0:MoveNext() (at Assets/Scripts/Test/TestScript.cs:33)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

5.003581_1
UnityEngine.MonoBehaviour:print(Object)
<携程1>c__Iterator0:MoveNext() (at Assets/Scripts/Test/TestScript.cs:33)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

5.000173_2
UnityEngine.MonoBehaviour:print(Object)
<携程1>c__Iterator0:MoveNext() (at Assets/Scripts/Test/TestScript.cs:33)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值