我尝试过搜索,但在解释共同例程系统的所有线程之间丢失了,但没有详细说明。我已经知道StartCoroutine
返回一个Co-routine,所以我试着查看是否有某种隐式运算符重载为void返回类型甚至尝试过,但它没有工作,我一无所获。说实话,我可以想到,你可以说我是初学者
这个问题没有具体的目标,我真的很感兴趣。提前谢谢
编辑:我为没有明白我的问题而道歉:
怎么说StartCoroutine(example());
和Coroutine myCoroutine = StartCoroutine(example())
?如果返回类型是Coroutine,第一个如何像void一样工作?
答案 0 :(得分:7)
比较
StartCoroutine(example());
和
Coroutine myCoroutine = StartCoroutine(example());
如果返回类型为
void
,第一个如何像Coroutine
一样工作?
你的头脑中已经倒退了规则。 C#中的规则不是"非void方法必须分配或使用其返回值。"规则恰恰相反:void方法只能用作语句。
如果使用非void方法作为语句,编译器将生成丢弃返回值的代码。
这是否是 smart 要做的事情不是编译器决定的。
然而, 只有某些表达式可用作语句的情况;不出所料,它们是那些对副作用有用的表达方式。他们是:
所以你可以说:
M();
x = 123;
x++;
new Abc();
await someTask;
但不是
2 + 2;
(string)M();
等等。
答案 1 :(得分:3)
您并不总是需要保存具有返回值的函数的结果。如果你做了
public void Awake()
{
Foo();
}
private int Foo()
{
return 42;
}
编译器没有任何问题。
StartCoroutine
返回任何内容的原因是,如果你想做嵌套的Coroutines,你想在继续外部之前等待内部例程完成。
这是一个房间在游戏中动态加载的示例,一旦第一个房间被加载,玩家就可以移动,然后其他房间将被顺序加载。
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
如果你不关心Coroutine&#34;何时完成&#34;无需保存StartCoroutine
的结果(例如我上面示例中的Awake
函数)