<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.15">
  <compounddef id="learn_8md" kind="file" language="Markdown">
    <compoundname>learn.md</compoundname>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
    </detaileddescription>
    <programlisting>
<codeline><highlight class="normal">Learn</highlight></codeline>
<codeline><highlight class="normal">=====</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Task<sp/>Parallel<sp/>Library</highlight></codeline>
<codeline><highlight class="normal">---------------------</highlight></codeline>
<codeline><highlight class="normal">If<sp/>you<sp/>are<sp/>new<sp/>to<sp/>the<sp/>Task<sp/>Parallel<sp/>Library,<sp/>please<sp/>see<sp/>this<sp/>overview<sp/>by<sp/>Sacha<sp/>Barber<sp/>on<sp/>[Code<sp/>Project](http://www.codeproject.com/Articles/152765/Task-Parallel-Library-1-of-n) or<sp/>the<sp/>reference<sp/>documentation<sp/>on<sp/>[MSDN](http://msdn.microsoft.com/en-us/library/dd537609(v=vs.100).aspx).</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">API<sp/>Reference</highlight></codeline>
<codeline><highlight class="normal">-------------</highlight></codeline>
<codeline><highlight class="normal">The<sp/>[Concurrency<sp/>Kit<sp/>API<sp/>Reference](http://spicypixel.com/developer/concurrency-kit/api-reference/)<sp/>is<sp/>a<sp/>good<sp/>place<sp/>to<sp/>start<sp/>if<sp/>you<sp/>want<sp/>to<sp/>see<sp/>what<sp/>is<sp/>in<sp/>the<sp/>library<sp/>and<sp/>learn<sp/>more<sp/>about<sp/>how<sp/>fibers<sp/>and<sp/>coroutines<sp/>are<sp/>supported.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Tasks<sp/>vs.<sp/>Unity<sp/>Coroutines</highlight></codeline>
<codeline><highlight class="normal">--------------------------</highlight></codeline>
<codeline><highlight class="normal">Unity<sp/>has<sp/>[built-in<sp/>support](http://unity3d.com/support/documentation/ScriptReference/index.Coroutines_26_Yield.html)<sp/>for<sp/>coroutines<sp/>and<sp/>so<sp/>you<sp/>may<sp/>be<sp/>wondering<sp/>how<sp/>tasks<sp/>are<sp/>different.<sp/>This<sp/>section<sp/>calls<sp/>out<sp/>a<sp/>few<sp/>key<sp/>distinctions.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Declaration<sp/>and<sp/>Execution</highlight></codeline>
<codeline><highlight class="normal">Starting<sp/>a<sp/>coroutine<sp/>in<sp/>Unity<sp/>requires<sp/>one<sp/>to<sp/>define<sp/>an<sp/>explicit<sp/>method<sp/>for<sp/>the<sp/>routine<sp/>and<sp/>then<sp/>initiate<sp/>it<sp/>with<sp/>[MonoBehaviour.StartCoroutine](http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.StartCoroutine.html).</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">using<sp/>UnityEngine;</highlight></codeline>
<codeline><highlight class="normal">using<sp/>System.Collections;</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>example<sp/>:<sp/>MonoBehaviour<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>void<sp/>Start()<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Starting<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>StartCoroutine(WaitAndPrint(2.0F));</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Before<sp/>WaitAndPrint<sp/>Finishes<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>IEnumerator<sp/>WaitAndPrint(float<sp/>waitTime)<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>new<sp/>WaitForSeconds(waitTime);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;WaitAndPrint<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Note<sp/>how<sp/>the<sp/>WaitAndPrint<sp/>method<sp/>requires<sp/>the<sp/>special<sp/>IEnumerator<sp/>return<sp/>type,<sp/>the<sp/>signature<sp/>of<sp/>all<sp/>coroutines.<sp/>Using<sp/>tasks,<sp/>the<sp/>same<sp/>example<sp/>could<sp/>be<sp/>written<sp/>as<sp/>follows.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">using<sp/>UnityEngine;</highlight></codeline>
<codeline><highlight class="normal">using<sp/>System.Collections;</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>example<sp/>:<sp/>ConcurrentBehaviour<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>void<sp/>Start()<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Starting<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>taskFactory.StartNew(WaitAndPrint(2.0F));</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Before<sp/>WaitAndPrint<sp/>Finishes<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>IEnumerator<sp/>WaitAndPrint(float<sp/>waitTime)<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>new<sp/>WaitForSeconds(waitTime);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;WaitAndPrint<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">As<sp/>you<sp/>can<sp/>see,<sp/>only<sp/>a<sp/>minimal<sp/>change<sp/>is<sp/>required<sp/>to<sp/>use<sp/>an<sp/>existing<sp/>coroutine<sp/>as<sp/>a<sp/>task<sp/>with<sp/>the<sp/>Concurrency<sp/>Kit.<sp/>But,<sp/>these<sp/>are<sp/>some<sp/>of<sp/>the<sp/>benefits<sp/>you<sp/>get<sp/>when<sp/>doing<sp/>so.<sp/>Because<sp/>the<sp/>TaskFactory.StartNew<sp/>method<sp/>returns<sp/>a<sp/>Task<sp/>you<sp/>can:</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>Wait<sp/>from<sp/>any<sp/>other<sp/>thread<sp/>for<sp/>the<sp/>task<sp/>to<sp/>complete<sp/>using<sp/>[Task.Wait](http://msdn.microsoft.com/en-us/library/dd235635.aspx)</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>Continue<sp/>execution<sp/>based<sp/>on<sp/>multiple<sp/>tasks<sp/>using<sp/>[Task.WaitAny](http://msdn.microsoft.com/en-us/library/dd270672)<sp/>or<sp/>[Task.WaitAll](http://msdn.microsoft.com/en-us/library/dd270695)</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>Check<sp/>both<sp/>the<sp/>[completion<sp/>status](http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskstatus.aspx)<sp/>and<sp/>the<sp/>[result](http://msdn.microsoft.com/en-us/library/dd321405)<sp/>of<sp/>a<sp/>task</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Additionally,<sp/>you<sp/>can<sp/>pass<sp/>in<sp/>a<sp/>[CancellationToken](http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.aspx)<sp/>in<sp/>order<sp/>to<sp/>cancel<sp/>a<sp/>specific<sp/>instance<sp/>of<sp/>an<sp/>executing<sp/>task<sp/>or<sp/>a<sp/>group<sp/>of<sp/>executing<sp/>tasks.<sp/>Unity<sp/>only<sp/>supports<sp/>stopping<sp/>all<sp/>instances<sp/>of<sp/>a<sp/>coroutine<sp/>using<sp/>[MonoBehaviour.StopCoroutine](http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.StopCoroutine.html)<sp/>or<sp/>[MonoBehaviour.StopAllCoroutines](http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.StopAllCoroutines.html) which<sp/>in<sp/>some<sp/>circumstances<sp/>isn&apos;t<sp/>fine<sp/>grained<sp/>enough.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Anonymous<sp/>Methods</highlight></codeline>
<codeline><highlight class="normal">Sometimes<sp/>it<sp/>is<sp/>more<sp/>convenient<sp/>to<sp/>write<sp/>a<sp/>workflow<sp/>using<sp/>anonymous<sp/>methods<sp/>instead<sp/>of<sp/>declaring<sp/>a<sp/>coroutine,<sp/>especially<sp/>for<sp/>simple<sp/>property<sp/>changes.<sp/>Here<sp/>is<sp/>the<sp/>same<sp/>example<sp/>rewritten<sp/>to<sp/>use<sp/>an<sp/>anonymous<sp/>method<sp/>instead<sp/>of<sp/>an<sp/>explicitly<sp/>declared<sp/>one.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">using<sp/>UnityEngine;</highlight></codeline>
<codeline><highlight class="normal">using<sp/>System.Collections;</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">public<sp/>class<sp/>example<sp/>:<sp/>ConcurrentBehaviour<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>void<sp/>Start()<sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Starting<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>taskFactory.StartNew(new<sp/>YieldForSeconds(2.0F)).</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>ContinueWith(lastTask<sp/>=&gt;<sp/>print(&quot;WaitAndPrint<sp/>&quot;<sp/>+<sp/>Time.time),</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>taskScheduler);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>print(&quot;Before<sp/>WaitAndPrint<sp/>Finishes<sp/>&quot;<sp/>+<sp/>Time.time);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Tasks<sp/>also<sp/>allow<sp/>invocation<sp/>of<sp/>standard<sp/>methods<sp/>and<sp/>functions<sp/>that<sp/>don&apos;t<sp/>have<sp/>an<sp/>**IEnumerator**<sp/>return<sp/>type<sp/>such<sp/>as<sp/>the<sp/>**print**<sp/>method<sp/>above.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">###<sp/>Portability</highlight></codeline>
<codeline><highlight class="normal">Unity<sp/>coroutines<sp/>allow<sp/>one<sp/>to<sp/>write<sp/>asynchronous<sp/>code,<sp/>but<sp/>that<sp/>code<sp/>is<sp/>not<sp/>portable<sp/>outside<sp/>of<sp/>the<sp/>Unity<sp/>framework<sp/>because<sp/>of<sp/>the<sp/>dependency<sp/>on<sp/>the<sp/>Unity<sp/>coroutine<sp/>scheduler.<sp/>If<sp/>you<sp/>are<sp/>writing<sp/>or<sp/>using<sp/>a<sp/>library<sp/>that<sp/>needs<sp/>to<sp/>operate<sp/>in<sp/>a<sp/>Unity<sp/>environment<sp/>but<sp/>also<sp/>in<sp/>an<sp/>external<sp/>environment<sp/>such<sp/>as<sp/>for<sp/>tools,<sp/>framework,<sp/>or<sp/>cross-platform<sp/>development,<sp/>the<sp/>Task<sp/>Parallel<sp/>Library<sp/>is<sp/>the<sp/>standard<sp/>way<sp/>to<sp/>expose<sp/>asynchronous<sp/>behavior<sp/>in<sp/>your<sp/>public<sp/>interface.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Advanced<sp/>Uses</highlight></codeline>
<codeline><highlight class="normal">-------------</highlight></codeline>
<codeline><highlight class="normal">Tasks<sp/>make<sp/>it<sp/>easy<sp/>to<sp/>run<sp/>functions<sp/>on<sp/>another<sp/>thread<sp/>and<sp/>to<sp/>run<sp/>logic<sp/>in<sp/>parallel.<sp/>Here<sp/>are<sp/>some<sp/>of<sp/>the<sp/>more<sp/>advanced<sp/>things<sp/>you<sp/>can<sp/>do<sp/>with<sp/>them:</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>**AI:**<sp/>Perform<sp/>path<sp/>or<sp/>planning<sp/>searches<sp/>in<sp/>parallel<sp/>and<sp/>select<sp/>either<sp/>the<sp/>first<sp/>to<sp/>complete<sp/>or<sp/>the<sp/>best<sp/>from<sp/>multiple<sp/>options<sp/>when<sp/>all<sp/>searches<sp/>complete</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>**AI:**<sp/>Run<sp/>high-level<sp/>agent<sp/>behaviors<sp/>across<sp/>multiple<sp/>threads<sp/>and<sp/>optionally<sp/>at<sp/>a<sp/>different<sp/>frequency<sp/>than<sp/>the<sp/>Unity<sp/>run<sp/>loop<sp/>for<sp/>more<sp/>control<sp/>over<sp/>scalability</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>**Physics: **<sp/>Calculate<sp/>multiple<sp/>ballistic<sp/>trajectories<sp/>to<sp/>zero<sp/>in<sp/>on<sp/>a<sp/>solution</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>**Networking:**<sp/>Stream<sp/>multiple<sp/>assets<sp/>in<sp/>parallel<sp/>from<sp/>a<sp/>remote<sp/>site</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal"><sp/>*<sp/>**Networking:**<sp/>Asynchronously<sp/>coordinate<sp/>a<sp/>complex<sp/>sequence<sp/>of<sp/>events<sp/>such<sp/>as<sp/>NAT<sp/>type<sp/>discovery,<sp/>matchmaking<sp/>on<sp/>a<sp/>master<sp/>server,<sp/>connection<sp/>management,<sp/>fallbacks,<sp/>and<sp/>timeout<sp/>handling</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">One<sp/>caveat<sp/>to<sp/>working<sp/>with<sp/>multiple<sp/>threads<sp/>and<sp/>Unity<sp/>is<sp/>that<sp/>much<sp/>like<sp/>working<sp/>with<sp/>a<sp/>UI<sp/>framework,<sp/>all<sp/>access<sp/>to<sp/>Unity<sp/>objects<sp/>must<sp/>be<sp/>made<sp/>from<sp/>the<sp/>main<sp/>Unity<sp/>thread.<sp/>This<sp/>makes<sp/>it<sp/>necessary<sp/>to<sp/>adopt<sp/>a<sp/>multi-threaded<sp/>architecture<sp/>like<sp/>a<sp/>producer<sp/>/<sp/>consumer<sp/>model<sp/>in<sp/>order<sp/>to<sp/>safely<sp/>run<sp/>operations<sp/>in<sp/>parallel<sp/>and<sp/>access<sp/>or<sp/>marshal<sp/>game<sp/>state<sp/>across<sp/>threads.</highlight></codeline>
    </programlisting>
    <location file="Docs/learn.md"/>
  </compounddef>
</doxygen>
