为什么Unity的StartCoroutine有没有分配工作?

时间:2016-09-23 16:14:08

标签: c# unity3d

我尝试过搜索,但在解释共同例程系统的所有线程之间丢失了,但没有详细说明。我已经知道StartCoroutine返回一个Co-routine,所以我试着查看是否有某种隐式运算符重载为void返回类型甚至尝试过,但它没有工作,我一无所获。说实话,我可以想到,你可以说我是初学者 这个问题没有具体的目标,我真的很感兴趣。提前谢谢

编辑:我为没有明白我的问题而道歉: 怎么说StartCoroutine(example());Coroutine myCoroutine = StartCoroutine(example())?如果返回类型是Coroutine,第一个如何像void一样工作?

2 个答案:

答案 0 :(得分:7)

  

比较

StartCoroutine(example());
  

Coroutine myCoroutine = StartCoroutine(example());
  

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

你的头脑中已经倒退了规则。 C#中的规则不是"非void方法必须分配或使用其返回值。"规则恰恰相反:void方法只能用作语句。

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

这是否是 smart 要做的事情不是编译器决定的。

然而, 只有某些表达式可用作语句的情况;不出所料,它们是那些对副作用有用的表达方式。他们是:

  • 方法调用
  • 作业(是的,作业是表达式)
  • 递增/递减
  • 构造函数调用(" new") - 这很少见
  • 等待着

所以你可以说:

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函数)