در یونیتی بعضی توابع وجود دارند که با ترتیب های از پیش تعیین شده اجرا می شوند.ترتیب این اجرا رو در زیر می بینیم:

Editor

Reset:
 
این تابع یا  رویداد،زمانی اجرا می شود که اسکریپت را به گیم ابجکت متصل می کنیم و همچنین زمانی که Reset رو صدا بزنیم.

First Scene Load


Awake
این رویداد همیشه قبل از تابع Start اجرا می شود و همینطور بعد از اینکه یک prefab تکثیر یا instantiate میشه.
دقت کنید که اگه GameObject غیرفعال باشه،رویداد Awake اجرا نمیشه تا آنکه گیم ابجکت فعال بشه یا اینکه تابع در هر اسکیپت متصل شده به گیم ابجکت،فراخوانی بشه.

OnEnable

(این رویداد فقط زمانی اجرا میشه که گیم ابجکت فعال باشه)
با enable شدن گیم ابجکت،این رویداد اجرا میشه و می تونید کد دلخواه رو توش بنویسید و مثلا بگید اگه شی ،اکتیو شد فلان کد اجرا شه.

نکته :
توابع Awake و OnEnable برای تمام اسکریپت ها قبل از تابع Start و Update اجرا میشن.

 Before the first frame update(قبل از اجرای اولین محدوده زمانی)

تابع Start قبل از آپدیت اولین فریم اجرا میشه(به شرطی که اسکریپت فعال باشه)

In between frames(بین فریم ها)

OnApplicationPause
اگر بین فریم های تابع Update وقفه ای رخ بده این رویداد اجرا میشه.

Update Order(ترتیب اجرای توابع Update)

FixedUpdate:

اغلب اوقات این رویداد،بیش از رویداد Update تکرار می شود و می تواند چندین بار در هر فریم اجرا گردد.(قدرت این تابع برای مواردی هست که مثلا فیزیک خوب عمل نمی کنه یا ....). این تابع از یک تایمر یا زمانسنج قابل اعتمادتری نسبت به تابع Update بهره می برد.
Update:

در هر فریم از زمان،یک بار اجرا می شود و موثر در اجراهای فریم به فریم هست.
LateUpdate:

بعد از پایان تابع Update اجرا می شود.این تابع هم در هر فریم یه بار اجرا میشه.یکی از کاربردهای این رویداد زمانی هست که شما مثلا یک دوربین سوم شخص دارید،بعدش همه ی تنظیمات دوربین مثل چرخش یا غیره رو در این رویدد LateUpdate اجرا می کنید که بعد از انجام آخرین پردازش ها انجام بشه.این به ما این اطمینان رو میده که کاراکتر قبل از اینکه دوربین اونو دنبال کنه به طور کامل حرکت کرده.


Rendering(عملیات رندر)

  • OnPreCull: قبل از اینکه دوربین،صحنه را cull(گلچین) کند،اجرا میشه.Culling تعیین می کنه که کدوم گیم ابجکت ها باید توسط دوربین نمایش داده بشن.رویداد OnPreCull فقط قبل از culling اتفاق می افته.

  • OnBecameVisible/OnBecameInvisible:
    این رویداد ها زمانی اتفاق می افتند که یک گیم ابجکت نسبت به هر دوربینی مرعی یا نامرعی می شود.


  • OnWillRenderObject: اگر گیم ابجکت،visible (مرعی) باشد،فقط یک بار برای هر دوربین رخ می دهد.


  • OnPreRender: قبل از اینکه دوربین صحنه را رندر کند فراخوانی می شود.


  • OnRenderObject:بعد از رندر کامل صحنه به طور منظم،فراخوانی می شود. شما می توانید از کلاس GL یا Graphics یا DrawMeshNow  برای draw هندسه ی خاص در این لحظه استفاده کنید.
  • OnPostRender: بعد از اینکه دوربین،رندر صحنه را تمام کرد اجرا می شود.


  • OnRenderImage(Pro only):این رویداد،پس از تکمیل scene rendering یا تکمیل رندر صحنه،اجرا می شود تا اجازه عملیات post processing تصویر صفحه را صادر کند.(یعنی پردازش هایی پس از گرفتن عکس که باعث بهتر شدن رندر میشن)


  • OnGUI: در پاسخ به رویداد های GUI چند بار در هر فریم اجرا می شه. این تابع بر خلاف تابع Update که در هر فریم یک بار اجرا می شد،میاد و مثل fixedUpdate در هر فریم چند بار اجرا می شه و یک تابع قابل اعتماد هست. کدهای اون هم احتمالا با GPU یا هسته های کارت گرافیک اجرا میشن نه CPU ،پس به نظر می رسه بهینه تر باشه و تیک و لگ رو کمی حذف کنه ولی از طرفی ممکنه بعضی اوقات کارت گرافیک فقط پردازش هاش بالا بره پس توی کدنویسی این هم باید دقت کنید زیاد دستورات پیچیده نذارید یا اگه می ذارید دقت کنید شرط بذارید تا زیاد پیچیده نشه و فقط وقتی لازم بود دستورات پیچیده تر اجرا بشن.

           رویدادهای Layout  و Repaint ابتدا اجرا می شن و برای هر Input Event ،از یک رویداد صفحه کلید/ماوس پیروی می کنند.


  • OnDrawGizmos برای نمایش Gizmos برای اهداف بصری در نمای صحنه بکار می رود.

Coroutines(کو روتین ها)

کوروتین های معمولی پس از برگشت یا return های تابع Update اجرا می شوند.

یک کوروتین تابعی است که اجرای خودش را مسدود یا suspend می کند(در اصلاح می گیم yield) تا زمانیکه که YieldInstruction (ساختار yield)پایان یابد. از coroutine ها استفاده های متعدی می شه:

  • yield بعد از اینکه توابع Update در فریم بعدی فراخوانی شدند،coroutine ادامه یا continue داده می شه.
  • yield WaitForSeconds بعد از یک تاخیر زمانی مشخص،پس از اینکه همه ی توابع Update برای فریم،فراخوانی شدند،ادامه پیدا می کند.
  • yield WaitForFixedUpdate پس از اینکه همه ی FixedUpdate  روی تمام اسکریپت ها فراخوانی شدند،اجرا می شود.
  • yield WWW پس از اتمام دانلود توسط کلاس WWW  ادامه می یابد.
  • yield StartCoroutine کوروتین را زنجیر می کند و برای کوروتین MyFunc (تابع دلخواه من)صبر خواهد کرد تا ابتدا کامل شود.

When the Object is Destroyed(وقتی گیم ابجکت نابود شد)


  • OnDestroy: این تابع زمانی اجرا میشه که همه ی آپدیت های فریم برای آخرین فریم گیم ابجکت موجود فراخوانی شود.(ابجکت باید در پاسخ به Object.Destroy یا در اتمام یک صحنه نابود شود)

When Quitting(زمان خروج)


  • OnApplicationQuit: این تابع قبل از اینکه از اپلیکیشن خروج کنیم روی همه ی ابجکت ها فراخوانی می شود.در editor وقتی اجرا می شود که کاربر play را stop کند.در web player زمانی فراخوانی می شود که پلیر صفحه ی وب را ببندد.
  • OnDisable: وقتی اجرا می شود که گیم ابجکت یا رفتار آن disable،غیر فعال یا در اصطلاح inactive شود.

Script Lifecycle Flowchart
(فلوچارت دوره ی حیات اسکریپت)

شکل زیر ترتیب و تکرار توابع رویداد را طی دوره حیات اسکریپ،به طور خلاصه نمایش می دهد

http://s9.picofile.com/file/8268257992/monobehaviour_flowchart.png