Unity' StartCoroutine是如何在有分配和没有分配的情况下工作的?
本文关键字:分配 情况下 工作 StartCoroutine Unity | 更新日期: 2023-09-27 18:08:27
我试着搜索,但在解释协同例程系统而不是这个细节的所有线程之间丢失了。我已经知道StartCoroutine
返回一个协例程,所以我试着看看是否有某种隐式操作符重载一个void返回类型,甚至尝试过,但它没有工作,我什么也没发现。老实说,我能想到的就是这些,你可以看出我是个初学者这个问题没有特定的目标,我只是很感兴趣。提前感谢
StartCoroutine(example());
和Coroutine myCoroutine = StartCoroutine(example())
?如果返回类型是Coroutine,那么第一个如何像void一样工作呢?
比较
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
函数)