Unity' StartCoroutine是如何在有分配和没有分配的情况下工作的?

本文关键字:分配 情况下 工作 StartCoroutine Unity | 更新日期: 2023-09-27 18:08:27

我试着搜索,但在解释协同例程系统而不是这个细节的所有线程之间丢失了。我已经知道StartCoroutine返回一个协例程,所以我试着看看是否有某种隐式操作符重载一个void返回类型,甚至尝试过,但它没有工作,我什么也没发现。老实说,我能想到的就是这些,你可以看出我是个初学者这个问题没有特定的目标,我只是很感兴趣。提前感谢

编辑:我很抱歉没有把我的问题说清楚。怎么说StartCoroutine(example());Coroutine myCoroutine = StartCoroutine(example()) ?如果返回类型是Coroutine,那么第一个如何像void一样工作呢?

Unity' StartCoroutine是如何在有分配和没有分配的情况下工作的?

比较
StartCoroutine(example());

Coroutine myCoroutine = StartCoroutine(example());

如果返回类型是Coroutine,第一个如何像void一样工作?

你把规则记反了。c#中的规则不是"非空方法必须赋值或使用其返回值"。规则正好相反:void方法只能作为语句使用。

如果使用非void方法作为语句,编译器会生成丢弃返回值的代码。

这是不是一个聪明的事情,不是由编译器决定的。

但是,如果,则只有某些表达式可以用作语句;不出所料,这些表达式对它们的副作用是有用的。它们是:
    方法调用
  • 赋值(是的,赋值是表达式)
  • 增量/减量
  • 构造函数调用("new")——这是罕见的
  • 等待

所以你可以说:

M();
x = 123;
x++;
new Abc();
await someTask;

但不

2 + 2;
(string)M();

您并不总是需要保存具有返回值的函数的结果。如果你做了

public void Awake()
{
    Foo();
}
private int Foo()
{
    return 42;
}

编译器不会有问题的。

StartCoroutine返回任何东西的原因是,如果你想做嵌套的协程,你想等待内部例程完成,然后再继续执行外部例程。

这是一个在游戏中动态加载房间的例子,一旦第一个房间被加载,玩家就可以移动,然后其他房间将依次加载。

private bool _allowPlayerMovement;
public Room FirstRoom;
public Room SecondRoom;
public Room ThirdRoom;
//...
public void Awake()
{
    _allowPlayerMovement = false;
    StartCoroutine(LoadRooms())
}
private IEnumerator LoadRooms()
{
    //Runs the LoadFirstRoom Coroutine then waits for it to finish.
    yield return StartCoroutine(LoadFirstRoom())
    //One the first routine finishes set the variable to true.
    _allowPlayerMovement = true;
    //Start loading the 2nd room, wait for it to finish
    yield return StartCoroutine(LoadSecondRoom())
    //Once the 2nd room is finished loading start loading the 3rd room.
    yield return StartCoroutine(LoadThirdRoom())
   //... And so on
}
private IEnumerator LoadFirstRoom()
{
   WWW www = new WWW("http:''example.com'levels'FirstRoom.json")
   yield return www;
   FirstRoom = JsonUtility.FromJson<Room>(www.text);
}
//... And so on

如果你不关心协程什么时候"完成",就没有必要保存StartCoroutine的结果(就像我上面例子中的Awake函数)