در یونیتی بعضی توابع وجود دارند که با ترتیب های از پیش تعیین شده اجرا می شوند.ترتیب این اجرا رو در زیر می بینیم:
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:
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
(فلوچارت دوره ی حیات اسکریپت)
شکل زیر ترتیب و تکرار توابع رویداد را طی دوره حیات اسکریپ،به طور خلاصه نمایش می دهد