2014-09-04 3 views
0

Я хочу понять синтаксис сопрограмм в C# (потому что это швы действительно необычные для меня ...).Coroutines Unity

Когда мы делаем что-то вроде:

yield return new WaitForSeconds(2.0f); 

Firstable: Я понимаю, цель этого заявления, но не синтаксис.

Что представляет класс WaitForSeconds? Это должно быть типа IEnumerator, так как это возвращаемый тип функции. Но в соответствии с документом http://docs.unity3d.com/ScriptReference/WaitForSeconds-ctor.html это не имеет типа возврата, и оно является инструкцией по урожайности (так запутано)

Итак, какова цель урожая в этом дело ?

И почему мы смешиваем его с ключевым словом return?

Благодарим заранее.

+2

писал ответ, но в основном это должно закончиться, чтобы быть копипаст этого сайта: http://twistedoakstudios.com/blog/Post83_coroutines-more-than-you-want-to-know Я предполагаю, что вы знаете, что делает coroutine и почему это может быть полезно, иначе эта ссылка будет бесполезной. – GameDeveloper

+0

Вы должны были просто добавить это как ответ;) – ryanscottmurphy

ответ

0

Использование вызова возврата доход создает IEnumerable возвращаемого типа. Это позволяет вызывающей функции обрабатывать список значений, поскольку они вычисляются вместо всех сразу в конце, например, если вы только что вернули коллекцию.

В Unity3d это важно, потому что цикл розыгрыша в основном происходит в одном потоке, поэтому вы можете использовать сопрограммы и синтаксис возврата доходности, чтобы встраивать поведение внутри ваших скриптов.

Новый вызов WaitForSeconds (...) позволяет контексту выполнения возвращаться к внешнему вызывающему абоненту в течение определенного периода времени при обработке no-op, эффективно приостанавливая выполнение этого MonoBehaviour, не приостанавливая весь поток ничьей.

0

Он просто позволяет вам выполнить часть кода параллельно.

, например:

IEnumerator PrintAfterDelay() 
{ 
    yield return new WaitForSeconds(5.0f); 

    //Rest of the code in this method will execute after 5 seconds while all 
all other code will be execute in parallel 
    Debug.Log("Now I am here after 5 Seconds"); 
} 

вызова его в Start(), например.

void Start() 
{ 
    StartCoroutine("PrintAfterDelay"); 
    Debug.Log("I am here"); 
}