Unity async / await: Coroutine's Hot Sister [C# & Unity]

The C# async / await workflow can simplify your code and give you more granular control over your game in Unity.
Learn how to convert your current coroutine workflow, what a task is, how to run sequential and synchronous code and how to return data from an asynchronous function.
UniTask: github.com/Cysharp/UniTask (Provides an efficient allocation free async/await integration for Unity)
❤️ Become a Tarobro on Patreon: / tarodev
=========
🔔 SUBSCRIBE: bit.ly/3eqG1Z6
🗨️ DISCORD: / discord
✅ MORE TUTORIALS: / tarodev
0:00 Super professional intro
0:30 Standard coroutine workflow
1:19 Converting to async / await
2:44 Use-cases of async / await
3:10 Running functions sequentially
6:00 Waiting for synchronous tasks to complete
10:20 Mixing sequential and synchronous tasks
11:00 Returning data from an async function
14:20 Calling an async function from a non-async function
15:10 WebGL caveat
15:45 Other advanced async techniques

Пікірлер: 495

  • @vertxxyz
    @vertxxyz2 жыл бұрын

    There are certainly other important caveats to mention with async. You were constantly getting NREs in the background. This being caused by the fact that tasks do not respect Unity Object lifetimes. Coroutines will stop when the object that started them is destroyed. Tasks will continue on regardless, and this means that they can continue outside of playmode, and through scene changes. To counter this you need to use cancellation tokens, and they're somewhat difficult to grasp. In reality almost every task you start should really take a cancellation token. Not only this, but there are situations you can get yourself into that completely silence exceptions occurring within a task-returning method. If you do not await a task it will not appropriately throw exceptions created within it. This can make bugs difficult to track down, and if you're not familiar with that fact it's a minefield.

  • @fahmyeldeeb2542

    @fahmyeldeeb2542

    2 жыл бұрын

    Great addition, thank you, I did not know this

  • @braniacba6842

    @braniacba6842

    2 жыл бұрын

    Personal experience, rotating is fine yet setting material property blocks can lead to silence exceptions. Unity really doesn't like having its API called in another thread. I heard that the Unity team is improving the workflow with async/await, but for now, it's causing more pain than it alleviates in most cases.

  • @JianqiuChen

    @JianqiuChen

    2 жыл бұрын

    Oh wow, thanks for pointing these out.

  • @raii3944

    @raii3944

    2 жыл бұрын

    Indeed, this. async / await workflow is definitely not a coroutine killer. I've spent Last 3 hours tracking down an exception that did not log nor give any hint that there is a problem other than a certain function just not calling. In more complicated scenarios this is would be a pain

  • @LagunaCloud

    @LagunaCloud

    2 жыл бұрын

    I think it's a mistake not to bring up async function garbage collection. There's a reason they created a "ValueTask" structure. Especially in game development you have to keep your head on top of the memory allocation and deallocation game. You can quickly start running into garbage collection issues if you're throwing willy nilly async functions everywhere.

  • @APaleDot
    @APaleDot2 жыл бұрын

    I think I ought to mention that most of the advantages listed here in favor of async/await are also present in Coroutines, but he doesn't write the Coroutine version in a way to take advantage of them. For instance, when running Coroutines sequentially, you do not have to make a bunch of different functions and then a separate function to yield on each function sequentially. You can simply do what he does for the async function. You can have that function return IEnumerator (just like how he changes it to async) and run it using StartCoroutine. Then you simply yield return for each shape just like he does with the async version. So in code it looks like this: public IEnumerator BeginTest() { for (var i = 0; i yield return _shapes[i].RotateForSeconds(1 + i); } } Compare to the async version. It's identical. Similarly, when talking about ways to wait for all the Coroutines to finish he doesn't even mention WaitUntil, or the fact that you can simply yield on Coroutines after starting them. The later method leads to code which is very similar to what he writes for the async function: public IEnumerator BeginTest() { _finishedText.SetActive(false); Coroutine[] tasks = new Coroutine[_shapes.Length]; for (var i = 0; i tasks[i] = StartCoroutine( _shapes[i].RotateForSeconds(1 + i) ); } foreach (Coroutine task in tasks) yield return task; _finishedText.SetActive(true); } Which again is almost identical to his async version. The major advantage of async functions is the fact that you can return values from them like a Promise in Javascript. But Coroutines are native to Unity and are therefore better integrated into that system: for instance Coroutines line up with the frames of the engine as he mentions, async functions often continue even after you hit stop in the editor which he doesn't mention. Also, some default Unity methods (such as Start) can be converted directly into Coroutines simply by making them return IEnumerator.

  • @jerms_mcerms9231

    @jerms_mcerms9231

    Жыл бұрын

    This is AWESOME! Thank you!

  • @diegonorambuena4194

    @diegonorambuena4194

    Жыл бұрын

    I didn't see this comment before, but it's a very helpful one. Thanks for showing examples and details of the Coroutines features

  • @kdeger
    @kdeger2 жыл бұрын

    Perfect use cases, great samples for comparison. Really makes you eager to use Tasks in your code. On point tutorial, good work!

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Thanks! I tried to make the (voiced) use cases as practical as possible.

  • @thinker2273
    @thinker22732 жыл бұрын

    Too few developers who learn C# through just Unity understand that using IEnumerable for asynchronicity is not a typical thing in C# and that the purpose of the IEnumerable interface has literally _nothing_ to do with asynchronicity.

  • @RogerValor

    @RogerValor

    2 жыл бұрын

    true, but it depends on whether you have background in other languages (or even C# itself) or not. For me it was pretty clear that this is just using a general interface in some external task system. I think any Unity dev should learn C# indepently in any circumstance. This isn't so different for any issue where the Unity Engine is your event handler, even MonoBehaviour entrypoints.

  • @humadi2001
    @humadi20012 жыл бұрын

    Non-boring details from years of experience. I'm surprised of the way you've put all this information together in one video! Thank you!!!

  • @SwaggyProfessor
    @SwaggyProfessor2 жыл бұрын

    Hey there , I just found your channel. I work full time as a C# backend dev and I always wondered how to apply all of these tools I use all the time like Tasks in Unity. I appreciate you doing these kinds of explanations nobody else on youtube is willing to do. Good work!

  • @NexysStormcloud
    @NexysStormcloud Жыл бұрын

    I think it's worth mentioning that async/await continues to work in the editor even after the game has stopped, unless you set an exit condition that takes this into account. Can lead to unexpected results, especially if moving, adding or removing scene objects, playing sound, etc. occurs inside asynchronous functions.

  • @GenSpark1
    @GenSpark12 жыл бұрын

    Almost spooky how well timed this is, having some trouble with Coroutine Sequentials and cancelling a Coroutine, so this is perfect! Great explanation and well spoken, definite subscribe! :D

  • @IvarDaigon
    @IvarDaigon2 жыл бұрын

    Quick Tip. don't use async void because because any exceptions can disappear into a black hole. Try to get into the habit using async Task so that you know what the result of the function was (whether it succeeded or failed etc) if you want to be even more fancy you can also return a tuple wrapped in a task so you can return whether the function succeeded and also any other useful info if it failed, this will help when trying to debug the function so that you don't have to step through the entire thing. I like to use this pattern: async Task DoSomething() var result = await DoSomething().ConfigureAwait(false) if (result.success) { //Do another thing after success. } else { //Do something else after fail. Log($"DoSomething() failed because: {reason}"); }

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Great suggestion. You can still try/catch a void async method and get it's thrown error, but your technique is great for handled workflow errors.

  • @coloneljcd6041

    @coloneljcd6041

    6 ай бұрын

    @@Tarodevthats actually not true, even a try catch wont get the error because its never returned, and it will crash your app

  • @thomasloupe

    @thomasloupe

    5 ай бұрын

    @@coloneljcd6041 This is correct, any async void exceptions will propagate (bubble) up to the first non-async method, which can oftentimes be your application's entry point.

  • @vimalnaran2294
    @vimalnaran2294 Жыл бұрын

    Nice work covering this subject and displaying the mulitple ways async/await can be used. Even a year+ on after the release of your video, its still a gold nugget!

  • @YulRun
    @YulRun2 жыл бұрын

    I don't like comparing content creators, as everyone has a unique approach. But you're basically the Brakeys 2.0 in the void of Brakeys. GIving us more indepth, higher level tutorials that is exactly what the space needs. You definitely deserve much more Subscribers.

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    This is truly the highest praise. Thanks Matt.

  • @dsbm2153

    @dsbm2153

    2 жыл бұрын

    I think Brackeys is overrated. He never explained what his code did in particular which made learning difficult and fixing potential issues with the copy-pasted code impossible. Also, copy-pasting code just straight up isn't fun

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    @@dsbm2153 If you look at some of his older videos you can see he did some pretty complex stuff and covered useful mathematics concepts, which also had deep explanations. Toward the end, I think he just had such a massive new-dev following he just ended up catering to them. I'm trying to avoid going full beginner-friendly by throwing in advanced stuff too.

  • @emiel04

    @emiel04

    2 жыл бұрын

    @@Tarodev I love the advanced stuff, content online is almost always beginner level, having these more advanced concepts in a very good format is very nice. Thank you!

  • @Cielu1

    @Cielu1

    8 ай бұрын

    @@Tarodev You are doing such a great job on explanation. Niche on more mathematical / advanced concepts. We need it!

  • @caleb6067
    @caleb60672 жыл бұрын

    Everything you do, you do well! I am so excited to see your page gaining traction. It is well deserved

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Thanks Caleb, I'm excited too! I'm so glad my teachings are helping so many people now 😊

  • @nilsmuller-cleve6769
    @nilsmuller-cleve6769 Жыл бұрын

    I've referenced this video many times now, as I'm finding more and more use cases for this. Thank you so much for showing this off!

  • @kennyRamone
    @kennyRamone2 жыл бұрын

    Dude, this is easily among the best Unity content I've ever seen in youtube and I would DEFINITELY love that more advanced tutorial

  • @Th3Shnizz
    @Th3Shnizz2 жыл бұрын

    Definitely like the workflow of using Tasks instead of coroutines. You have much better control over it and it certainly makes waiting for things to complete a little easier.

  • @SirRelith
    @SirRelith Жыл бұрын

    I love your super professional intro. :D

  • @Storymen12369
    @Storymen12369 Жыл бұрын

    This is exactly what I was looking for. I love this video.

  • @Rubidev
    @Rubidev2 жыл бұрын

    As you yourself said, yes, "Beautiful".

  • @hegworks
    @hegworks2 жыл бұрын

    I really appreciate these concise tutorials. Thank you so much

  • @RobertoDeMontecarlo
    @RobertoDeMontecarlo2 жыл бұрын

    Dude, thank you so much. I mean, really! You made a great masterclass of how to use properly Tasks, Async/Await. Now, I truly understand it. No more crappy code anymore.

  • @roygatz1037
    @roygatz1037 Жыл бұрын

    For newbie Unity C# community, can't be without you

  • @sickboi11111
    @sickboi11111 Жыл бұрын

    This was so handy, saved me a bunch of headscratching, thanks!

  • @Maxx__________
    @Maxx__________2 жыл бұрын

    Fantastic video. I've always loathed using coroutines. Thank you!!

  • @brkhnzn
    @brkhnzn2 жыл бұрын

    So helpful before my exam. Thank you so much.

  • @Freaklittleplayer
    @Freaklittleplayer Жыл бұрын

    Your are an absolute programming beast. I've never seen someone with so good code tutorials. I'm just commenting this here for you to keep up the good work and so that the algorithm rank you better and spread your channel around

  • @fernandoferreira5156
    @fernandoferreira51562 жыл бұрын

    never stop making content, thank you

  • @dageddy
    @dageddy2 жыл бұрын

    Lovely. I come from a C# async/await web workflow and got into Coroutines when learning Unity. Am keen to refactor some of my code because of your video. Thanks!

  • @invalid_studio833
    @invalid_studio8332 жыл бұрын

    Wow! I didn't know I needed this tutorial. Job well done, thank you.

  • @francocougo6396
    @francocougo6396 Жыл бұрын

    When I first learned about Coroutines it was ground breaking, the peak of technology for my silly indie brain. Now I'm finding out about async/await/tasks and it's just wonderful. Truly amazing to see how there's always something new to learn.

  • @EricYoungVFX
    @EricYoungVFX Жыл бұрын

    So glad I found you, amazing tutorials. This will save me lots of headaches.

  • @ultramelon3960
    @ultramelon3960 Жыл бұрын

    I will definitely have to keep this one in mind! 👍

  • @vincentlauwen9742
    @vincentlauwen97422 жыл бұрын

    You opened my eyes. Great vid!

  • @brianpurdy2966
    @brianpurdy29662 жыл бұрын

    Another great video Tarodev! I would love to see where you take a more advanced video on this topic and keep them coming!

  • @RichyAsecas
    @RichyAsecas2 жыл бұрын

    I think this is the best Unity async/await tutorial I have ever seen. And I can swear I've seen pretty much of those. It would be great to see more advanced stuff delving into async uses in Unity.

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    I really appreciate it Ricardo. That's pretty high praise

  • @soulinekki1130

    @soulinekki1130

    2 жыл бұрын

    Absolutely agree, I'm in awe at how on point is this video. Very clear example in very compact form.

  • @epiphanyatnight8732
    @epiphanyatnight87322 жыл бұрын

    This just taught me how async works finally. Thanks a ton!

  • @cahydra
    @cahydra2 жыл бұрын

    Thanks for enlightening me about async & await, this will come to great use.

  • @kingreinhold9905
    @kingreinhold99052 жыл бұрын

    Subscribed! You really opened a whole new world to me...

  • @betinamascenon4675
    @betinamascenon46752 жыл бұрын

    Thank you for the great tutorials! Would definitely love to see those advanced tutorials!

  • @gamepass505
    @gamepass5052 жыл бұрын

    Your videos are very useful, fun to watch, and nicely explained.

  • @joakin8535
    @joakin85352 жыл бұрын

    This is it man. Quality content!

  • @dr.angerous
    @dr.angerous2 жыл бұрын

    Wow. Just wow. I wish every tutorial was just like this

  • @bloom945
    @bloom9452 жыл бұрын

    WHAT. thats so op????? just found your channel, great stuff

  • @OmegaFalcon
    @OmegaFalcon2 жыл бұрын

    This was incredibly useful. Exactly what I needed rn

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Take this tool and grow strong my child

  • @rickyspanish4792
    @rickyspanish47922 жыл бұрын

    Wow! That super professional intro

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Lol... yeah. Not sure what I was thinking

  • @frazoni.
    @frazoni.2 жыл бұрын

    This is also super useful for loading levels asynchronously

  • @SpicyMelonYT
    @SpicyMelonYT2 жыл бұрын

    This is so great. I use async and await for JavaScript stuff, I had no idea C# had this. I LOVE IT!

  • @JimPlaysGames
    @JimPlaysGames2 жыл бұрын

    Holy crap this is amazing. I had no idea this was a thing and I am definitely putting this to use. Thank you!

  • @tailwindmechanics7454
    @tailwindmechanics74542 жыл бұрын

    This was awesome, would definitely love a deeper dive into this

  • @LiquidMark
    @LiquidMark2 жыл бұрын

    I never knew about async, thank you for the informative video!

  • @olon1993
    @olon19932 жыл бұрын

    This was a great intro. Would love a deeper dive!

  • @DynastySheep
    @DynastySheep2 жыл бұрын

    This is a nice tutorial, I have been using coroutines all the time and will surely start using the async/await in my future projects. Thanks :)

  • @djdavidj
    @djdavidj2 жыл бұрын

    Thank you. I’ve been in Coroutine hell for a few days, this will work for exactly what I need. I think I can replace all my Coroutines with this. Again, thank you!

  • @gastonclaret2012
    @gastonclaret20122 жыл бұрын

    Great tutorial, thanks for this

  • @utkuerden6269
    @utkuerden62692 жыл бұрын

    Great video totally and look forward to advanced tutorial

  • @thorbrigsted5580
    @thorbrigsted5580 Жыл бұрын

    Great guide. Covers all the points i was interested in

  • @antonkorshunov4979
    @antonkorshunov4979 Жыл бұрын

    Just a great and enough deep explanation, rewatched it several times). Thanks

  • @TheXentios
    @TheXentios2 жыл бұрын

    This is amazing info for 16 minutes. Well done. Also thanks for the Webgl warning.

  • @zekiozdemir420
    @zekiozdemir4202 жыл бұрын

    Thank you! needed this

  • @mooumari8210
    @mooumari82102 жыл бұрын

    Amazing tutorial, well explained

  • @pixeldevlog
    @pixeldevlog2 жыл бұрын

    Perfect video, loved it and subscribed. I'd love to see more of these videos.

  • @ckwallace
    @ckwallace Жыл бұрын

    coming from a javascript background and being familiar with Promises (and having trouble wrapping my mind around coroutines) this video is a lifesaver! thank you so much

  • @Tarodev

    @Tarodev

    Жыл бұрын

    And lucky for you, unity is focusing heavily on improving async work flows. Major updates coming soon!

  • @svendpai
    @svendpai2 жыл бұрын

    Amazing stuff!

  • @yvanrichani7631
    @yvanrichani76312 жыл бұрын

    This is an extremely useful video, thank you!

  • @lordhitnrun4335
    @lordhitnrun43352 жыл бұрын

    love your content !

  • @deivid-01
    @deivid-012 жыл бұрын

    Great explanation! Keep the great work up!

  • @Mrawesome1908
    @Mrawesome19082 жыл бұрын

    What a great tutorial that I didn't even know I needed :3

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Go live your best async life

  • @kubstoff1418
    @kubstoff14182 жыл бұрын

    this is my first vid from you I've watched, but after 4 mins I subscribed instantly, such clear message and comprehensive explanation!

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Thank you so much! Glad to have you on board

  • @sadparad1se
    @sadparad1se2 жыл бұрын

    Cool! Nicely explained.

  • @Selconag
    @Selconag Жыл бұрын

    That was my first time I easily used a hard topic, thank you. I will tell everybody how you meme'd a really good topic(Of course usage too). I will watch every use case video you will release. Hope there will be more meme intros too.

  • @mikrokaulis32k68
    @mikrokaulis32k6810 ай бұрын

    Clean video. Thanks a lot didnt know this thing even existed less go

  • @narkopraxis602
    @narkopraxis6022 жыл бұрын

    Awesome video! A great way to start my day!

  • @vrtech473
    @vrtech4732 жыл бұрын

    Advance tutorial workflow for async is a MUST ! :D

  • @sly1cooper
    @sly1cooper2 жыл бұрын

    Thanks for the easy explanation :)

  • @rem3072
    @rem30722 жыл бұрын

    Video made me subscribe ! Great channel mate

  • @DanPos
    @DanPos2 жыл бұрын

    Awesome video Tarodev - will definitely be using async more often now!

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    You look to have some interesting tutorials on your channel! I'll sub and take a peak shortly

  • @DanPos

    @DanPos

    2 жыл бұрын

    @@Tarodev Thanks a lot!

  • @nicholassmith1430
    @nicholassmith1430 Жыл бұрын

    Found this video awhile ago, but I keep coming back because I forget the snytax or where in my code to implement the async or await functions. Thank you so much for this video as it really helped me on my projects and will continue to help me on future Unity projects.

  • @Tarodev

    @Tarodev

    Жыл бұрын

    I hope you watch the amazing intro each time

  • @jean-michel.houbre
    @jean-michel.houbre2 жыл бұрын

    Awesome tool! Thanks.

  • @tabooization123
    @tabooization123 Жыл бұрын

    Nice detailed and simplified tutorial

  • @Tarodev

    @Tarodev

    Жыл бұрын

    Thanks Taboo. I see you're binging my content 🙏

  • @tabooization123

    @tabooization123

    Жыл бұрын

    @@Tarodev Sure I am, they are helpful when I don't know where to improve myself. Thanks a lot

  • @_g_r_m_
    @_g_r_m_2 жыл бұрын

    Great introduction! I've never heard of it and would love to learn about more advanced stuff.

  • @stressbuster5500
    @stressbuster5500 Жыл бұрын

    super professional intro lol Easy to understand with indepth details as all your videos. Keep making such videos thanks

  • @Tarodev

    @Tarodev

    Жыл бұрын

    Not sure what I was thinking with that intro...

  • @kkkaran786
    @kkkaran7862 жыл бұрын

    Yes please, more videos on advance scripting techniques

  • @ZuloYT
    @ZuloYT2 жыл бұрын

    love the examples, awesome video! well described!

  • @hermanusjohannesbesselaar2499
    @hermanusjohannesbesselaar24995 ай бұрын

    Just blew my mind. Thanks this will already save me so much trouble. Can't wait 😉 to watch the awaitable video next! Thanks a lot for this, Definitely getting my like!

  • @Sonic-ig1po

    @Sonic-ig1po

    4 ай бұрын

    Please read the first couple of comments, what this guy is doing is irresponsible generally and will hurt your code without a proper understanding of what is happening. No insult intended just a want to save you from untraceable errors.

  • @hermanusjohannesbesselaar2499

    @hermanusjohannesbesselaar2499

    4 ай бұрын

    @@Sonic-ig1po Thanks for taking the time to warn me about this. I will definitely look it some more. I started out using coroutines but thought the async await looked a lot cleaner. Just reading the comments is a scary education in itself.

  • @dfadir
    @dfadir2 жыл бұрын

    Quality stuff, man! Keep it up

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    I'll do my best 🤪

  • @user-xo1uy3wt4l
    @user-xo1uy3wt4l2 жыл бұрын

    It's Perfect Tutorial!!!! Thank you~

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Yay!!

  • @libberator5891
    @libberator58912 жыл бұрын

    Another banger! This man just poops out quality content

  • @chicao.do.blender
    @chicao.do.blender2 жыл бұрын

    amazing stuff

  • @BeeGameDev
    @BeeGameDev2 жыл бұрын

    This is great. Thanks for sharing.

  • @pocket-logic1154
    @pocket-logic11546 ай бұрын

    Man.. so many light bulb moments with this channel. You have such a great way of explaining things in simple ways that makes them so much easier to follow and understand. I've been chaining Coroutines for.. awhile now. I never knew you could just use Async to do it this way. Hah! Impressive. Cheers ;-)

  • @NewtonJR1987
    @NewtonJR19872 жыл бұрын

    Great video, thanks!

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Glad you liked it!

  • @majeddev
    @majeddev2 жыл бұрын

    Yes an advanced one would be nice. Great tutorial btw!

  • @ulysses568
    @ulysses5682 жыл бұрын

    Life saver !

  • @darudev
    @darudev2 жыл бұрын

    It's very interesting, waiting for more advanced)

  • @CamisGameDev
    @CamisGameDev2 жыл бұрын

    very good video! I can understand much better now

  • @richardbeare11
    @richardbeare112 жыл бұрын

    Would love to see that more advanced async workflow tutorial that you alluded to! You do a great job here.

  • @balasubramanimudaliar1336
    @balasubramanimudaliar13362 жыл бұрын

    great tut😀

  • @narkid89
    @narkid892 жыл бұрын

    Absolutely awesme video, consise and clear with great examples. You've got a new subscriber! ^^

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Thanks Dikran!

  • @qzswarzeeshan5308
    @qzswarzeeshan53082 жыл бұрын

    Love it.

  • @mov4736
    @mov47362 жыл бұрын

    Thanks! Pretty good video!

  • @MrZtapp
    @MrZtapp2 жыл бұрын

    This tutorial focuses on one of my major problems, sequencing, being a quite unexperienced C# programmer. I will use this as my c# async bible as it solve two major issues I have. Great tutorial I must say.

  • @Tarodev

    @Tarodev

    2 жыл бұрын

    Glad it helped buddy. Good luck!