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)