سلام و درود خدمت دوستان عزیز و علاقمندان به مباحث آموزشی وب سایت پی وی لرن. با آموزش Unity در خدمتتون هستیم. Coroutines در Unity چیست؟ و کاربرد آن چیست؟ در این بخش به این موضوع خواهیم پرداخت.
Coroutines مفیدترین ابزار هنگام ساخت بازی در Unity است.
حال بیایید کدی را که در زیر نشان داده شده است در نظر بگیریم تا بفهمیم coroutine چیست.
1 2 3 4 5 | IEnumerator MyCoroutineMethod() { // Your code here… yield return null; } |
به طور کلی ، اگر یک تابع را در Unity (یا #C) فراخوانی کنید ، عملکرد از ابتدا تا انتها اجرا خواهد شد. این رفتار “عادی” در یک کد است که می توان در نظر گرفت. با این حال، بعضی اوقات می خواهیم به طور عمدی یک عملکرد را انجام ندهیم یا آن را بعد از چند ثانیه اجرا کنیم.
یک Coroutines تابعی است که قادر به انتظار و زمانبندی روند است و همچنین مکث کامل آن.
بگذارید مثالی در نظر بگیریم تا بفهمیم یک Coroutines چگونه کار می کند.
فکر کنید، می خواهیم مربعی درست کنیم که در فواصل ۱ ثانیه رنگ آن بین قرمز و آبی متغیر است.
برای شروع ، ما یک اسپلیت ایجاد می کنیم. در مرحله بعد ، یک اسکریپت جدید ایجاد کرده و آن را ColorChanger می نامیم. در این اسکریپت ، ما یک رفرنس برای Sprite Renderer spite فراهم می کنیم. با این حال ، از روشی متفاوت برای به دست آوردن کامپوننت استفاده خواهیم کرد. به جای درگ کردن و رها کردن کامپوننت به اسلات که
قبلا انجام داده ایم ، از کد درخواست خواهیم کرد که این کامپوننت را تشخیص دهد.
این کار از طریق روش GetComponent انجام می شود ، که اولین کامپوننت مطابق آن تشخیص را باز می گرداند. از آن جا که ما فقط از یک Sprite Renderer برای هر شیء استفاده می کنیم ، می توانیم از این روش استفاده کنیم تا هر بار به طور خودکار رفرنس را برای رندر در هر زمانی، شناسایی و دریافت کنیم.
به یاد داشته باشید که رندر وظیفه ایجاد اسپریت در صفحه قابل مشاهده را دارد.
رندر خاصیت رنگی دارد که بر رنگ اسپریت تأثیر می گذارد. و این مقداری است که باید اصلاح شود. عمومی کردن مقادیر Color به ما امکان می دهد تا آن ها را از طریق
ویرایشگر در برنامه پیش فرض انتخاب رنگ سیستم عامل خود انتخاب کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private SpriteRenderer sr; public Color color1; public Color color2; void Start () { sr = GetComponent<SpriteRenderer>(); StartCoroutine(ChangeColor()); } IEnumerator ChangeColor() { while (true) { if (sr.color == color1) sr.color = color2; else sr.color = color1; yield return new WaitForSeconds(3); } } |
اکنون ، ما عملکرد coroutine خود را در یک حلقه مدتی به چالش می کشیم.
برای ایجاد یک coroutine در #C ، به راحتی روشی را ایجاد می کنیم که IEnumerator را برمی گرداند. همچنین به جمله yield return نیاز داریم. جمله yield return ویژه است. و همان چیزی است که در واقع به یونیت می گوید اسکریپت را متوقف کرده و در فریم بعدی ادامه دهد.
چندین روش وجود دارد که می تواند برای yield return استفاده شود. یکی از آن ها WaitForSeconds است.
این امر باعث می شود تا قبل از ادامه ، coroutine برای ثانیه های معینی در دنیای واقعی منتظر بماند.
اجازه دهید کد خود را کامپایل کنیم و به یونیتی برگردیم. به راحتی رنگ های متناوب خود را انتخاب می کنیم و به بازی خواهیم پرداخت. اکنون هدف ما جابجایی بین دو رنگ در
فاصله ی ۳ ثانیه است.
می توانید فاصله را به یک متغیر عمومی تبدیل کنید و همچنین تکرار تغییرات رنگ را نیز تنظیم کنید.
coroutine ها به طور گسترده برای روش های زمان دار استفاده می شوند ، مانند روشی که در این جا انجام دادیم.
انواع روش های WaitForX کاربردهای خاص خود را دارند.
Coroutines همچنین برای اجرای فرایندهای “on the side” که به صورت همزمان اجرا می شوند ، به کار می رود. به عنوان مثال ، برای بارگیری قسمت های خارج از صفحه در
سطح بزرگ ، در حالی که پلیر در یک نقطه شروع می کند، مفید است.
در صورتی که بخواهیم یک کد مثلا بعد از چند ثانیه اجرا شود از Coroutines استفاده می کنیم.
در بخش بعدی مبحث Console در یونیتی رو خواهیم داشت.
حسین لله گانی
این روش بار پردازش کمتری روی سیستم اعمال میکند به علاوه روش بالا بعضی اوقات باعث کرش می شود .
https://answers.unity.com/questions/309613/calling-startcoroutine-multiple-times-seems-to-sta.html
آرمان
لینکی که قرار دادین درسته ولی دقت کنید در این آموزش تابع StartCoroutine در متد Start که فقط یکبار فراخوانی میشود صدا زده شده و فقط هم همین یک بار استفاده شده است. اما درصورتی که در متد Update که در هر فریم اجرا میشود و یا چندین بار از StartCoroutine با یک ورودی خاص استفاده کنید باید مانند لینکی که قرار دادین عمل کنیم.